3D绘图中contourf的set_xlim与set_ylim设置不生效问题求解
Matplotlib 3D等高线限制在坐标轴范围内的解决方案
问题原因
matplotlib 3D坐标系的xlim、ylim仅会调整坐标轴的显示范围,默认不会对绘制的元素(比如投影等高线)做裁剪,因此输入数据范围大于轴范围时,等高线会延伸到坐标轴外侧。
解决方案
最稳妥的实现方式是在绘制等高线前,先将X、Y、Z数据按你设定的坐标轴范围做截断,用截断后的数据绘制等高线即可。
修改后可直接运行的完整代码如下:
import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import axes3d import numpy as np ax = plt.figure().add_subplot(projection='3d') X, Y, Z = axes3d.get_test_data(0.05) # 定义坐标轴范围 x_min, x_max = -20, 20 y_min, y_max = -20, 20 # 截断符合范围的坐标数据 x_mask = (X[0, :] >= x_min) & (X[0, :] <= x_max) y_mask = (Y[:, 0] >= y_min) & (Y[:, 0] <= y_max) X_cut = X[y_mask, :][:, x_mask] Y_cut = Y[y_mask, :][:, x_mask] Z_cut = Z[y_mask, :][:, x_mask] # 用截断后的数据绘制等高线 cset = ax.contourf(X_cut, Y_cut, Z_cut, zdir='z', offset=-100, cmap=cm.coolwarm) ax.set_xlim(x_min, x_max) ax.set_ylim(y_min, y_max) ax.set_zlim(-100, 100) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') plt.show()
如果不想修改原始数据,也可以为等高线对象手动设置裁剪路径,不过实现复杂度更高,截断数据的方式兼容性更好,适合绝大多数场景。
内容的提问来源于stack exchange,提问作者Winston Wu
相关产品推荐
相关产品推荐

