Python 如何高亮显示matplotlib 3D曲面打印上的切片?

Python 如何高亮显示matplotlib 3D曲面打印上的切片?,python,matplotlib,Python,Matplotlib,我有一个3D曲面图。我还想在2D中绘制此图的切片,并在3D图上以某种方式指示切片的来源(例如沿切片着色以“高亮”切片,或绘制相交平面或其他) 下面是一个示例,我只是将一个特定行设置为0,以便可以看到切片在3D绘图上的位置 import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt # Grid and test function N = 29; x,y = np.lins

我有一个3D曲面图。我还想在2D中绘制此图的切片,并在3D图上以某种方式指示切片的来源(例如沿切片着色以“高亮”切片,或绘制相交平面或其他)

下面是一个示例,我只是将一个特定行设置为0,以便可以看到切片在3D绘图上的位置

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


# Grid and test function
N = 29;
x,y = np.linspace(-1,1, N*2), np.linspace(-1,1, N)
X,Y = np.meshgrid(x,y)
F = lambda X,Y : np.sin(10*X)/(1+5*(X**2+Y**2))
Z = F(X,Y)

# 3D Surface plot
plt.figure(figsize = (5,6))
Z2 = Z.copy(); Z2[10,:] = 0 # <----- Replace this code
ax = plt.subplot(211, projection='3d')
ax.plot_surface(X,Y,Z2)

# 2D Plot of slice of 3D plot 
plt.subplot(212)
plt.plot(x,Z[10,:])
plt.show()

plt.savefig('surfacePlotHighlight.png')
将numpy导入为np
从mpl_toolkits.mplot3d导入Axes3D
将matplotlib.pyplot作为plt导入
#网格与测试功能
N=29;
x、 y=np.linspace(-1,1,N*2),np.linspace(-1,1,N)
十、 Y=np.meshgrid(X,Y)
F=λX,Y:np.sin(10*X)/(1+5*(X**2+Y**2))
Z=F(X,Y)
#三维曲面图
plt.图(figsize=(5,6))

Z2=Z.copy();Z2[10,:]=0#您可以使用
plot\u surface
中的
facecolor
选项,以及
plot
中类似的颜色设置,在X或Y方向对切片进行着色。例如

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

# Grid and test function
N = 29;
x,y = np.linspace(-1,1, N*2), np.linspace(-1,1, N)
X,Y = np.meshgrid(x,y)
F = lambda X,Y : np.sin(10*X)/(1+5*(X**2+Y**2))
Z = F(X,Y)

# 3D Surface plot
plt.figure(figsize = (5,6))
ax = plt.subplot(211, projection='3d')
# Normalise Y for calling in the cmap.
Ys = Y/Y.max()
cmap = plt.cm.viridis
ax.plot_surface(X, Y, Z2, facecolors=cmap(Ys))

# 2D Plot of slice of 3D plot 
# Normalise y for calling in the cmap.
ys = y/y.max()
plt.subplot(212)
plt.plot(x,Z[10,:], color=cmap(ys[10]))
plt.plot(x,Z[20,:], color=cmap(ys[20]))
plt.show()

plt.savefig('surfacePlotHighlight.png')

编辑: 通过编辑颜色数组以调出特定单元格,可以使用此选项高亮显示单行(或列,或任意点集),例如:

# 3D Surface plot
plt.figure(1,figsize = (5,6))
ax = plt.subplot(211, projection='3d')
# Create array to specify color of each pixel on surface
Ys = Y*0
Ys[:,:] = .3
Ys[10] = 1
Ys[20] = .7
cmap = plt.cm.viridis
ax.plot_surface(X, Y, Z, facecolors=cmap(Ys))

# 2D Plot of slice of 3D plot 
# Normalise y for calling in the cmap.
ys = Ys[:,0]
plt.subplot(212)
plt.plot(x,Z[10,:], color=cmap(ys[10]))
plt.plot(x,Z[20,:], color=cmap(ys[20]))
plt.show()

plt.savefig('surfacePlotHighlight.png')

您可以将显示的行着色为与其他行不同的颜色

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


# Grid and test function
N = 29;
x,y = np.linspace(-1,1, N*2), np.linspace(-1,1, N)
X,Y = np.meshgrid(x,y)
F = lambda X,Y : np.sin(10*X)/(1+5*(X**2+Y**2))
Z = F(X,Y)


y0 = 10
norm=plt.Normalize(Z.min(), Z.max())
C = plt.cm.Blues_r(norm(Z)/2)
C[y0] = plt.cm.Reds_r(norm(Z[y0])/2)
# 3D Surface plot
plt.figure(figsize = (5,6))

ax = plt.subplot(211, projection='3d')
ax.plot_surface(X,Y,Z, facecolors=C)

# 2D Plot of slice of 3D plot 
plt.subplot(212)
plt.plot(x,Z[y0,:], color=plt.cm.Reds(.7))
plt.show()

谢谢,这让我达到了90%的目标。你介意我在你的答案中加上如何使用它来做一些更接近我想法的事情吗?不用担心,去做吧。