在熊猫中分配线条颜色
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】:试试:
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 的列按顺序排列时才对系列进行排序。【参考方案2】:这里发生了什么?
关键字参数颜色继承自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 允许用户使用几乎任何东西,但它会变得非常混乱。【参考方案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')
【讨论】:
以上是关于在熊猫中分配线条颜色的主要内容,如果未能解决你的问题,请参考以下文章