Matplotlib三维绘图:获取两个曲面的单色贴图

2024-06-17 06:05:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我用matplotlib制作了一个带有两个曲面的3d绘图(参见下面的示例)。到目前为止,两个曲面都有自己的颜色图,底部是蓝色,顶部是黄色。在

但是,我需要两个曲面的单一颜色贴图,即最底部为蓝色,顶部为黄色,两个曲面的接触点为绿色。在

我怎么才能做到呢?我是否需要在打印前以某种方式合并两个曲面,还是需要限制两个曲面的颜色贴图(下部从蓝色到绿色,上部从绿色到黄色)?在

谢谢你的帮助。在

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

ky = np.linspace(-np.pi*2/3,np.pi*2/3,100)
kz = np.linspace(-np.pi*2/3,np.pi*2/3,100)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

KY, KZ = np.meshgrid(ky, kz)
E = np.cos(KY)*np.cos(KZ)
ax.plot_surface(KY, KZ, E-1, rstride=1, cstride=1, cmap=cm.viridis)   #surface 1
ax.plot_surface(KY, KZ, -E+1, rstride=1, cstride=1, cmap=cm.viridis)  #surface 2
ax.view_init(elev=7, azim=-69)
plt.show()

2 surfaces with independent colormap


Tags: importmatplotlib颜色nppicmpltax
1条回答
网友
1楼 · 发布于 2024-06-17 06:05:47

您可以显式地为颜色映射设置vminvmax,以强制颜色范围。在

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

ky = np.linspace(-np.pi*2/3,np.pi*2/3,100)
kz = np.linspace(-np.pi*2/3,np.pi*2/3,100)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

KY, KZ = np.meshgrid(ky, kz)
E = np.cos(KY)*np.cos(KZ)
ax.plot_surface(KY, KZ, E-1, rstride=1, cstride=1, cmap=cm.viridis, vmin=-2, vmax=2)   #surface 1
ax.plot_surface(KY, KZ, -E+1, rstride=1, cstride=1, cmap=cm.viridis, vmin=-2, vmax=2)  #surface 2
ax.view_init(elev=7, azim=-69)
plt.show()

enter image description here

若要使范围与两个曲面中的实际Z值紧密对应,可以使用

^{pr2}$

您也可以通过定义自己的颜色贴图来创建这种效果,这些贴图在顶部从黄色变为绿色,在底部从绿色变为蓝色。在

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

ky = np.linspace(-np.pi*2/3,np.pi*2/3,100)
kz = np.linspace(-np.pi*2/3,np.pi*2/3,100)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

KY, KZ = np.meshgrid(ky, kz)
E = np.cos(KY)*np.cos(KZ)

viridis = cm.get_cmap('viridis', 512)
topcolors = viridis(np.linspace(0.5, 1, 256))
topcm = ListedColormap(topcolors)
bottomcolors = viridis(np.linspace(0, 0.5, 256))
bottomcm = ListedColormap(bottomcolors)

ax.plot_surface(KY, KZ, E-1, rstride=1, cstride=1, cmap=bottomcm)   #surface 1
ax.plot_surface(KY, KZ, -E+1, rstride=1, cstride=1, cmap=topcm)  #surface 2
ax.view_init(elev=7, azim=-69)
plt.show()

enter image description here

相关问题 更多 >