首页 > 解决方案 > 将大量“线条”绘制为阴影或颜色强度

问题描述

我有各种熊猫数据框,其中包含多达 2000 个时间序列。显然,一个简单的df.plot()并没有真正显示出任何有用的东西(并且需要几分钟来绘制)。但至少我可以很容易地得到(并绘制)一个(滚动的)平均值。简单的例子:

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
df = pd.DataFrame(np.random.randn(1000, 14), index=ts.index, columns=list('ABCDEFGHIJKLMN'))
mean_df = df.mean(1)
rolling_mean = mean_df.rolling(window = 60, center = True)
ax = df.plot(style=':')
rolling_mean.mean().plot(ax=ax)

在此处输入图像描述

通过这个小例子,我们可能会看到底层数据的“行为”:

它在零附近非常对称,大部分数据在 +1 和 -1 之间,相当多的数据在 +1 和 +2 之间,以及 -1 和 -2 之间,有些东西发生在 2/3 括号中,有些异常值上升(或下降)到几乎 +(-)4。

为什么很容易掌握这一点?显然,这是由于每个区域的线数,以及该区域的强度或阴影。当我去单色时变得更加清晰:

在此处输入图像描述

然而,这缺乏对密度或线数的量化。我怎样才能把它变成量化的东西?

即 2-4 括号应该有各种深浅不一的浅灰色、1-2 中灰色、0-1 深灰色,这样平均值就会放在图表中几乎黑色区域的顶部,所以我最终得到50 种灰色阴影,也许还有一个彩条。

我可能会玩弄各种深浅不一的灰色作为基色,看看设置不同的 alpha 会产生什么效果以获得更好的视觉效果,但这似乎很老套。

另一种选择是执行类似的操作max_df = df.max(1)min_df = df.min(1)然后使用 matplotlib 在 ( plt.fill_between(df.index, min_df, max_df)) 之间填充,并以某种方式对各种级别重复此操作(即,与平均值相差 1、2 和 3 个标准差),以便我以某种方式结束的连续箱线图。

但我想知道是否有更好的方法来做到这一点。

另外:我不确定如何最好地描述我想要/需要的东西,所以,如果您对此问题有任何疑问/意见,请发表评论,我会看看我可以编辑什么以使自己更清楚。

标签: pythonpandasmatplotlibdata-visualization

解决方案


另一种可视化密度数据的方法是使用核密度估计:

df.plot.kde()
plt.xlim(-4,4)
plt.grid()
plt.show()

在此处输入图像描述


推荐阅读