【发布时间】:2025-12-27 03:10:16
【问题描述】:
我一直在寻找解决这个简单问题的方法,但我在任何地方都找不到!有大量帖子详细介绍了 2D 数据的半对数/对数对数绘图,例如plt.setxscale('log') 但是我有兴趣在 3d 图上使用对数刻度(mplot3d)。
我手头没有确切的代码,所以不能在这里发布,但是下面的简单示例应该足以解释这种情况。我目前正在使用 Matplotlib 0.99.1,但很快就会更新到 1.0.0 - 我知道我必须更新我的代码以实现 mplot3d。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-5, 5, 0.025)
Y = np.arange(-5, 5, 0.025)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, extend3d=True)
ax.set_zlim3d(-1.01, 1.01)
ax.w_zaxis.set_major_locator(LinearLocator(10))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))
fig.colorbar(surf)
plt.show()
上面的代码在 3D 中可以很好地绘制,但是三个比例(X、Y、Z)都是线性的。我的“Y”数据跨越了几个数量级(比如 9!),因此将其绘制在对数刻度上会非常有用。我可以通过获取“Y”的日志、重新创建 numpy 数组并以线性比例绘制 log(Y) 来解决这个问题,但是在真正的 python 风格中,我正在寻找更智能的解决方案,它将数据绘制在对数刻度。
是否可以使用对数刻度生成我的 XYZ 数据的 3D 曲面图,理想情况下,我希望 X 和 Z 在线性刻度上,Y 在对数刻度上?
任何帮助将不胜感激。请原谅上述示例中的任何明显错误,如前所述,我没有确切的代码,因此根据我的记忆更改了 matplotlib 库示例。
谢谢
【问题讨论】:
标签: python numpy matplotlib