matlab - 在 matplotlib 中显示最大表面?

标签 matlab matplotlib plot surface

我正在使用 matplotlib 在同一个图形上绘制多个表面,我只想看到最上面的表面,如 matlab 所示。

Matlab 3D View : Matlab 3D view

Matlab 俯 View : Matlab top view

Matplotlib 3D View : Matplotlib 3D view

Matplotlib 顶 View : Matplotlib top view

如何让 Matplotlib 显示类似于 Matlab 的结果,其中最顶层的类显示在顶部,而不是一个类优先于另一个类?

最佳答案

我本来想考虑一些肮脏的黑客攻击,比如 mgab 在他们的回答中提到的,但后来决定走一条相当简单的路线:

你可以纯粹通过使用透明度来获得类似的效果,你只需要确保透明度足够低,否则你仍然会发生明显的重叠事情:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np
from scipy.special import erf

fig = plt.figure()
ax = fig.gca(projection='3d')

X = np.arange(0, 6, 0.25)
Y = np.arange(0, 6, 0.25)
X, Y = np.meshgrid(X, Y)

Z1 = np.zeros_like(X)
Z2 = np.ones_like(X)

for i in range(len(X)):
  for j in range(len(X[0])):
    Z1[i,j] = 0.5*(erf((X[i,j]+Y[i,j]-4.5)*0.5)+1)
    Z2[i,j] = 0.5*(erf((-X[i,j]-Y[i,j]+4.5)*0.5)+1)


alpha = 0.25

surf1 = ax.plot_surface(X, Y, Z1, cstride=2, rstride=1, cmap=cm.Oranges, linewidth=0, antialiased=False, alpha=alpha)

surf2 = ax.plot_surface(X, Y, Z2, cstride=2, rstride=1, cmap=cm.Blues, linewidth=0, antialiased=False, alpha=alpha)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf1, shrink=0.5, aspect=5)
fig.colorbar(surf2, shrink=0.5, aspect=5)

plt.show()

enter image description here

enter image description here

添加交叉线会是一个很好的添加,但我目前没有简单的方法来添加它。

编辑:从 mgab 的答案中大量窃取,使用他的“桥梁”解决方案,然后还对表面使用颜色贴图,并使用 RGBA 元组将桥面设置为透明,您可以几乎完全得到你想要的:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from scipy.special import erf

fig = plt.figure()
ax = fig.gca(projection='3d')

X = np.arange(0, 6, 0.25)
Y = np.arange(0, 6, 0.25)
X, Y = np.meshgrid(X, Y)

Z1 = np.empty_like(X)
Z2 = np.empty_like(X)
C1 = np.empty_like(X, dtype=object)
C2 = np.empty_like(X, dtype=object)

for i in range(len(X)):
  for j in range(len(X[0])):
    z1 = 0.5*(erf((X[i,j]+Y[i,j]-4.5)*0.5)+1)
    z2 = 0.5*(erf((-X[i,j]-Y[i,j]+4.5)*0.5)+1)
    Z1[i,j] = z1
    Z2[i,j] = z2

    # If you want to grab a colour from a matplotlib cmap function, 
    # you need to give it a number between 0 and 1. z1 and z2 are 
    # already in this range, so it just works.
    C1[i,j] = plt.get_cmap("Oranges")(z1)
    C2[i,j] = plt.get_cmap("Blues")(z2)


# Create a transparent bridge region
X_bridge = np.vstack([X[-1,:],X[-1,:]])
Y_bridge = np.vstack([Y[-1,:],Y[-1,:]])
Z_bridge = np.vstack([Z1[-1,:],Z2[-1,:]])
color_bridge = np.empty_like(Z_bridge, dtype=object)

color_bridge.fill((1,1,1,0)) # RGBA colour, onlt the last component matters.

# Join the two surfaces flipping one of them (using also the bridge)
X_full = np.vstack([X, X_bridge, np.flipud(X)])
Y_full = np.vstack([Y, Y_bridge, np.flipud(Y)])
Z_full = np.vstack([Z1, Z_bridge, np.flipud(Z2)])
color_full = np.vstack([C1, color_bridge, np.flipud(C2)])

surf_full = ax.plot_surface(X_full, Y_full, Z_full, rstride=1, cstride=1,
                            facecolors=color_full, linewidth=0,
                            antialiased=False)


plt.show()

enter image description here

enter image description here

关于matlab - 在 matplotlib 中显示最大表面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531752/

相关文章:

R:当 row.values 和 column.values 的范围很小时,Levelplot 会给出多余的空白

Matlab神经网络错误: Input 1 size does not match net. inputs{1}.size

algorithm - MATLAB:快速计算Adamic-Adar Score

Python - 使用 PIL 绘制不同颜色的簇

python - 移动 Matplotlib 中绘制的列表的 x 值

python - 如何绘制按子索引对齐的 Pandas 数据框列?

r - 如何将绘图组合循环到数据框中的剩余变量

matlab - 四个不同视角的相同子图

python - 使用 Jupyter Notebook 查看从 Python 运行的 MATLAB 代码的输出

python - yaxis 上的 HourLocator() 引发运行时错误意外超过 Locator.MAXTICK