在 Pandas v0.20 和 matplotlib 中为条形分配颜色的问题

Posted

技术标签:

【中文标题】在 Pandas v0.20 和 matplotlib 中为条形分配颜色的问题【英文标题】:Problems assigning color to bars in Pandas v0.20 and matplotlib 【发布时间】:2018-06-19 10:35:01 【问题描述】:

我在使用 Pandas 和 Matplotlib 在条形图中定义颜色方面苦苦挣扎了一段时间。让我们假设我们有以下数据框:

import pandas as pd
pers1 = ["Jesús","lord",2]
pers2 = ["Mateo","apostel",1]
pers3 = ["Lucas","apostel",1]
    
dfnames = pd.DataFrame(
    [pers1,pers2, pers3],
    columns=["name","type","importance"]
)

现在,我想创建一个条形图,其中重要性为数值,人名为刻度,并使用类型列分配颜色。我已经阅读了其他问题(例如:Define bar chart colors for Pandas/Matplotlib with defined column)但它不起作用...

所以,首先我必须定义颜色并将它们分配给不同的值:

colors = 'apostel':'blue','lord':'green'

最后使用 .plot() 函数:

dfnames.plot(
    x="name",
    y="importance",
    kind="bar",
    color = dfnames['type'].map(colors)
)

很好。唯一的问题是所有的条都是绿色的:

为什么?我不知道...我正在 Spyder 和 Jupyter 中对其进行测试...有什么帮助吗?谢谢!

【问题讨论】:

你的熊猫版本是什么?我没有对此进行测试,但如果我没记错的话,有一个与此相关的错误。 在 0.19.1 上为我工作 0.20.3。我想我应该更新? @José 我已经提到了两种选择。请尝试第二个,让我知道它是否有效,然后再更新。谢谢。 你是对的,这是一个错误。当然,我倾向于认为问题出在我的代码中。谢谢! 【参考方案1】:

我为您的问题找到了另一种解决方案,并且有效!

我直接使用 matplotlib 库而不是使用数据框的 plot 属性: 这是代码:

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline # for jupyter notebook

pers1 = ["Jesús","lord",2]
pers2 = ["Mateo","apostel",1]
pers3 = ["Lucas","apostel",1]

dfnames = pd.DataFrame([pers1,pers2, pers3], columns=["name","type","importance"])

fig, ax = plt.subplots()
bars = ax.bar(dfnames.name, dfnames.importance)


colors = 'apostel':'blue','lord':'green'

for index, bar in enumerate(bars) :
    color = colors.get(dfnames.loc[index]['type'],'b') # get the color key in your df
    bar.set_facecolor(color[0])
plt.show()

这是结果:

【讨论】:

【参考方案2】:

根据GH16822,这是0.20.3 版本中引入的回归错误,其中仅选择了第一个颜色从通过的颜色列表中。这不是以前版本的问题。

根据其中一位贡献者的说法,原因是 -

问题似乎出在_get_colors。我认为BarPlot 应该 定义一个 _get_colors 来做类似的事情

def _get_colors(self, num_colors=None, color_kwds='color'):
    color = self.kwds.get('color')
    if color is None:
        return super()._get_colors(self, num_colors=num_colors, color_kwds=color_kwds)
    else:
        num_colors = len(self.data)  # maybe? may not work for some cases
        return _get_standard_colors(color=kwds.get('color'), num_colors=num_colors)

有几个选项供您选择 -

    最明显的选择是更新到最新版本的 pandas(当前为 v0.22

    如果您需要一种解决方法,可以使用一种解决方法(在问题跟踪器中也提到过),您可以将参数包装在一个额外的元组中 -

    dfnames.plot(x="name",  
                 y="importance", 
                 kind="bar", 
                 color=[tuple(dfnames['type'].map(colors))]
    

不过,为了进步,我建议更新你的熊猫。

【讨论】:

以上是关于在 Pandas v0.20 和 matplotlib 中为条形分配颜色的问题的主要内容,如果未能解决你的问题,请参考以下文章

Numpy+Pandas+Matplotlib学习

Numpy+Pandas+Matplotlib学习

如何在 RestKit v0.20.0 中设置 serviceUnavailableAlertEnabled

对于使用 RestKit v0.20.0 的键 Text,此类不符合键值编码

[译]基于ASP.NET Core 3.0的ABP v0.21已发布

如何判断 RestKit v0.20.2 是不是提供了实体缓存的结果?