在熊猫中分配线条颜色

Posted

技术标签:

【中文标题】在熊猫中分配线条颜色【英文标题】:Assign line colors in pandas 【发布时间】:2015-12-08 03:32:50 【问题描述】:

我正在尝试在 pandas 中绘制一些数据,并且内置的绘图功能可以方便地每列绘制一条线。我想要做的是根据我所做的分类手动为每条线分配颜色。

以下作品:

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 开始重新索引的情况下完成这项工作?

编辑:

我意识到,即使在第一种情况下,代码也没有达到我的预期。 似乎只有当 DataFrame 和 Series 的索引都是从 0 开始的整数索引时,pandas 才匹配索引。如果不是这种情况,则会抛出 KeyError 或者如果索引是 str 则使用元素的顺序。

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

【问题讨论】:

您不希望索引匹配。您正在将 Series 的索引与 DataFrame 的列匹配。 【参考方案1】:

这里发生了什么?

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

我怎样才能完成这项工作?

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

# 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

【讨论】:

我最终对 Series 和 DataFrame 进行了排序,然后按照建议将 Series 转换为列表。这没有问题,但我希望有一种更优雅的方式,但我可以看到如果 color 关键字对应于 matplotlibs (显然对系列一无所知),那不可能。 是的,不幸的是,Pandas 只是 matplotlib 的包装器。 matplotlib 允许用户使用几乎任何东西,但它会变得非常混乱。【参考方案2】:

试试:

df.plot(color = s.values)

无论索引的比例如何,这都会分配颜色。

编辑:

我尝试了三列:

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

并对其工作的系列进行排序。

【讨论】:

这确实有效,但我意识到实际问题似乎是顺序。我将编辑问题以包含它! 仅在 DataFrame 的列按顺序排列时才对系列进行排序。【参考方案3】:

要为每条线设置颜色,您可以使用参数style。例如:

df = pd.DataFrame('A': [1, 2, 4], 'B': [1, 3, 9])
df.plot(style='A': 'r', 'B': 'g')

使用 marker|line|color 形式的shortcut string notation,您还可以设置标记和线条类型:

df = pd.DataFrame('A': [1, 2, 4], 'B': [1, 3, 9])
df.plot(style='A': '*:r', 'B': '+--g')

【讨论】:

绝对是最有用的答案。

以上是关于在熊猫中分配线条颜色的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2没有在图例值中分配颜色

在 Swift 中的同一个 mapView 中分配多个注释 pinColors?

如何在熊猫 df 列中分配列表值?

如何自动从熊猫表中分配变量?

如何在循环Django中分配外键

当使用洪水填充算法填充颜色后绘制线条时,填充颜色消失