作者|Rizky Maulana Nurhidayat
編譯|VK
來源|Towards Datas Science
資料可視化用于以更直接的表示方式顯示資料,并且更易于理解,它可以用柱狀圖、散點圖、折線圖、餅圖等形式形成,許多人仍然使用Matplotlib作為后端模塊來可視化他們的圖形,在這個故事中,我將給你一些技巧,使用Matplotlib創建一個優秀圖表的5個強大技巧,
1. 使用Latex字體
默認情況下,我們可以使用Matplotlib提供的一些不錯的字體,但是,有些符號不夠好,不能由Matplotlib創建,例如,符號phi(φ),如圖1所示,

正如你在y-label中看到的,它仍然是phi(φ)的符號,但是對于某些人來說,它還不足以作為繪圖示簽,為了使它更漂亮,你可以使用Latex字體,如何使用它?答案就在這里,
plt.rcParams['text.usetex'] = True
plt.rcParams['font.size'] = 18
你可以在python代碼的開頭添加上面的代碼,第1行定義繪圖中使用的LaTeX字體,你還需要定義大于默認大小的字體大小,如果你不換,我想它會給你一個小標簽,我選了18,應用上述代碼后的結果如圖2所示,

你需要在符號的開頭和結尾寫上雙美元符號,像這樣($…$)
plt.xlabel('x')
plt.ylabel('$\phi$ (phi)')
如果你有一些錯誤或沒有安裝使用LaTeX字體所需的庫,則需要通過在Jupyter notebook中運行以下代碼來安裝這些庫,
!apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng
如果你想通過終端安裝,可以輸入
apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng
當然,你可以使用一些不同的字體系列,如serif、sans-serif(上面的示例)等,要更改字體系列,可以使用以下代碼,
plt.rcParams['font.family'] = "serif"
如果你將上面的代碼添加到代碼中,它將給你一個圖,如圖3所示,

你能理解圖3和圖2之間的區別嗎?是的,如果你仔細分析,區別在于字體的尾部,后一個圖形使用serif,而前者使用sans-serif,簡而言之,serif表示尾,sans表示沒有,如果你想了解更多有關字體系列或字體的資訊,我建議你使用此鏈接,
https://en.wikipedia.org/wiki/Typeface
你還可以使用Jupyter themes庫設定字體系列/字體,我已經做了使用它的教程,只需單擊以下鏈接,Jupyter主題也可以改變你的Jupyter主題,例如暗模式主題:https://medium.com/@rizman18/how-can-i-customize-jupyter-notebook-into-dark-mode-7985ce780f38
我們希望插入復雜文本,如圖4的標題所示,

如果你想創建圖4,可以使用這個完整的代碼
# 匯入庫
import numpy as np
import matplotlib.pyplot as plt
# 調整matplotlib引數
plt.rcParams.update(plt.rcParamsDefault)
plt.rcParams['text.usetex'] = True
plt.rcParams['font.size'] = 18
plt.rcParams['font.family'] = "serif"
# 創建模擬資料
r = 15
theta = 5
rw = 12
gamma = 0.1
err = np.arange(0., r, .1)
z = np.where(err < rw, 0, gamma * (err-rw)**2 * np.sin(np.deg2rad(theta)))
# 可視化資料
plt.scatter(err, z, s = 10)
plt.title(r'$\Sigma(x) = \gamma x^2 \sin(\theta)$', pad = 20)
plt.xlabel('x')
plt.ylabel('$\phi$')
# 保存圖表
plt.savefig('latex.png', dpi = 300, pad_inches = .1, bbox_inches = 'tight')
2.創建縮放效果
在這個技巧中,我將給你一個生成繪圖的代碼,如圖5所示,

首先,你需要了解plt.axes()和plt.figure() 你可以在下面的鏈接中查看它,代碼plt.figure() 覆寫單個容器中的所有物件,包括軸、圖形、文本和標簽,代碼plt.axes()只包含特定的部分,我想,圖6可以給你一個簡單的理解,

