一尘不染

在pandas中分配线条颜色

python

我试图在熊猫中绘制一些数据,并且内置的绘图功能可以方便地在每列中绘制一行。我要做的是根据我进行的分类为每行手动分配颜色。

以下作品:

df = pd.DataFrame({'1': [1, 2, 3, 4], '2': [1, 2, 1, 2]})
s = pd.Series(['c','y'], index=['1','2'])
df.plot(color = s)

但是,当我的索引是整数时,它将不再起作用并抛出为KeyError:

df = pd.DataFrame({1: [1, 2, 3, 4], 2: [1, 2, 1, 2]})
s = pd.Series(['c','y'], index=[1,2])
df.plot(color = s)

我的理解是,当使用整数索引时,它必须以某种方式从0开始。这是我的猜测,因为以下内容同样适用:

df = pd.DataFrame({0: [1, 2, 3, 4], 1: [1, 2, 1, 2]})
s = pd.Series(['c','y'], index=[1,0])
df.plot(color = s)

我的问题是:

  • 这是怎么回事
  • 假设我有一个不是从0开始或不是由连续数字组成的整数索引,那么我如何进行这项工作而不必将索引转换为从0开始的字符串或重新索引?

编辑:

我意识到即使在第一种情况下,代码也无法实现我期望的功能。似乎pandas仅在两者都是从0开始的整数索引时才匹配DataFrame和Series的索引。如果不是,则抛出KeyError,或者如果索引为str则使用元素的顺序。

这个对吗?有没有办法匹配Series和DataFrame索引?还是必须确保以正确的顺序传递颜色列表?


阅读 391

收藏
2021-01-20

共1个答案

一尘不染

这是怎么回事

关键字参数color继承自matplotlib.pyplot.plot()。文档中的详细信息并未明确指出在打印时可以放入颜色列表。鉴于color是matplotlib的关键字参数,我建议不要使用Pandas
Series来保存颜色值。

我该如何工作?

使用列表而不是系列。如果您使用的系列的索引旨在使DataFrame的列与特定颜色匹配,则需要首先对系列进行排序。如果列不按顺序排列,则还需要对列进行排序。

# Option 1
s = s.sort_index()
df.plot(color = s.values) # as per Fiabetto's answer

# Option 2
df.plot(color = ['c', 'y']) # other method
2021-01-20