【问题标题】:Plotting a large number of "lines" as shading or color intensity将大量“线条”绘制为阴影或颜色强度
【发布时间】:2018-05-24 12:29:36
【问题描述】:

我有各种 pandas 数据帧,其中包含多达 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 个标准差之外)重复此操作从平均数),所以我会以某种连续的箱线图结束。

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

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

【问题讨论】:

标签: python pandas matplotlib data-visualization


【解决方案1】:

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

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

【讨论】:

  • 这当然是一个有用的内置功能,但遗憾的是,这不是我想要的,因为我不仅需要总体上的数据分布,还需要每个任意时间点的分布。因此,即使我按月解决,这种方法也需要 33 个图作为示例,约 700 个图用于我的真实数据,这让我回到了起点,即图相当混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多