【问题标题】:Plotting column values per group, but with a color based on another column绘制每组的列值,但颜色基于另一列
【发布时间】:2020-11-10 16:37:42
【问题描述】:

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

                                       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: 'Series' 对象是可变的,因此它们不能被散列

而试图通过直接申请

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

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

ValueError:无效的 RGBA 参数:array('r', dtype='

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

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    我知道你对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()
    

    输出:

    【讨论】:

    • 你可能是对的,无论如何在内部使用了一个 for 循环,我应该在我自己的控制下明确地使用它,而不是在引擎盖下。谢谢。
    • 然而,以子图方式执行此操作的一个问题是,如果我想在图中检查我正在查看的 ID,我无法真正进行悬停注释。跨度>
    • @Uvar 这只是我常用的绘图方式。可以跳过所有subplots相关代码。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2022-01-17
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多