如何修改Matplotlib 3D绘图中Z轴的字体参数
问题原因
matplotlib.pyplot 没有提供顶层的zticks() API,你注释掉的代码触发AttributeError正是因为这个,最终导致Z轴刻度标签没有应用你预设的字体配置——目前你的代码仅通过ax.set_zlabel给Z轴的轴标签设置了字体,Z轴刻度的字体仍为默认值。
当前Z轴字体未生效的效果如下:
另外你的代码里还有两个容易触发运行错误的隐患:
- 导入
from matplotlib import cm后,又定义cm=1/2.54覆盖了cm模块,后续调用cm.viridis时会触发属性错误 - 代码中使用了
np.meshgrid但没有导入numpy库
解决方法
方法1:最小改动适配现有代码
直接调用3D坐标轴实例的Z轴刻度配置方法,和你配置X/Y轴的逻辑保持一致即可:
- 参照
lin_x/lin_y的定义方式,声明Z轴刻度值lin_z - 调用
ax.set_zticks设置刻度位置,ax.set_zticklabels给Z轴刻度应用字体配置
修改后的可运行核心代码如下:
import numpy as np # 补充缺失的numpy导入 import matplotlib.pyplot as plt from matplotlib import cm font = {'size' : 12} cm_to_inch = 1/2.54 # 修改变量名,避免覆盖matplotlib的cm模块 size_x = 10*cm_to_inch size_y = 8*cm_to_inch min_limx = 4 max_limx = 10 min_limy = 0 max_limy = 50 min_limz = 0 max_limz = 8 fig, ax = plt.subplots(figsize=(size_x, size_y), subplot_kw={"projection": "3d"}) X, Y = np.meshgrid(xnew, ynew, indexing='ij') Z1 = m_fill Z2 = m_nofill surf = ax.plot_surface(X, Y, Z1, cmap=cm.viridis, linewidth=0, antialiased=False) surf = ax.plot_surface(X, Y, Z2, color='w', linewidth=0, antialiased=False) ax.set_xlabel('$\lambda$', **font) ax.set_ylabel('$\chi$', **font) ax.set_zlabel('$\it{m_{0}, кг}$', **font) lin_x = np.arange(min_limx, max_limx, step=2) lin_y = np.arange(min_limy, max_limy, step=15) lin_z = np.arange(min_limz, max_limz+1, step=2) # 可按需调整步长修改Z轴刻度密度 plt.xticks(lin_x, **font) plt.yticks(lin_y, **font) # 替换原来报错的plt.zticks代码 ax.set_zticks(lin_z) ax.set_zticklabels(lin_z, **font) ax.set_zlim(0, 8) ax.view_init(45, -45) plt.grid() plt.show() fig.savefig('p0_V_m0.png', format='png', dpi=300)
方法2:全局配置统一字体(推荐)
如果需要所有坐标轴(包括3D轴三个维度的标签、刻度)字体完全统一,可以在绘图代码前直接更新matplotlib全局参数,不需要给每个轴单独传font配置,从根源避免漏设单个轴的问题:
# 所有绘图逻辑前添加全局配置 plt.rcParams.update({ "font.size": 12, # 如需指定字体族,可取消注释下一行,替换为你需要的字体名称 # "font.family": "Times New Roman" })
配置完成后,所有文字元素会自动应用设置的字体规则。
内容的提问来源于stack exchange,提问作者Oscar Espinosa
相关产品推荐
相关产品推荐

