我正在使用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 :(得分: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)
为您提供了几种选择 -
v0.22
)如果您需要一种解决方法,那么您可以在一个额外的元组中包装参数(<问题跟踪器中也会提到) -
dfnames.plot(x="name",
y="importance",
kind="bar",
color=[tuple(dfnames['type'].map(colors))]
虽然为了进步,我建议您更新您的熊猫。
答案 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()
以下是结果: