如何为secondary_y柱状图添加标签、设置ylim及ylabel?解决两类异常
Python双Y轴柱状图问题解决
问题概述
在使用Python绘制双Y轴柱状图时,需为secondary_y对应的图表添加数值标签、设置ylim及ylabel,但当前脚本存在两个问题:
- 无法为Set8和Set9两组数据添加柱状标签(bar labels);
- 无论设置何种ylim参数,Set8的数据始终超出图表显示范围。
原代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt categories = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'] data_sets = {'Set1': [0.151, 0.015, 0.110, 0.204, 0.110], 'Set2': [0.146, 0.025, 0.088, 0.151, 0.088], 'Set3': [0.161, 0.027, 0.122, 0.217, 0.122], 'Set4': [0.145, 0.015, 0.095, 0.174, 0.095], 'Set5': [0.216, 0.020, 0.160, 0.300, 0.160], 'Set6': [0.069, 0.050, 0.069, 0.088, 0.088], 'Set7': [0.069, 0.050, 0.069, 0.088, 0.088], 'Set8': [132, 131, 139, 137, 135], 'Set9': [132, 131, 139, 137, 135], } df = pd.DataFrame(data_sets, index=categories) ax = df.plot(kind= 'bar',secondary_y= 'Set9', rot= 0, ylabel = 'test', ylim = [0, .35], grid=True ) plt.ylabel('Check') for bar in ax.containers: ax.bar_label(bar, rotation=90) fig = ax.get_figure() ax = fig.get_axes() ax[1].set_ylim(0, 200)
问题原因与修正方案
- Set8/Set9标签不显示:原代码仅遍历主Y轴容器,Set8属于主Y轴、Set9属于次Y轴,需分别处理两个轴的容器。
- Set8数据超出范围:原代码仅将Set9指定到次Y轴,Set8仍在主Y轴,但主Y轴ylim设为
[0, 0.35],与Set8的130+数值不匹配,导致超出显示。需将Set8和Set9都指定到次Y轴。
修正后的代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt categories = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'] data_sets = {'Set1': [0.151, 0.015, 0.110, 0.204, 0.110], 'Set2': [0.146, 0.025, 0.088, 0.151, 0.088], 'Set3': [0.161, 0.027, 0.122, 0.217, 0.122], 'Set4': [0.145, 0.015, 0.095, 0.174, 0.095], 'Set5': [0.216, 0.020, 0.160, 0.300, 0.160], 'Set6': [0.069, 0.050, 0.069, 0.088, 0.088], 'Set7': [0.069, 0.050, 0.069, 0.088, 0.088], 'Set8': [132, 131, 139, 137, 135], 'Set9': [132, 131, 139, 137, 135], } df = pd.DataFrame(data_sets, index=categories) # 将Set8和Set9都指定到次Y轴,同时获取主、次轴对象 ax_main, ax_secondary = df.plot(kind='bar', secondary_y=['Set8', 'Set9'], rot=0, ylabel='test', ylim=[0, .35], grid=True) # 设置次Y轴的标签和范围 ax_secondary.set_ylabel('Check') ax_secondary.set_ylim(0, 200) # 为主Y轴柱状图添加数值标签 for bar in ax_main.containers: ax_main.bar_label(bar, rotation=90) # 为次Y轴柱状图添加数值标签 for bar in ax_secondary.containers: ax_secondary.bar_label(bar, rotation=90) plt.show()
关键修正点说明
- 批量指定次Y轴数据:将
secondary_y='Set9'改为secondary_y=['Set8', 'Set9'],让两组大数值数据都使用次Y轴,避免与主Y轴小数值范围冲突。 - 直接获取双轴对象:利用
df.plot的返回值直接接收主、次轴对象,无需通过fig.get_axes()间接获取,逻辑更清晰。 - 分别处理双轴标签:遍历主、次轴各自的柱状容器,为两组数据都添加上数值标签。
- 精准设置次Y轴属性:直接通过次轴对象设置ylabel和ylim,确保参数生效。
内容的提问来源于stack exchange,提问作者shoggananna
相关产品推荐
相关产品推荐

