如何为堆叠条形图中特定的'None'分组分配自定义颜色
解决堆叠条形图中单独设置'None'合并症的颜色问题
问题分析
你之前的尝试失败原因:
- 尝试1:pandas的堆叠条形图
color参数是给每一列指定统一颜色,而非给每行的堆叠块单独传颜色列表,所以传入二维列表会触发格式错误。 - 尝试2:循环里每次都直接覆盖
colors变量,最终只会保留最后一个合并症对应的颜色,导致所有块都用默认色。
正确实现代码
要实现指定行的堆叠块单独变色,需要手动用matplotlib绘制每个堆叠部分,而非依赖pandas的plot直接传color参数:
import matplotlib.pyplot as plt from matplotlib.patches import Patch # 你的原有数据处理部分保持不变 comorbidity_counts_by_gender = df.groupby('sex_female')[comorbidity_columns].sum() comorbidity_counts_by_gender = comorbidity_counts_by_gender[comorbidity_counts_by_gender.sum().sort_values(ascending=True).index].T # 定义颜色规则:None项用特殊色,其他用默认色 color_rules = { 'None': ('royalblue', 'lightcoral'), # (男性颜色, 女性颜色) 'default': ('lightskyblue', 'pink') } y_positions = range(len(comorbidity_counts_by_gender)) bar_width = 0.8 fig, ax = plt.subplots(figsize=(8, 8)) # 绘制男性的堆叠条形(左侧) male_values = comorbidity_counts_by_gender.iloc[:, 0] male_colors = [color_rules.get(idx, color_rules['default'])[0] for idx in comorbidity_counts_by_gender.index] ax.barh(y_positions, male_values, bar_width, color=male_colors) # 绘制女性的堆叠条形(右侧,基于男性条形的宽度堆叠) female_values = comorbidity_counts_by_gender.iloc[:, 1] female_colors = [color_rules.get(idx, color_rules['default'])[1] for idx in comorbidity_counts_by_gender.index] ax.barh(y_positions, female_values, bar_width, left=male_values, color=female_colors) # 配置图表元素 ax.set_yticks(y_positions) ax.set_yticklabels(comorbidity_counts_by_gender.index) ax.set_title('Distribution of Comorbidities by Gender') ax.set_xlabel('Count') ax.set_ylabel('') # 自定义图例,区分常规性别色和None项的特殊色 legend_elements = [ Patch(facecolor='lightskyblue', label='Male'), Patch(facecolor='pink', label='Female'), Patch(facecolor='royalblue', label='Male (No Comorbidity)'), Patch(facecolor='lightcoral', label='Female (No Comorbidity)') ] ax.legend(handles=legend_elements, title='Gender & Status', loc="upper left", bbox_to_anchor=(1, 1), frameon=False) plt.show()
代码说明
- 手动拆分男性和女性的数值,分别为每个合并症匹配对应颜色;
- 女性条形通过
left参数基于男性条形的宽度实现堆叠; - 自定义图例清晰区分常规性别颜色和无合并症的特殊颜色,符合你突出'None'项的需求。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

