首页 > 解决方案 > 绘制每组的列值,但颜色基于另一列

问题描述

使用如下所示的松散结构的数据框。

                                       ID  Price  ColorID
Datetime                                                 
2020-10-30 07:21:00.074000+00:00   131310  13.13        0
2020-10-30 07:21:00.485128+00:00  5250455  13.02        1
2020-10-30 07:21:00.485000+00:00   130210  13.02        0
2020-10-30 07:21:00.486000+00:00   130110  13.01        0
2020-10-30 07:21:00.486000+00:00   130310  13.03        0
2020-10-30 07:21:00.488000+00:00   130310  13.03        0 

我正在尝试绘制每个 ID 的价格进度,其中 colorID 定义了要绘制的颜色。

如果我不使用任何颜色,下面的命令会给我我正在寻找的情节,但有一个内置的配色方案,而不是我需要的..

test.groupby("ID").Price.plot(drawstyle="steps-post", marker="d", linewidth=2)

相同的 ID 将保留相同的 colorID,因此首先尝试先创建一个分组对象,然后参考该分组对象以尝试获取配色方案。

grouped = test.groupby("ID")
colors = {0: "b", 1: "r"}
grouped.Price.plot(drawstyle="steps-post", marker="d", linewidth=2, c=colors[grouped.ColorID.last()])

遇到错误:

TypeError:“系列”对象是可变的,因此它们不能被散列

而试图通过直接申请

grouped.Price.plot(drawstyle="steps-post", marker="d", linewidth=2,c=np.where(grouped.ColorID==0,"b","r"))

将尝试将颜色数组读取为 RGB 通道,从而导致

ValueError:RGBA 参数无效:array('r', dtype='<U1')

是否有一种我公然失踪的简单方法,或者我是否被委托制作多标签组或在 for 循环中逐个绘制,在循环外指定绘图句柄?

标签: pythonpandasmatplotlib

解决方案


我知道你对for循环犹豫不决,但这并不是一件坏事。它使您可以更好地控制绘图的外观。另外,我怀疑您是否使用groupby().plot().

所以一个for循环看起来像:

colors = {0: "b", 1: "r"}

grouped = test.groupby("ID")

fig, ax = plt.subplots()
for k, g in grouped:
    color = colors[g['ColorID'].iloc[0]]
    g.Price.plot(drawstyle="steps-post", marker="d", 
                 linewidth=2, c=color,
                 label=k, ax=ax)

ax.legend()

输出:

在此处输入图像描述


推荐阅读