黑盒子使用plt.figure(),紅色和藍色的盒子使用plt.axes(). 在圖6中,有兩個軸,紅色和藍色,你可以查看此鏈接以獲取基本參考:https://medium.com/datadriveninvestor/python-data-visualization-with-matplotlib-for-absolute-beginner-python-part-ii-65818b4d96ce
理解之后,你可以分析如何創建圖5,是的,簡單地說,圖5中有兩個軸,第一個軸是一個大的繪圖,放大版本從580到650,第二個是縮小版本,下面是創建圖5的代碼,
# 創建主容器
fig = plt.figure()
# 設定隨機種子
np.random.seed(100)
# 創建模擬資料
x = np.random.normal(400, 50, 10_000)
y = np.random.normal(300, 50, 10_000)
c = np.random.rand(10_000)
# 創建放大圖
ax = plt.scatter(x, y, s = 5, c = c)
plt.xlim(400, 500)
plt.ylim(350, 400)
plt.xlabel('x', labelpad = 15)
plt.ylabel('y', labelpad = 15)
# 創建放大圖
ax_new = fig.add_axes([0.6, 0.6, 0.2, 0.2]) # 放大圖的位置與放大圖的比例比較
plt.scatter(x, y, s = 1, c = c)
# 保存圖形,留好邊距
plt.savefig('zoom.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)
如果你需要代碼的解釋,可以訪問此鏈接:https://medium.com/datadriveninvestor/data-visualization-with-matplotlib-for-absolute-beginner-part-i-655275855ec8
我還提供了另一個版本的縮放效果,你可以使用Matplotlib,如圖7所示,

要創建圖7,你需要在Matplotlib中使用add_subblot或其他語法(subblot)創建三個軸,為了更容易使用,我在這里加上,要創建它們,可以使用以下代碼,
fig = plt.figure(figsize=(6, 5))
plt.subplots_adjust(bottom = 0., left = 0, top = 1., right = 1)
# 創建第一個軸,左上角的圖用綠色的圖
sub1 = fig.add_subplot(2,2,1) # 兩行兩列,第一單元格
# 創建第二個軸,即左上角的橙色軸
sub2 = fig.add_subplot(2,2,2) # 兩行兩列,第二個單元格
# 創建第三個軸,第三和第四個單元格的組合
sub3 = fig.add_subplot(2,2,(3,4)) # 兩行兩列,合并第三和第四單元格
代碼將生成一個圖,如圖8所示,它告訴我們它將生成2行2列,軸sub1(2,2,1)是子圖(第一行,第一列)中的第一個軸,順序從左上側到右開始,軸sub2(2,2,2)被放置在第一行第二列中,軸sub3(2,2,(3,4)),是第二行第一列和第二行第二列之間的合并軸,

當然,我們需要定義一個模擬資料,以便在繪圖中可視化,在這里,我定義了線性函式和正弦函式的簡單組合,如下面的代碼所示,
# 使用lambda定義函式
stock = lambda A, amp, angle, phase: A * angle + amp * np.sin(angle + phase)
# 定義引數
theta = np.linspace(0., 2 * np.pi, 250) # x軸
np.random.seed(100)
noise = 0.2 * np.random.random(250)
y = stock(.1, .2, theta, 1.2) + noise # y軸
如果你將代碼應用到前面的代碼中,你將得到一個圖,如圖9所示,

下一步是限制第一個和第二個軸(sub1和sub2)的x軸和y軸,為sub3中的兩個軸創建阻塞區域,并創建代表縮放效果的ConnectionPatch,可以使用以下完整的代碼來完成(記住,為了簡單起見,我沒有使用回圈),
# 使用lambda定義函式
stock = lambda A, amp, angle, phase: A * angle + amp * np.sin(angle + phase)
# 定義引數
theta = np.linspace(0., 2 * np.pi, 250) # x軸
np.random.seed(100)
noise = 0.2 * np.random.random(250)
y = stock(.1, .2, theta, 1.2) + noise # y軸
# 創建大小為6x5的主容器
fig = plt.figure(figsize=(6, 5))
plt.subplots_adjust(bottom = 0., left = 0, top = 1., right = 1)
# 創建第一個軸,左上角的圖用綠色的圖
sub1 = fig.add_subplot(2,2,1) # 兩行兩列,第一單元格
sub1.plot(theta, y, color = 'green')
sub1.set_xlim(1, 2)
sub1.set_ylim(0.2, .5)
sub1.set_ylabel('y', labelpad = 15)
# 創建第二個軸,即左上角的橙色軸
sub2 = fig.add_subplot(2,2,2) # 兩行兩列,第二個單元格
sub2.plot(theta, y, color = 'orange')
sub2.set_xlim(5, 6)
sub2.set_ylim(.4, 1)
# 創建第三個軸,第三和第四個單元格的組合
sub3 = fig.add_subplot(2,2,(3,4)) # 兩行兩列,合并第三和第四單元格
sub3.plot(theta, y, color = 'darkorchid', alpha = .7)
sub3.set_xlim(0, 6.5)
sub3.set_ylim(0, 1)
sub3.set_xlabel(r'$\theta$ (rad)', labelpad = 15)
sub3.set_ylabel('y', labelpad = 15)
# 在第三個軸中創建阻塞區域
sub3.fill_between((1,2), 0, 1, facecolor='green', alpha=0.2) # 第一個軸的阻塞區域
sub3.fill_between((5,6), 0, 1, facecolor='orange', alpha=0.2) # 第二軸的阻塞區域
# 在左側創建第一個軸的ConnectionPatch
con1 = ConnectionPatch(xyA=(1, .2), coordsA=sub1.transData,
xyB=(1, .3), coordsB=sub3.transData, color = 'green')
# 添加到左側
fig.add_artist(con1)
# 在右側創建第一個軸的ConnectionPatch
con2 = ConnectionPatch(xyA=(2, .2), coordsA=sub1.transData,
xyB=(2, .3), coordsB=sub3.transData, color = 'green')
# 添加到右側
fig.add_artist(con2)
# 在左側創建第二個軸的ConnectionPatch
con3 = ConnectionPatch(xyA=(5, .4), coordsA=sub2.transData,
xyB=(5, .5), coordsB=sub3.transData, color = 'orange')
# 添加到左側
fig.add_artist(con3)
# 在右側創建第二個軸的ConnectionPatch
con4 = ConnectionPatch(xyA=(6, .4), coordsA=sub2.transData,
xyB=(6, .9), coordsB=sub3.transData, color = 'orange')
# 添加到右側
fig.add_artist(con4)
# 保存圖形,留好邊距
plt.savefig('zoom_effect_2.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)
代碼將為你提供一個出色的縮放效果圖,如圖7所示,
3.創建圖例
你的圖中是否有許多圖例要顯示?如果是,則需要將它們放置在主軸之外,

要將圖例放置在主容器之外,需要使用此代碼調整位置
plt.legend(bbox_to_anchor=(1.05, 1.04)) # 圖例的位置
值1.05和1.04位于朝向主容器的x和y軸坐標中,你可以改變它,現在,把上面的代碼應用到我們的代碼中,
# 使用lambda創建wave函式
wave = lambda amp, angle, phase: amp * np.sin(angle + phase)
# 設定引數值
theta = np.linspace(0., 2 * np.pi, 100)
amp = np.linspace(0, .5, 5)
phase = np.linspace(0, .5, 5)
# 創建主容器及其標題
plt.figure()
plt.title(r'Wave Function $y = \gamma \sin(\theta + \phi_0) $', pad = 15)
# 為每個放大器和階段創建繪圖
for i in range(len(amp)):
lgd1 = str(amp[i])
lgd2 = str(phase[i])
plt.plot(theta, wave(amp[i], theta, phase[i]), label = (r'$\gamma = $'+lgd1+', $\phi = $' +lgd2))
plt.xlabel(r'$\theta$ (rad)', labelpad = 15)
plt.ylabel('y', labelpad = 15)
# 調整圖例
plt.legend(bbox_to_anchor=(1.05, 1.04))
# 保存圖形,留好邊距
plt.savefig('outbox_legend.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)
運行代碼后,它將給出一個圖,如圖11所示,

如果要使圖例框更漂亮,可以使用以下代碼添加陰影效果,它將顯示一個圖,如圖12所示,
plt.legend(bbox_to_anchor=(1.05, 1.04), shadow=True)

4.創建連續誤差圖
在過去的十年里,資料可視化的風格被轉移到一個干凈的繪圖主題上,通過閱讀國際期刊或網頁上的一些新論文,我們可以看到這種轉變,最流行的方法之一是用連續的誤差可視化資料,而不是使用誤差條,你可以在圖13中看到它,

圖13是通過使用fill_between生成的,在fill_between語法中,你需要定義上限和下限,如圖14所示,

要應用它,可以使用以下代碼,
plt.fill_between(x, upper_limit, lower_limit)
引數上限和下限可以互換,這是完整的代碼,
N = 9
x = np.linspace(0, 6*np.pi, N)
mean_stock = (stock(.1, .2, x, 1.2))
np.random.seed(100)
upper_stock = mean_stock + np.random.randint(N) * 0.02
lower_stock = mean_stock - np.random.randint(N) * 0.015
plt.plot(x, mean_stock, color = 'darkorchid', label = r'$y = \gamma \sin(\theta + \phi_0)$')
plt.fill_between(x, upper_stock, lower_stock, alpha = .1, color = 'darkorchid')
plt.grid(alpha = .2)
plt.xlabel(r'$\theta$ (rad)', labelpad = 15)
plt.ylabel('y', labelpad = 15)
plt.legend()
plt.savefig('fill_between.png', dpi = 300, bbox_inches = 'tight', pad_inches = .1)
5.調整邊距
如果你分析上面的每一行代碼,plt.savefig()后面會是一個復雜的引數:bbox_inches和pad_inches,當你在撰寫一篇期刊或文章時,它們會為你提供邊距,如果不包括它們,則保存后,繪圖的邊距將更大,圖15展示了有bbox_inches和pad_inches以及沒有它們的不同繪圖,


我想你看不出圖15中兩個圖之間的區別,我將嘗試用不同的背景色來顯示它,如圖16所示,


同樣,當你在一篇論文或一篇文章中插入你的圖表時,這個技巧會幫助你,你不需要裁剪它來節省空間,
結論
Matplotlib是一個多平臺庫,可以在許多作業系統使用,它是將資料可視化的老庫之一,但它仍然很強大,因為開發人員總是根據資料可視化的趨勢進行一些更新,上面提到的一些技巧就是更新的例子,
原文鏈接:https://towardsdatascience.com/5-powerful-tricks-to-visualize-your-data-with-matplotlib-16bc33747e05
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/180928.html
標籤:其他
上一篇:情感分析教程
