重磅干貨,第一時(shí)間送達(dá)
Matplotlib 最初在設(shè)計(jì)時(shí)僅考慮了二維繪圖。但在其 1.0 版本后,一些構(gòu)建在二維繪圖基礎(chǔ)上的三維繪圖也可以使用了。要畫三維(立體) 圖,首先導(dǎo)入 mplot3d 工具包。
from mpl_toolkits import mplot3d
一旦 mplot3d 工具包被導(dǎo)入,創(chuàng)建立體圖有兩種方式:
用 fig = plt.figure()和 ax = mplot3d.Axes3D(fig)
用 fig = plt.figure()和 ax = plt.axes(projection='3d')
第二種方式更簡(jiǎn)單些。如果要同時(shí)生成圖和坐標(biāo)系,還可用以下語(yǔ)句:
fig, ax = plt.subplots(1, 1,
subplot_kw={'projection':'3d'})
三種生成立體圖的方式是等價(jià)的,生成的圖如下所示。
本帖只介紹三種類型的 3D 圖,它們?cè)诹炕鹑谥凶畛S玫?,分別是
線框圖 (wide frame)
曲面圖 (surface)
條形圖 (bar)
畫線框圖和曲面圖數(shù)據(jù)都使用外匯波動(dòng)率數(shù)據(jù),首先用 Pandas 從 excel 讀取數(shù)據(jù),該波動(dòng)率平面有 10 個(gè)期限和 5 個(gè)價(jià)位。
FX_vol = pd.read_csv( 'FX Volatility.csv', index_col=0 )
FX_vol
畫立體圖首先用 np.meshgrid() 函數(shù)創(chuàng)建 (x, y) 平面的網(wǎng)格 X 和 Y,它們的形狀都是 (10, 4)。
線框圖采用值網(wǎng)格并將其投影到指定的三維表面上,用 plot_wireframe() 函數(shù)來(lái)實(shí)現(xiàn),其參數(shù) X, Y, Z 對(duì)應(yīng)的每個(gè)點(diǎn) (x, y, z) 可當(dāng)成坐標(biāo)畫在立體圖中。
曲面圖類似于線框圖,把線框包圍的多邊形填充成面。用 plot_surface() 函數(shù)來(lái)實(shí)現(xiàn),代碼和上面幾乎一樣,參數(shù) color 和 edgecolor 分別控制面和邊的顏色。
還可設(shè)定參數(shù) cmap 填充漸變色,并在圖旁附上顏色條。
繼續(xù)追求完美。
波動(dòng)率平面是由不同期限上的波動(dòng)率曲線組成的,了解金融市場(chǎng)數(shù)據(jù)的讀者應(yīng)該對(duì)波動(dòng)率微笑(volatility smile) 這個(gè)詞不陌生,“微笑”是固定某個(gè)期限觀察曲線沿著價(jià)位維度呈現(xiàn)的形狀。在立體圖中添加折線用 plot3D() 函數(shù)來(lái)實(shí)現(xiàn),由于在 3D 空間畫 2D 折線,那么也需要傳入xs, ys, zs 三個(gè)參數(shù)。如下面代碼第 6 和 7 行所示,在一個(gè) for 循環(huán)中,固定期限維度 ys 不斷添加折線 (xs, zs),即沿著價(jià)位維度 xs 的波動(dòng)率值 zs。
雖然上圖的視角不錯(cuò),但有時(shí)默認(rèn)的視角不是最好的,通過(guò)
view_init(elev, azim)
函數(shù)可以調(diào)整角度,其中參數(shù) elev 值是水平面 (z = 0) 的仰角度 (elevationangle),參數(shù) azim 值是 (x, y) 坐標(biāo)系的方位角度 (azimuth angle)。下圖給出了參數(shù)為 (0, 0)、(0, 90) 和 (90, 0) 的視圖。
fig, ax = plt.subplots(1,3, figsize=(16,6), subplot_kw={'projection':'3d'})
ax[0].view_init(0,0)
ax[0].set( title='elev=0, azim=0', xlabel='X', ylabel='Y', zlabel='Z' )
ax[1].view_init(0,90)
ax[1].set( title='elev=0, azim=90', xlabel='X', ylabel='Y', zlabel='Z' )
ax[2].view_init(90,0)
ax[2].set( title='elev=90, azim=0', xlabel='X', ylabel='Y', zlabel='Z' )
plt.show()
回到實(shí)際例子,x,y, z 對(duì)應(yīng)的是價(jià)位、期限和波動(dòng)率。下圖畫出視角為 (0,0) 的圖,可看出水平面仰角為 0,從該圖可以明顯看出,不論哪個(gè)價(jià)位,波動(dòng)率隨著期限變長(zhǎng)而變大。
下圖畫出視角為 (0, 90) 的圖,水平面仰角還是 0,從該圖可看出,不論哪個(gè)期限,波動(dòng)率在 10 put 價(jià)位最大。
下圖畫出視角為 (90, 0) 的圖,水平面仰角是 90,感覺(jué)在俯視水平面,波動(dòng)率值大小的信息完全丟失。
這樣一看,本例還是用默認(rèn)的視角好。
3D 條形圖和 2D 條形圖相比,擴(kuò)展了比較信息的能力。下面代碼比較二項(xiàng)分布和泊松分布的概率質(zhì)量函數(shù) (PMF)。
條形圖中的每個(gè)條需要兩個(gè)參數(shù):位置和大小,對(duì)應(yīng)著下面代碼中的 (x, y, z) 和 (dx, dy, dz)。
位置是在立體圖中的坐標(biāo),x 和 z 都好理解,由于在 y 軸上畫兩個(gè)分布,因此有兩個(gè) y 值
大小指的條形的長(zhǎng)寬高,長(zhǎng) dx 和寬 dy 分別是 0.5 和 0.2,而高 dz 就是 PMF 值
當(dāng) M 為 20,p 為 0.5,λ 為 M 和 p 的乘積等于 10 時(shí),二項(xiàng)分布和泊松分布的差別挺大的。
將 M 改成 100,p 改成 0.1 后,同樣將 λ 設(shè)為 M 和 p 的乘積,再運(yùn)行上面代碼生成下圖,發(fā)現(xiàn)二項(xiàng)分布和泊松分布的圖幾乎是一樣的。這時(shí)因?yàn)楫?dāng) M 值越大和 p 值越小的時(shí)候,兩個(gè)分布越來(lái)越近似。
聯(lián)系客服