Matplotlib:添加所有柱状图后调整堆叠柱状图的z-order
问题:Matplotlib堆叠柱状图动态调整单根柱子的zorder
在使用matplotlib.pyplot绘制堆叠柱状图时,通过plot.bar()批量添加一组柱子时,仅支持为整组设置单个整数类型的zorder参数,无法传入类数组值来为每根柱子单独指定zorder——但这恰恰是更贴合需求的方式。
我的图表包含多组堆叠数据,需要实现:每个x轴位置的柱子,zorder根据该位置柱子的高度动态调整。否则高柱子会遮挡矮柱子,完全失去堆叠柱状图的展示意义。
虽然可以通过逐个添加柱子的方式单独设置zorder,但这种方式会带来诸多额外问题:
批量添加一组柱状图的代码:
plot.bar(label_list, height_list, zorder = should_not_be_the_same_for_every_bar)
逐个添加柱状图的代码:
for label, height in zip(label_list, height_list): plot.bar(label, height, zorder = here_it_can_be_specified_per_bar)
有没有办法避免繁琐的逐个添加方式,直接遍历已添加到图表中的柱状图,单独修改每根柱子的zorder?
解决方案(由JohanC提供)
可以通过遍历图表容器中的柱子,按高度排序后单独设置zorder:
for bars in zip(*axes.containers): z = len(bars) for bar in sorted(bars, key = lambda x : x.get_height()): bar.set_zorder(z) z -= 1
这段代码的逻辑是:
- 遍历每个x轴位置对应的所有堆叠柱子(
zip(*axes.containers)会把同一x位置的不同组柱子打包到一起) - 对每个位置的柱子按高度排序,给最高的柱子设置最高的zorder,依次递减,确保高柱子始终显示在最上层,不会遮挡矮柱子。
注:本问题及解决方案未使用seaborn模块,与仅能通过seaborn实现的类似问题不重复。
内容的提问来源于stack exchange,提问作者Byron Hawkins
相关产品推荐
相关产品推荐

