Matplotlib 3d 图:跨 2 个表面获取单一颜色图
Matplotlib 3d plot: get single colormap across 2 surfaces
我正在用 matplotlib 制作一个有 2 个表面的 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()
您可以为颜色图显式设置 vmin
和 vmax
以强制颜色范围。
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()
要使范围与两个曲面中的实际 Z 值紧密相关,您可以使用
vmin=np.amin(E-1), vmax=np.amax(-E+1)
您也可以通过定义自己的颜色图来创建此效果,这些颜色图在顶部从黄色变为绿色,在底部从绿色变为蓝色。
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()
我正在用 matplotlib 制作一个有 2 个表面的 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()
您可以为颜色图显式设置 vmin
和 vmax
以强制颜色范围。
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()
要使范围与两个曲面中的实际 Z 值紧密相关,您可以使用
vmin=np.amin(E-1), vmax=np.amax(-E+1)
您也可以通过定义自己的颜色图来创建此效果,这些颜色图在顶部从黄色变为绿色,在底部从绿色变为蓝色。
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()