我正在尝试根据以下数据在周x重载图中创建一个3行时间序列图,其中每个簇都是不同的行。
我对每个(Cluster,Week)对有多个观察结果(每个atm对应5个,将有1000个)。我希望该行上的点是该特定(簇,周)对的平均过载值,并且该带是它的最小/最大值。
目前使用以下代码来绘制它,但我没有得到任何行,因为我不知道使用当前数据帧指定的单位:
public class ForecastPK implements Serializable {
private Integer periodYear;
private Integer periodMonth;
private ContractPK contract;
...
}
的最终结果
答案 0 :(得分:4)
基于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)
请注意,阴影区域与折线图中的真实最大值和最小值对齐!
如果你弄清楚为什么需要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')
答案 1 :(得分: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
答案 2 :(得分:1)
我真的以为我可以用seaborn.tsplot
来做。但它看起来并不合适。这是我用seaborn得到的结果:
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)
输出:
我真的很困惑为什么unit
参数是必要的,因为我的理解是所有数据都是基于(time, condition)
聚合的Seaborn Documentation将unit
定义为< / p>
标识采样单元的数据DataFrame中的字段(例如, 主题,神经元等)。错误表示将崩溃 每个时间/条件观察单位。这在数据时没有任何作用 是一个数组。
我不确定&#39;崩溃的含义 - 特别是因为我的定义不会使其成为必需的变量。
无论如何,如果你想要完全你所讨论的内容,那么这就是输出,而不是那么漂亮。我不确定如何手动遮挡这些区域,但如果你想出来请分享。
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)