如何避免plot_surface中的偏移乘数超出图表显示范围?
matplotlib 3D曲面图科学计数法偏移乘数显示异常的解决办法
使用plot_surface绘制3D图表时,当坐标轴数值触发科学计数法显示时,偏移乘数(如+1.5e5)会偏移到图表可视范围外,无法正常查看。该问题可复现于matplotlib官方示例,且在matplotlib 3.7.1 + Python 3.11环境下,尝试ax.get_xaxis().get_major_formatter().set_useOffset(False)无法关闭偏移。
复现代码
import matplotlib.pyplot as plt import numpy as np ax = plt.figure().add_subplot(projection='3d') X, Y = np.mgrid[0:6*np.pi:0.25, 0:4*np.pi:0.25] Z = np.sqrt(np.abs(np.cos(X) + np.cos(Y))) ax.plot_surface(X * 1e5, Y * 1e5, Z, cmap='autumn',cstride=2, rstride=2) ax.set_xlabel("X label") ax.set_ylabel("Y label") ax.set_zlabel("Z label") ax.set_zlim(0, 2) plt.show()
问题截图

解决方案
方案一:关闭科学计数法偏移,直接显示完整刻度
3D坐标轴的默认格式化器无法通过常规方法关闭偏移,需手动指定ScalarFormatter并配置参数:
from matplotlib.ticker import ScalarFormatter # 配置X轴格式化器,关闭偏移 x_formatter = ScalarFormatter(useMathText=True) x_formatter.set_useOffset(False) ax.xaxis.set_major_formatter(x_formatter) # 同理配置Y轴 y_formatter = ScalarFormatter(useMathText=True) y_formatter.set_useOffset(False) ax.yaxis.set_major_formatter(y_formatter)
修改后的完整代码:
import matplotlib.pyplot as plt import numpy as np from matplotlib.ticker import ScalarFormatter ax = plt.figure().add_subplot(projection='3d') X, Y = np.mgrid[0:6*np.pi:0.25, 0:4*np.pi:0.25] Z = np.sqrt(np.abs(np.cos(X) + np.cos(Y))) ax.plot_surface(X * 1e5, Y * 1e5, Z, cmap='autumn', cstride=2, rstride=2) ax.set_xlabel("X label") ax.set_ylabel("Y label") ax.set_zlabel("Z label") ax.set_zlim(0, 2) # 关闭X轴偏移 x_formatter = ScalarFormatter(useMathText=True) x_formatter.set_useOffset(False) ax.xaxis.set_major_formatter(x_formatter) # 关闭Y轴偏移 y_formatter = ScalarFormatter(useMathText=True) y_formatter.set_useOffset(False) ax.yaxis.set_major_formatter(y_formatter) plt.show()
方案二:调整偏移文本的显示位置
若需保留科学计数法偏移格式,可手动移动偏移文本到图表可视区域内:
# 调整X轴偏移文本位置 ax.xaxis.get_offset_text().set_position((1.1, 0)) # 调整Y轴偏移文本位置 ax.yaxis.get_offset_text().set_position((1.1, 0))
内容的提问来源于stack exchange,提问作者Cesar Carrasco
相关产品推荐
相关产品推荐

