Matplotlib堆叠柱状图bar_label零值显示问题解决及配色优化咨询
问题1:过滤bar_label零值标签的解决方法
你可以通过bar_label的labels参数自定义显示内容,仅对数值大于0的分段显示标签,零值对应位置设为空字符串即可,修改原有标签添加部分的代码如下:
# 修改后的添加标签代码 for c in ax.containers: # 仅对高度大于0的条形显示数值,零值显示空 labels = [f'{val}' if val > 0 else '' for val in c.datavalues] ax.bar_label(c, labels=labels, label_type="center")
额外优化建议:你当前的原始数据里存在大量全为0的分组,可以先过滤掉这些没有任何数值的分组再绘图,大幅减少堆叠层数,也能解决图例过于冗长的问题,过滤代码参考:
# 过滤全零分组 dist_lst = [item for item in dist_lst if sum(item) > 0]
问题2:堆叠柱状图配色方案推荐
针对你这种多分类堆叠场景,推荐两个高可读性的配色方案:
- 不想引入额外依赖,可直接使用Matplotlib自带的
tab20/tab20b/tab20c系列分类调色板,是官方专门为多分类场景设计,相邻颜色区分度高,无过亮/过暗的问题,20种颜色不够的话可以拼接两个系列调色板使用。调用方式:import matplotlib.pyplot as plt colors = plt.cm.get_cmap('tab20', len(dist_lst)).colors - 可以引入seaborn的
husl调色板,能根据你的分类数量自动生成色相均匀分布的颜色,饱和度和亮度默认适配可视化场景,区分度优于普通分类调色板,调用方式:import seaborn as sns colors = sns.color_palette("husl", len(dist_lst))
内容的提问来源于stack exchange,提问作者N.C.C.P.
相关产品推荐
相关产品推荐

