You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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)

问题原因与修正方案

  1. Set8/Set9标签不显示:原代码仅遍历主Y轴容器,Set8属于主Y轴、Set9属于次Y轴,需分别处理两个轴的容器。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:07:46