Matplotlib 条形图每个条的颜色不同

3

我想创建一个简单的水平条形图,但我想让每个条形图使用团队的颜色来装饰它。我以为只要将每个团队的十六进制颜色作为数组传递到颜色参数中就可以了,但是我得到的结果是每个条形图都显示为数组中提供的第一种颜色。

data.plot(kind="barh", color=['#A71930', '#DF4601', '#AB0003', '#003278', '#FF5910', '#0E3386', '#BA0021', '#E81828', '#473729', '#D31145', '#0C2340', '#005A9C', '#BD3039', '#EB6E1F', '#C41E3A', '#33006F', '#C6011F', '#004687', '#CE1141', '#134A8E', '#27251F', '#FDB827', '#0C2340', '#FD5A1E', '#00A3E0', '#ffc52f', '#003831', '#005C5C', '#E31937', '#8FBCE6'])
plt.title('Team Ranking Marginal Doller Spent per Marginal Win')
plt.ylabel('Team')
plt.xlabel('Marginal Doller Spent per Marginal Win')
plt.style.use('fivethirtyeight')
plt.gcf().set_size_inches(10, 12)
plt.show()

这是结果:

这里是结果 在这里输入图片描述


1
你正在使用pandas的绘图功能。颜色是针对数据框中每个列的,显然只有一列。(你似乎忘记在帖子中添加测试数据了。)你可以尝试使用seaborn的条形图代替:sns.barplot(x=data.iloc[:,0], y=data.index, palette=['#A71930', '#DF4601', ...')(此示例使用.iloc作为测试数据)。 - JohanC
此外,您可以只绘制一个列而不是整个数据框。在这种情况下,颜色将用于各个条形图。data.iloc[:,0].plot(kind="barh", color=['#A71930', '#DF4601', '#AB0003', '#003278', ...])(如果您知道列名,则为 data[' column name'].plot(...))。 - JohanC
1
在创建可视化时,除非它有助于传达信息,否则不应该“装饰”。如果条形图的颜色不传达信息,则绘图条应为单一颜色,否则您只会增加混乱,并混淆可视化的信息。 - Trenton McKinney
1个回答

3

看起来你正在使用pandas绘图,它返回一个axis对象。你可以通过迭代patches来修改每个条形图的颜色:

colors=['#A71930', '#DF4601', '#AB0003', '#003278', '#FF5910', '#0E3386', '#BA0021', '#E81828', '#473729', '#D31145', '#0C2340', '#005A9C', '#BD3039', '#EB6E1F', '#C41E3A', '#33006F', '#C6011F', '#004687', '#CE1141', '#134A8E', '#27251F', '#FDB827', '#0C2340', '#FD5A1E', '#00A3E0', '#ffc52f', '#003831', '#005C5C', '#E31937', '#8FBCE6']
ax=data.plot(kind='barh')
for patch,color in zip(ax.patches,colors):
    patch.set_facecolor(color)

这有点绕,但是学会如何访问pandas生成的图形非常好用,因为内置函数可能无法满足需求。

(在评论中,有人说变量名很丑,因此进行了编辑)


1
Pandas的.plot返回一个ax,而不是一个图形。(ax.axesax将是相同的子图对象)。请注意,data[...column name....].plot(kind='barh', colors=...)似乎更简单一些。 - JohanC
True pandas 返回一个 axes.subplot,但是补丁仍然以相同的方式访问。我测试了我的代码,它可以工作。我测试了 data[...列名...].plot(kind='barh', colors=...),它返回了 'Rectangle' 对象没有属性 'colors' - researchgrant
1
你的代码可以运行,但是将返回值命名为 fig 是一个不好的想法。请注意,如果它是一个 figure,你需要使用 fig.axes[0].patches 来访问条形图。正确的访问方式应该是 ax = data.plot(...)ax.patches。(现在你正在使用 ax.axes.patches,这只能工作是因为 axax.axes 是相同的 subplot。)我在调用 .plot 时犯了一个小错误(在列上而不是在数据框上),应该是 data[...column name....].plot(kind='barh', color=...),使用 color 而不是 colors - JohanC
正如我之前所说,你对返回对象的正确性是正确的。然而,你的建议仍然无法实现,因为它将所有条形图设置为列表中的第一种颜色。 - researchgrant
当使用series(即数据框的一列,不要与只有一列的数据框混淆)时,color=可以为每个条形图设置单独的颜色。但是,请编辑您的答案并将那个丑陋的fig = data.plot(...)替换为ax = ... - JohanC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接