在 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 中为条形分配颜色的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 RestKit v0.20.0 中设置 serviceUnavailableAlertEnabled
对于使用 RestKit v0.20.0 的键 Text,此类不符合键值编码