python - 绘制每组的列值,但颜色基于另一列
问题描述
使用如下所示的松散结构的数据框。
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 循环中逐个绘制,在循环外指定绘图句柄?
解决方案
我知道你对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()
输出:
推荐阅读
- visual-studio-code - Visual Studio Code,如何使本地文件链接打开默认程序
- python - 在Python中,如何计算多列中高于一列元素的元素数量?
- javascript - 使用 setInterval 在我的游戏中的敏感性不起作用(js)
- c# - 在 C# 测试方法中使用 for 循环生成 DataRow 参数
- android - 单击onBackPressed按钮后AppBarLayout无法显示
- python-3.x - 如何解决 workon:commnad not found for virtualenv?
- html - ngAfterViewInit 更改时,Angular 不会将值更新为 View
- ios - 当嵌套的 UITextView 开始编辑时,UICollectionView 跳转/滚动
- javascript - dataframe.js - 是否可以对分组数据框中的多列求和?
- http - 不带路径的 curl CONNECT 方法(改为目标主机名和端口)