matplotlib中的3D等值线图问题

093gszye  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(160)

不久前我在Mathematica中创建了一个3D等高线图,这次我尝试用Python来做。首先让我向大家展示一下我得到的结果:
数学软件:

巨蟒:

现在,我希望前景(山丘的可见部分)隐藏背景(不可见部分)。在Python版本中,看起来就像你在下面看着这些山。我不知道如何修复它,使它更像Mathematica版本(我不关心颜色,我实际上更喜欢Python版本中的颜色)。以下是代码:

import numpy as np
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt

plt.rcParams["lines.linewidth"]=0.5
fig = plt.figure()
ax = fig.add_subplot(111, projection="3d")
X, Y = np.mgrid[-3:3:30j, -3:3:30j]
Z= np.exp(-(abs(X)**2 + abs(Y)**2)) + 0.8*np.exp(-4*((abs(X-1.5))**4.2 + (abs(Y-1.4))**4.2))

ax.plot_surface(X, Y, Z, cmap="coolwarm", rstride=1, cstride=1, alpha=0.2)
# ax.contourf(X, Y, Z, levels=60, colors="k", linestyles="solid", alpha=0.9, antialiased=True) 
ax.contour(X, Y, Z, levels=60, linestyles="solid", alpha=0.9, antialiased=True) 

plt.show()
plt.savefig('contour3D.png', dpi=300)
0s0u357o

0s0u357o1#

Matplotlib在3D绘图方面并不是很好。你降低了表面的不透明度,使轮廓线可见。恐怕你所要求的是不可能用matplotlib实现的。
如果你要尝试不同的库呢?例如Plotly或Mayavi?

import numpy as np
import plotly.graph_objects as go
import matplotlib

X, Y = np.mgrid[-3:3:100j, -3:3:100j]
Z= np.exp(-(abs(X)**2 + abs(Y)**2)) + 0.8*np.exp(-4*((abs(X-1.5))**4.2 + (abs(Y-1.4))**4.2))

fig = go.Figure(data=[
    go.Surface(
        x=X, y=Y, z=Z,
        contours={
            "z": {"show": True, "start": 0, "end": 1, "size": 1/60,
                  "width": 1, "usecolormap": True}
        }, showscale=False, colorscale="Aggrnyl"
    )
], layout=dict(
    scene=dict(aspectmode="manual", aspectratio=dict(x=1.5, y=1.5, z=1))
))

w, h, dpi = 15, 7.5, 300 # width and heigh in inches
fig.write_image(file="test2.png", width=w*dpi, height=h*dpi, scale=1)

以下是一些资源:

368yc8dk

368yc8dk2#

我认为解决方案是简单地将alpha设置为1,因为使曲面透明可以显示其背后的背景。

ax.plot_surface(X, Y, Z, cmap="coolwarm", rstride=1, cstride=1, alpha=1)

new graph

相关问题