Matplotlib子图x/y轴刻度字体设置及y轴刻度自定义问题
问题根因
- 刻度字体仅最后一个子图生效:循环中调用的
plt.xticks()、plt.yticks()属于pyplot全局状态接口,仅对当前最后激活的子图生效,无法作用于遍历过程中的所有子图对象;plt.rcParams全局字体配置需放在绘图逻辑最前端,循环内重复设置无实际效果。 - y轴固定双刻度需求未实现:原代码未获取直方图的频次统计结果,无法计算目标y轴刻度上限,也未手动指定y轴显示的刻度列表。
修正后可运行代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt # 全局字体配置放在所有绘图逻辑前 plt.rcParams["font.serif"] = ["Times New Roman"] xaxes = ['RMSE', 'SMAPE', 'MAPE'] f, a = plt.subplots(3, figsize=(20, 15)) f.subplots_adjust(hspace=0.4) a = a.ravel() for idx, ax in enumerate(a): # 绘制直方图,接收返回的频次统计、分箱边界、图形补丁对象 counts, bins, patches = ax.hist(np.random.rand(100, 1), bins=300) # 逐个子图设置x、y轴刻度字号 ax.tick_params(axis='x', labelsize=30) ax.tick_params(axis='y', labelsize=30) # 计算y轴目标刻度,固定仅显示0和频次最大值取整加1两个值 y_upper = int(counts.max()) + 1 ax.set_yticks([0, y_upper]) # 设置轴标签 ax.set_xlabel(xaxes[idx], fontsize=30) ax.set_ylabel("Frequency", fontsize=30) plt.show()
关键修改说明
- 全局字体配置移至代码最前端,删除循环内重复的无效配置项
- 替换全局状态接口
plt.xticks()/plt.yticks()为子图对象专属的ax.tick_params()方法,遍历过程中逐个子图设置刻度字号,保证所有子图配置生效 - 接收
ax.hist()返回的频次统计数组counts,计算得到y轴目标上限值,通过ax.set_yticks()手动指定y轴仅显示要求的两个刻度 - 所有样式配置均绑定当前循环到的子图实例,彻底解决仅最后一个子图配置生效的问题
内容的提问来源于stack exchange,提问作者Sadcow
相关产品推荐
相关产品推荐

