我在使用 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 中测试它……有什么帮助吗?谢谢!
最佳答案
根据这个GH16822 ,这是版本 0.20.3
中引入的回归错误,其中只有第一个颜色是从通过的颜色列表。这不是以前版本的问题。
根据一位贡献者的说法,原因是这样的——
The problem seems to be in
_get_colors
. I think thatBarPlot
should define a_get_colors
that does something likedef _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。
关于python - 在 Pandas v0.20 和 matplotlib 中为条形分配颜色的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48184332/