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

如何在Matplotlib双Y轴直方图中显示副Y轴网格线?

双Y轴直方图副Y轴网格线不显示问题解决

问题场景

使用Matplotlib创建带双Y轴的学生成绩直方图时,左侧主Y轴网格线正常显示,但右侧副Y轴网格线无法显示,调用ax2.grid()及调整which参数均无效。

解决方案

问题核心在于secondary_yaxis创建的副轴默认未启用网格,且自定义刻度可能未与主轴范围同步,同时网格可能被直方图遮挡。以下是修正后的完整代码:

import matplotlib.pyplot as plt
import pandas as pd

# 设置样式
plt.style.use('default')

# 构建数据集
sample = pd.DataFrame({
'score':[595, 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, 576], 
'population':[ 705,  745,  716,  742,  722,  746,  796,  750,  816,  809,  815,821,  820,  865,  876,  886,  947,  949, 1018,  967]})

# 创建直方图
fig, ax1 = plt.subplots()
hist, bins, patches = ax1.hist(sample['score'], weights=sample['population'], alpha=0.7, color='steelblue', edgecolor='white')
ax1.set_xlabel('Score', fontsize=12)
ax1.set_ylabel('Population', fontsize=12)
ax1.set_yticks(hist[-1::-2])

# 设置主Y轴范围
ax1.set_ylim(bottom=hist.min()-100)

# 创建副Y轴并同步范围
ax2 = ax1.secondary_yaxis('right')
ax2.set_yticks(hist[-2::-2])
# 同步副Y轴与主Y轴的刻度范围,确保自定义刻度在可视区域内
ax2.set_ylim(ax1.get_ylim())

# 设置网格线,通过zorder让网格显示在直方图下方
ax1.grid(axis='y', color='red', alpha=0.5, zorder=0)
ax2.grid(axis='y', color='red', alpha=0.5, zorder=0)

plt.show()

关键修正点

  • 同步副轴范围:调用ax2.set_ylim(ax1.get_ylim())确保副Y轴的刻度范围与主Y轴完全匹配,避免自定义刻度超出可视范围导致网格线不显示。
  • 调整层级顺序:添加zorder=0参数,将网格线置于直方图(默认层级为1)下方,防止被图形遮挡。
  • 显式开启网格:通过ax2.grid()明确启用副Y轴网格线,并指定颜色、透明度等样式。

内容的提问来源于stack exchange,提问作者Wizard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:45:57