试图将图显示限制在具有实心墙的立方体中,matplotlib 3d surface

wh6knrhe  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(120)

我试图从Maple复制一个python图。我希望图被限制在立方体的墙内。它应该看起来像这样干净:Maple Plot
这是Maple的代码:

> Digits := 20;with(plots);s := 2;

> x := array(1 .. 4);y := array(1 .. 4);for i to 4 do x[i] := evalf(-1 + 2*rand()/10^12); y[i] := evalf(-1 + 2*rand()/10^12); end do;

> F := (u, v) -> ((u - x[1])^2 + (v - y[1])^2)^(-1/2*s) + ((u - x[2])^2 + (v - y[2])^2)^(-1/2*s) + ((u - x[3])^2 + (v - y[3])^2)^(-1/2*s) + ((u - x[4])^2 + (v - y[4])^2)^(-1/2*s);

> Minimize(F(u, v), u = -1 .. 1, v = -1 .. 1);

          [3.0238548714143095703, [u = 1.0, v = 1.0]]

> plot3d(F(u, v), u = -1 .. 1, v = -1 .. 1, view = 0 .. 5*F(1, 1));

这是我的python代码和绘图输出。请大家帮忙!

def f(u ,v):
z = ((u - x[0]) ** 2 + (v - y[0]) ** 2) ** (-s * 0.5) \
    + ((u - x[1]) ** 2 + (v - y[1]) ** 2) ** (-s * 0.5) \
    + ((u - x[2]) ** 2 + (v - y[2]) ** 2) ** (-s * 0.5) \
    + ((u - x[3]) ** 2 + (v - y[3]) ** 2) ** (-s * 0.5)
return z

U = np.linspace(-1, 1)
V = np.linspace(-1, 1)
X, Y = np.meshgrid(U, V)
Z = f(X, Y)

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
ax.set_zlim(0, 5*f(1,1))
ax.set_title('Surface plot')
ax.set_xlabel('u')
ax.set_ylabel('v')
plt.show()

这个图应该在轴的内部,并且应该在我设置界限的地方被剪切(类似于Maple的图)。但是它却“流向”外部,并且有一些奇怪的垂直线。

idfiyjo8

idfiyjo81#

在Python中,技巧是不显示超过某个阈值的值。

z_lim = 5 * F(1,1)
masked_z = np.ma.masked_where(Z > z_lim, Z)

然后你就可以

ax.plot_surface(X, Y, masked_z, cmap='viridis', edgecolor='none')

相关问题