在 Python 中基于条件绘制多色时间序列图 [重复]

Posted

技术标签:

【中文标题】在 Python 中基于条件绘制多色时间序列图 [重复]【英文标题】:Plot Multicolored Time Series Plot based on Conditional in Python [duplicate] 【发布时间】:2018-07-01 18:18:36 【问题描述】:

我有一个带有两列和一个日期时间索引的 pandas Financial timeseries DataFrame。

            TOTAL.PAPRPNT.M  Label
1973-03-01        25504.000      3
1973-04-01        25662.000      3
1973-05-01        25763.000      0
1973-06-01        25996.000      0
1973-07-01        26023.000      1
1973-08-01        26005.000      1
1973-09-01        26037.000      2
1973-10-01        26124.000      2
1973-11-01        26193.000      3
1973-12-01        26383.000      3

如您所见,每个数据集对应一个“标签”。如果从前一个“点”到下一个“点”的线具有某些特征(不同类型的股票图变化),则该标签应该基本上分类,因此对每个图使用单独的颜色。这个问题与Plot Multicolored line based on conditional in python 这个问题有关,但“groupby”部分完全跳过了我的理解,这个方案是双色方案而不是多色方案(我有四个标签)。

我想根据与数据框中每个条目关联的标签创建图形的多色图。

【问题讨论】:

您不需要 groupby,您需要按照另一个问题中 MPL 文档中的示例进行操作:matplotlib.org/examples/pylab_examples/multicolored_line.html 我也看到了,但我不明白如何将它与日期时间索引一起使用。这个特殊的 pylab 涉及使用 linspace 的数学函数。 它只是对数据使用布尔掩码/索引。您可以将其应用于数据框中的任何列。 如果您不想使用 groupby,则无需使用。我建议您尝试使用 LineCollection 实现基于 matplotlib 示例的解决方案。显示此尝试的代码,并清楚地说明您在什么时候遇到了问题。另请查看this question,它实际上使用 x 轴上的日期。再次明确说明它在多大程度上无济于事。 【参考方案1】:

这是我认为您尝试做的一个示例。它基于 cmets 中提到的 MPL 文档,并使用随机生成的数据。 只需将颜色图边界映射到由类数给出的离散值即可。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm
import pandas as pd


num_classes = 4
ts = range(10)
df = pd.DataFrame(data='TOTAL': np.random.rand(len(ts)), 'Label': np.random.randint(0, num_classes, len(ts)), index=ts)
print(df)

cmap = ListedColormap(['r', 'g', 'b', 'y'])
norm = BoundaryNorm(range(num_classes+1), cmap.N)
points = np.array([df.index, df['TOTAL']]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)

lc = LineCollection(segments, cmap=cmap, norm=norm)
lc.set_array(df['Label'])

fig1 = plt.figure()
plt.gca().add_collection(lc)
plt.xlim(df.index.min(), df.index.max())
plt.ylim(-1.1, 1.1)
plt.show()

每个线段都根据df['Label'] 中给出的类标签着色这是一个示例结果:

【讨论】:

非常感谢。上帝祝福你。有效!虽然我确实必须使用 'mdates.date2num' 将索引更改为数字,因为在您的方案中,数据框没有日期时间索引。 @DanishAmjadAlvi 不客气!很高兴我能帮上忙。

以上是关于在 Python 中基于条件绘制多色时间序列图 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用多色折线绘制谷歌地图航路点

python绘制自适应的误差图和系数图(基于logistic模型和lasso正则化)

设置多色标签栏图标而不是单色图标

UINavigationBar 中的多色后退按钮

D3浮动条形图中的多色条形图由时间计算确定

如何在ggplot2中使用多色拟合线将颜色分配给多色散点图