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

时间:2018-01-10 09:38:49

标签: python pandas matplotlib plot

我正在使用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))

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

enter image description here

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

2 个答案:

答案 0 :(得分: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)

为您提供了几种选择 -

  1. 最明显的选择是更新到最新版本的pandas(目前v0.22
  2. 如果您需要一种解决方法,那么您可以在一个额外的元组中包装参数(<问题跟踪器中也会提到) -

    dfnames.plot(x="name",  
                 y="importance", 
                 kind="bar", 
                 color=[tuple(dfnames['type'].map(colors))]
    
  3. 虽然为了进步,我建议您更新您的熊猫。

答案 1 :(得分:2)

我找到了解决问题的另一种解决方案,它确实有效!

我直接使用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()

以下是结果:

enter image description here