【发布时间】:2014-12-19 13:18:57
【问题描述】:
我只是想在 3D 中绘制一个表面及其轮廓,就像在 this 示例中一样。
这是我用来执行此操作的代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
import numpy
def plot_3d_contour(x_dim, y_dim, x_steps, y_steps, scalar_field, file_path):
fig = plt.figure()
x, y = numpy.mgrid[-x_dim/2:x_dim/2:x_steps*1j, -y_dim/2:y_dim/2:y_steps*1j]
v_min = numpy.min(scalar_field)
v_max = nupmy.max(scalar_field)
ax = fig.gca(projection='3d')
cset = ax.contourf(x, y, scalar_field, zdir='z', offset=v_min, cmap=cm.coolwarm)
cset = ax.contourf(x, y, scalar_field, zdir='x', offset=-x_dim/2-1, cmap=cm.coolwarm)
cset = ax.contourf(x, y, scalar_field, zdir='y', offset=y_dim/2+1, cmap=cm.coolwarm)
ax.plot_surface(x, y, scalar_field, rstride=10, cstride=10, alpha=0.3)
ax.set_xlabel('X')
ax.set_xlim(-x_dim/2-1, x_dim/2+1)
ax.set_ylabel('Y')
ax.set_ylim(-y_dim/2-1, y_dim/2+1)
ax.set_zlabel('Z')
ax.set_zlim(v_min, v_max)
plt.savefig(file_path + '.jpg')
plt.close()
scalar_field = numpy.loadtxt('../scalar_field', delimiter=",")
plot_3d_contour(12, 12, 100, 100, scalar_field, 'scalar_field3D')
但是,我遇到了一个奇怪的行为,其中 a 轮廓 (zdir=y) 位于表面之上。此外,我在z_dir=z 中得到了一个奇怪的轮廓(缺少一个部分):
我想知道我错过了什么。标量字段可以在here找到。
【问题讨论】:
-
你尝试在绘图时更改
zorder吗? -
是的,这是我的第一次尝试,@nicoguaro。
-
我可以在 matplotlib 1.4.0 中重现这个。其中一位开发人员可能会发表评论,但我认为这与一般的 3D 绘图问题有关 - 如果您使该图形具有交互性,您可以看到更改视角会改变“在前景中”绘制的元素。至于 xy 平面轮廓中“非数据”的有趣条纹,可能是由于其中一个轮廓的“关闭”而发生的一些有趣的事情。我认为您的代码没有任何问题。
-
谢谢你,@Ajean。这只是发生在
contourf上。如果我使用contour,则不会发生这些问题。 -
有趣。这有点无法回答,但我见过 matplotlib 的人,当面对令人困惑的 3D 东西时,建议使用 mayavi 代替 3D(我自己从未使用过它,所以我不能和它说话)。
标签: python matplotlib mplot3d contourf