簡體   English   中英

Matplotlib 3d 繪圖:在 2 個表面上獲取單個顏色圖

[英]Matplotlib 3d plot: get single colormap across 2 surfaces

我正在使用帶有 2 個表面的 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 個具有獨立顏色圖的表面

您可以為顏色圖顯式設置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()

在此處輸入圖片說明

要使范圍與兩個曲面中的實際 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()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM