如何在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
相关产品推荐
相关产品推荐

