2016-06-11 2 views
5

Я пытаюсь создать трехстрочный график временных рядов на основе следующих данных Long Dataframe, в графе перегрузки недели x, где каждый кластер представляет собой другую строку.Временная диаграмма с минимальным/максимальным затенением с использованием Seaborn

У меня есть несколько наблюдений для каждой пары (кластер, неделя) (5 для каждого атм, будет 1000). Я хотел бы, чтобы точки на линии были средним значением перегрузки для этой конкретной пары (Cluster, Week), а диапазон был минимальным/максимальным значением.

В настоящее время используется следующий фрагмент кода, чтобы построить его, но я не получаю никаких линий, так как я не знаю, что устройство для определения с использованием текущего dataframe:

ax14 = sns.tsplot(data = long_total_cluster_capacity_overload_df, value = "Overload", time = "Week", condition = "Cluster") 

GIST Data

У меня такое чувство, что мне все еще нужно переформировать мой фрейм, но я понятия не имею, как это сделать. Глядя на окончательные результаты, что выглядит как этот enter image description here

+0

Лучшее, что я мог придумать до сих пор использует sns.pointplot и получить это: https://gyazo.com/425b31b23f9d5009c12502f3113361ef –

+0

честно, то, что сюжет не совсем то, что вы ищете для? хотите ли вы, чтобы межстрочное затенение было меньше, а граничные линии были темнее? –

+0

Это похоже на то, что я ищу, но если я его расширю, это фактические доверительные интервалы (вертикальные линии для каждой точки), а не непрерывные таймеры, так сказать. И да, я хотел бы, чтобы межстрочное затенение было меньше. –

ответ

3

Основы this incredible answer, я был в состоянии создать обезьяну патч красиво делать то, что вы ищете.

import pandas as pd 
import seaborn as sns  
import seaborn.timeseries 

def _plot_range_band(*args, central_data=None, ci=None, data=None, **kwargs): 
    upper = data.max(axis=0) 
    lower = data.min(axis=0) 
    #import pdb; pdb.set_trace() 
    ci = np.asarray((lower, upper)) 
    kwargs.update({"central_data": central_data, "ci": ci, "data": data}) 
    seaborn.timeseries._plot_ci_band(*args, **kwargs) 

seaborn.timeseries._plot_range_band = _plot_range_band 

cluster_overload = pd.read_csv("TSplot.csv", delim_whitespace=True) 
cluster_overload['Unit'] = cluster_overload.groupby(['Cluster','Week']).cumcount() 

ax = sns.tsplot(time='Week',value="Overload", condition="Cluster", unit="Unit", data=cluster_overload, 
       err_style="range_band", n_boot=0) 

Выходной График: enter image description here

Обратите внимание, что заштрихованные области выстраиваться с истинным максимумом и минимумов в линейном графике!

Если вы считаете, почему переменная unit обязательна, свяжитесь со мной.


Если вы не хотите их все на одном графике, то:

import pandas as pd 
import seaborn as sns 
import seaborn.timeseries 


def _plot_range_band(*args, central_data=None, ci=None, data=None, **kwargs): 
    upper = data.max(axis=0) 
    lower = data.min(axis=0) 
    #import pdb; pdb.set_trace() 
    ci = np.asarray((lower, upper)) 
    kwargs.update({"central_data": central_data, "ci": ci, "data": data}) 
    seaborn.timeseries._plot_ci_band(*args, **kwargs) 

seaborn.timeseries._plot_range_band = _plot_range_band 

cluster_overload = pd.read_csv("TSplot.csv", delim_whitespace=True) 
cluster_overload['subindex'] = cluster_overload.groupby(['Cluster','Week']).cumcount() 

def customPlot(*args,**kwargs): 
    df = kwargs.pop('data') 
    pivoted = df.pivot(index='subindex', columns='Week', values='Overload') 
    ax = sns.tsplot(pivoted.values, err_style="range_band", n_boot=0, color=kwargs['color']) 

g = sns.FacetGrid(cluster_overload, row="Cluster", sharey=False, hue='Cluster', aspect=3) 
g = g.map_dataframe(customPlot, 'Week', 'Overload','subindex') 

Который производит следующее (можно, очевидно, играть с соотношением сторон, если вы думаете, что пропорции выключены) enter image description here

+0

Большое спасибо за вашу помощь, это прекрасно работает! Что касается подразделения, я создам еще много похожих сюжетов для моего текущего проекта, и если я выясню, почему «единица» является обязательной, я вернусь к вам. –

+0

