我一直在寻找一个解决这个简单问题的方法,但是无论我到哪里都找不到!有很多帖子详细介绍了在二维中使用半对数 / 对数-对数绘图的方法,例如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画廊示例。
谢谢
AttributeError: 'YAxis'еЇ№и±ЎжІЎжњ‰е±ћжЂ§'set_scale'
гЂ‚ - ethanabrooksAttributeError
错误。 - swimfar2AttributeError
错误。 - undefined