做者|Rizky Maulana Nurhidayat
編譯|VK
來源|Towards Datas Sciencepython
數據可視化用於以更直接的表示方式顯示數據,而且更易於理解。它能夠用柱狀圖、散點圖、折線圖、餅圖等形式造成。許多人仍然使用Matplotlib做爲後端模塊來可視化他們的圖形。在這個故事中,我將給你一些技巧,使用Matplotlib建立一個優秀圖表的5個強大技巧。後端
默認狀況下,咱們可使用Matplotlib提供的一些不錯的字體。可是,有些符號不夠好,不能由Matplotlib建立。例如,符號phi(φ),如圖1所示。bash
正如你在y-label中看到的,它仍然是phi(φ)的符號,可是對於某些人來講,它還不足以做爲繪圖標籤。爲了使它更漂亮,你可使用Latex字體。如何使用它?答案就在這裏。dom
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(上面的示例)等。要更改字體系列,可使用如下代碼。spa
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')
在這個技巧中,我將給你一個生成繪圖的代碼,如圖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所示。
你的圖中是否有許多圖例要顯示?若是是,則須要將它們放置在主軸以外。
要將圖例放置在主容器以外,須要使用此代碼調整位置
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)
在過去的十年裏,數據可視化的風格被轉移到一個乾淨的繪圖主題上。經過閱讀國際期刊或網頁上的一些新論文,咱們能夠看到這種轉變。最流行的方法之一是用連續的偏差可視化數據,而不是使用偏差條。你能夠在圖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)
若是你分析上面的每一行代碼,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/