我只是试图在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来表示。
1条答案
按热度按时间gev0vcfq1#
我同意阿让。我相信问题的出现是因为每个matplotlib的艺术家(i。即
PolygonCollection
)被单独地呈现。同一对象的不同面无法在场景中另一个对象的不同侧渲染。下面是一段有用的代码:
这给出了以下图像:
前两行由与您的代码类似的代码生成。您可能会注意到,使用
view_init
将高程设置为更高的值可以解决此问题。但这并不令人满意。我还确定了z值范围的影响(这里没有显示),这个bug似乎只有在这个范围很小的时候才会出现(你可以使用f
参数来测试它),这解释了为什么example不会受到它的影响。我建议的解决方案是替换:
通过:
并添加以下附加行:
如上图的最后两行所示,这样就可以避免matplotlib的反复无常。