Я думаю, что второй сюжет намного лучше. Отличная работа. – Romain

+0

Спасибо за обновление! Я надеюсь, что и другие считают это полезным. –

1

Я действительно думал, что я мог бы сделать это с seaborn.tsplot. Но это не совсем правильно. Вот результат я получаю с Сиборном:

cluster_overload = pd.read_csv("TSplot.csv", delim_whitespace=True) 
cluster_overload['Unit'] = cluster_overload.groupby(['Cluster','Week']).cumcount() 
ax = sns.tsplot(time='Week',value="Overload", condition="Cluster", ci=100, unit="Unit", data=cluster_overload) 

Выходов:

enter image description here

Я действительно запутался, почему параметр unit необходим, так как я понимаю, что все данные агрегируются на основе на (time, condition)Seaborn Documentation определяет unit, как

Field in the data DataFrame identifying the sampling unit (e.g. subject, neuron, etc.). The error representation will collapse over units at each time/condition observation. This has no role when data is an array.

Я не будучи уверенным в значении «рушится», особенно потому, что мое определение не станет обязательной переменной.

В любом случае, вот вывод, если вы хотите точно то, что вы обсуждали, не так красиво. Я не уверен, как вручную затенять в этих регионах, но, пожалуйста, поделитесь, если вы это выясните.

cluster_overload = pd.read_csv("TSplot.csv", delim_whitespace=True) 
grouped = cluster_overload.groupby(['Cluster','Week'],as_index=False) 
stats = grouped.agg(['min','mean','max']).unstack().T 
stats.index = stats.index.droplevel(0) 

colors = ['b','g','r'] 
ax = stats.loc['mean'].plot(color=colors, alpha=0.8, linewidth=3) 
stats.loc['max'].plot(ax=ax,color=colors,legend=False, alpha=0.3) 
stats.loc['min'].plot(ax=ax,color=colors,legend=False, alpha=0.3) 

Выходов: enter image description here

4

Я, наконец, использовал старый добрый plot с дизайном (подзаголовками), который кажется мне более удобочитаемым.

df = pd.read_csv('TSplot.csv', sep='\t', index_col=0) 
# Compute the min, mean and max (could also be other values) 
grouped = df.groupby(["Cluster", "Week"]).agg({'Overload': ['min', 'mean', 'max']}).unstack("Cluster") 

# Plot with sublot since it is more readable 
axes = grouped.loc[:,('Overload', 'mean')].plot(subplots=True) 

# Getting the color palette used 
palette = sns.color_palette() 

# Initializing an index to get each cluster and each color 
index = 0 
for ax in axes: 
    ax.fill_between(grouped.index, grouped.loc[:,('Overload', 'mean', index + 1)], 
        grouped.loc[:,('Overload', 'max', index + 1)], alpha=.2, color=palette[index]) 
    ax.fill_between(grouped.index, 
        grouped.loc[:,('Overload', 'min', index + 1)] , grouped.loc[:,('Overload', 'mean', index + 1)], alpha=.2, color=palette[index]) 
    index +=1 

enter image description here

+0

Большое спасибо за это, я тоже сделаю с ним подобный, и проконсультируйтесь с моим руководителем, посмотрим, с кем мы согласны. Быстрый вопрос относительно этого: по какой-то причине при использовании DF, хранящегося в памяти, он не будет работать. получение KeyError: («Перегрузка», «среднее», 1). Однако, если я сохраню его в csv, то повторно импортируйте его с помощью параметра index_col = 0, он работает. Любая идея, почему это происходит? Еще раз спасибо. –

+0

Спасибо за ваш комментарий, я уверен, что ваш руководитель будет на моей стороне ;-). Расскажи мне ! Не знаю, как «DataFrame» хранится в памяти, так как я не могу воспроизвести проблему. Он не связан с индексом, так как пример может работать без 'index_col = 0'. Я думаю, вы должны проверить (распечатать) «DataFrame», хранящиеся в памяти. – Romain

+0

У меня есть несколько раз, как с помощью операторов печати, так и в PyCharm. Я определенно пропускаю что-то, но я едва могу понять выход PyCharm https://gyazo.com/1a362bd8f2031f9bb88bed386888e7b6 (DF считывается из CSV, DF1 - это тот, который хранится в памяти). Это очень странно, как будто я сохраняю его и загружаю его снова (используя delim = ',' и col_index = 0 в качестве параметров), он работает ... Я вернусь к вам завтра вечером, чтобы вы знали, Граф мой руководитель думал лучше! Спасибо еще раз за помощь. –

Смежные вопросы