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

Jos*_*osé 4 python plot matplotlib pandas

我正在使用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"])
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个条形图,其重要性为数值,人物名称为刻度,并使用类型列指定颜色.我已经阅读了其他问题(例如:为定义的列定义Pandas/Matplotlib的条形图颜色)但它不起作用......

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

colors = {'apostel':'blue','lord':'green'}
Run Code Online (Sandbox Code Playgroud)

最后使用.plot()函数:

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

好.唯一的问题是所有的栏都是绿色的:

在此输入图像描述

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

cs9*_*s95 6

按本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)
Run Code Online (Sandbox Code Playgroud)

有几种选择 -

  1. 最明显的选择是更新到最新版本的熊猫(目前v0.22)
  2. 如果你需要一个解决方法,有一个(在问题跟踪器中也会提到)你将参数包装在一个额外的元组中 -

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

虽然为了进步,我建议你更新你的熊猫.