解决Matplotlib条形图单条多色问题:按集群设置单一颜色
问题解决:Matplotlib条形图按集群设置单一颜色
问题描述
我尝试为图表中的每个条形设置独立颜色,所用代码如下。但未实现每个集群对应单一颜色,反而每个条形内部出现多种颜色(已附截图)。Clusters是包含0至4共5组的分类变量,已附数据框截图。我想绘制经济意识形态和社会意识形态两个子图,对比5个集群在这两个维度的差异,每个集群对应一种颜色(例如cluster 0为红色)。尝试过直接传入颜色值也无效,请问该如何解决?
原代码
c = ['#bf1111', '#1c4975', '#278f36', '#47167a', '#de8314'] plt.subplot(1, 2, 1) plt.bar(data = ANESdf_LatNEW, height = "EconIdeo", x = "clusters", color = c) plt.title('Economic Ideology') plt.xticks([0, 1, 2, 3, 4]) plt.xlabel('Clusters') plt.ylabel('') plt.subplot(1, 2, 2) plt.bar(data = ANESdf_LatNEW, height = "SocialIdeo", x = "clusters", color = c) plt.title('Social Ideology') plt.xticks([0, 1, 2, 3, 4]) plt.xlabel('Clusters') plt.ylabel('') plt.show()
当前效果截图

数据集前5行截图

问题原因
直接使用原始数据集绘图时,每个clusters分组下包含多个样本数据,plt.bar会为每个样本单独绘制一个小条形,这些小条形堆叠在一起,就呈现出“单条多色”的效果。
解决方案
先对每个集群的指标值做聚合(比如均值、中位数等),得到每个集群对应一个数值的结果,再用聚合后的数据绘图,此时每个集群对应一个条形,传入颜色列表即可实现单条单色。
修改后的代码
import matplotlib.pyplot as plt import pandas as pd # 定义集群对应颜色 c = ['#bf1111', '#1c4975', '#278f36', '#47167a', '#de8314'] # 按clusters分组,计算每个集群的意识形态均值 cluster_agg = ANESdf_LatNEW.groupby('clusters')[['EconIdeo', 'SocialIdeo']].mean().reset_index() # 设置画布大小,优化显示效果 plt.figure(figsize=(12, 5)) # 绘制经济意识形态子图 plt.subplot(1, 2, 1) plt.bar(x=cluster_agg['clusters'], height=cluster_agg['EconIdeo'], color=c) plt.title('Economic Ideology') plt.xticks([0, 1, 2, 3, 4]) plt.xlabel('Clusters') plt.ylabel('Mean Value') # 绘制社会意识形态子图 plt.subplot(1, 2, 2) plt.bar(x=cluster_agg['clusters'], height=cluster_agg['SocialIdeo'], color=c) plt.title('Social Ideology') plt.xticks([0, 1, 2, 3, 4]) plt.xlabel('Clusters') plt.ylabel('Mean Value') # 自动调整子图间距,避免元素重叠 plt.tight_layout() plt.show()
可选调整
- 若需要其他聚合逻辑,将
.mean()替换为.median()(中位数)、.sum()(总和)等即可 - 可以根据需求修改
figsize参数调整画布大小
内容的提问来源于stack exchange,提问作者strangledbypython
相关产品推荐
相关产品推荐

