Python進階之Matplotlib入門(八)
- 2019 年 11 月 28 日
- 筆記
引言
Matplotlib是Python的畫圖領域使用最廣泛的繪圖庫,它能讓使用者很輕鬆地將數據圖形化以及利用它可以畫出許多高質量的圖像,是用Python畫圖的必備技能。對於這個教程,大家最好親自碼一遍代碼,這樣可以更有收穫。
學完這課你將會:
1、掌握Matplotlib中的3D畫圖功能;
2、學會使用text函數玩出手稿效果;
3D圖
為了畫3D圖,我們除了導入maplotlib.pyplot模塊,我們還需要導入一個叫做mpl_toolkits的模塊:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
然後我們需要用figure()函數定義一個窗口,給它裝備好一個3D坐標:
fig = plt.figure() ax = Axes3D(fig)
可以獲得如下效果圖:

這個是3D坐標軸,可以通過鼠標旋轉觀察到不同的角度,大家把代碼輸入進去親自感受,手感非常好。
現在我們要輸入數據了,因為是一個3D的圖,所以我們要X,Y,Z三個維度的坐標。我們先通過meshgrid函數建立一個二維平面網格,然後直接用函數映射的方法或者Z軸坐標。
一切就緒後,就可以plot_surface的方式把3D曲面圖給畫出來:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = Axes3D(fig) X = np.arange(-4, 4, 0.25) Y = np.arange(-4, 4, 0.25) X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) ax.plot_surface(X, Y, Z, rstride=6, cstride=6, cmap='hot') plt.show()
運行結果:

在這個函數中,首先輸入的是X,Y,Z三個維度,沒毛病。然後是rstride以及cstride,它們分別控制row和column的密度。這裡的密度可以理解為用多少條線來畫3D的圖,比如我們將rstride和cstride設置成6,看一下效果:

瞬間拉跨,不好看。
手稿圖
前面在介紹如何給圖片添加文字的時候,引入了text函數。現在我們要利用這個函數,玩一個花樣出來:

代碼如下:
import numpy as np import matplotlib.pyplot as plt eqs = [] eqs.append((r"$W^{3beta}_{delta_1 rho_1 sigma_2} = U^{3beta}_{delta_1 rho_1} + frac{1}{8 pi 2} int^{alpha_2}_{alpha_2} d alpha^prime_2 left[frac{ U^{2beta}_{delta_1 rho_1} - alpha^prime_2U^{1beta}_{rho_1 sigma_2} }{U^{0beta}_{rho_1 sigma_2}}right]$")) eqs.append((r"$frac{drho}{d t} + rho vec{v}cdotnablavec{v} = -nabla p + munabla^2 vec{v} + rho vec{g}$")) eqs.append((r"$int_{-infty}^infty e^{-x^2}dx=sqrt{pi}$")) eqs.append((r"$E = mc^2 = sqrt{{m_0}^2c^4 + p^2c^2}$")) eqs.append((r"$F_G = Gfrac{m_1m_2}{r^2}$")) plt.axes([0.025,0.025,0.95,0.95]) for i in range(24): index = np.random.randint(0,len(eqs)) eq = eqs[index] size = np.random.uniform(12,32) x,y = np.random.uniform(0,1,2) alpha = np.random.uniform(0.25,.75) plt.text(x, y, eq, ha='center', va='center', color="#11557c", alpha=alpha, transform=plt.gca().transAxes, fontsize=size, clip_on=True) plt.xticks([]), plt.yticks([]) # savefig('../figures/text_ex.png',dpi=48) plt.show()
我們一共寫了五個公式,但是圖上「這麼多」公式的效果是怎麼來的呢?關鍵點就在於「隨機」,有位置的隨機,有大小的隨機,還有透明度的隨機。綜合效果出來就感覺有很多不同的公式一樣。