使用Matplotlib可視化數據的5個強大技巧

2021-01-08 人工智慧遇見磐創

數據可視化用於以更直接的表示方式顯示數據,並且更易於理解。它可以用柱狀圖、散點圖、折線圖、餅圖等形式形成。許多人仍然使用Matplotlib作為後端模塊來可視化他們的圖形。在這個故事中,我將給你一些技巧,使用Matplotlib創建一個優秀圖表的5個強大技巧。

1. 使用Latex字體

默認情況下,我們可以使用Matplotlib提供的一些不錯的字體。但是,有些符號不夠好,不能由Matplotlib創建。例如,符號phi(φ),如圖1所示。

正如你在y-label中看到的,它仍然是phi(φ)的符號,但是對於某些人來說,它還不足以作為繪圖標籤。為了使它更漂亮,你可以使用Latex字體。如何使用它?答案就在這裡。

plt.rcParams['text.usetex'] = Trueplt.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 npimport matplotlib.pyplot as plt# 調整matplotlib參數plt.rcParams.update(plt.rcParamsDefault)plt.rcParams['text.usetex'] = Trueplt.rcParams['font.size'] = 18plt.rcParams['font.family'] = "serif"# 創建模擬數據r = 15theta = 5rw = 12gamma = 0.1err = 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) # 第二軸的阻塞區域# 在左側創建第一個軸的ConnectionPatchcon1 = ConnectionPatch(xyA=(1, .2), coordsA=sub1.transData, xyB=(1, .3), coordsB=sub3.transData, color = 'green')# 添加到左側fig.add_artist(con1)# 在右側創建第一個軸的ConnectionPatchcon2 = ConnectionPatch(xyA=(2, .2), coordsA=sub1.transData, xyB=(2, .3), coordsB=sub3.transData, color = 'green')# 添加到右側fig.add_artist(con2)# 在左側創建第二個軸的ConnectionPatchcon3 = ConnectionPatch(xyA=(5, .4), coordsA=sub2.transData, xyB=(5, .5), coordsB=sub3.transData, color = 'orange')# 添加到左側fig.add_artist(con3)# 在右側創建第二個軸的ConnectionPatchcon4 = 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 = 9x = 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.02lower_stock = mean_stock - np.random.randint(N) * 0.015plt.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是一個多平臺庫,可以在許多作業系統使用。它是將數據可視化的老庫之一,但它仍然很強大。因為開發人員總是根據數據可視化的趨勢進行一些更新。上面提到的一些技巧就是更新的例子。

相關焦點

  • matplotlib的Python數據可視化和探索——入門指南
    matplotlib——最受歡迎的Python庫,用於數據可視化和探索我喜歡在Python中使用matplotlib。這是我學會掌握的第一個可視化庫,此後一直存在。matplotlib是最受歡迎的用於數據可視化和探索的Python庫,這是有原因的——它提供的靈活性和敏捷性是無與倫比的!
  • 手把手教你用Matplotlib進行數據可視化
    我們將使用NumPy的linspace函數在x軸上創建一個線性空間,x值從0到10,共100個樣本點:import numpy as np  x = np.linspace(0, 10, 100) 我們可以使用NumPy的sin函數求sin函數的所有x值,並通過調用plt的plot函數可視化結果:plt.plot(x, np.sin(x)) 你親自試過了嗎
  • Python數據可視化技能提升—用好matplotlib第1篇
    好啦,既然有朋友提出需要來啦,那今天咱們就聊點Python數據可視化相關的東東吧,說到Python的數據可視化呢,就必須提Python的一個庫哦,它就是大名鼎鼎的matplotlib庫,也是目前用得最多的Python數據可視化庫哦,matplotlib其實把MatLab的很多優點都借鑑了過來,所以呢,熟悉MatLab的朋友,對於matplotlib是上手很快的哦!
  • 看了這個總結,其實 Matplotlib 可視化,也沒那麼難!
    作者 | 舊時晚風拂曉城 來源 | 傑哥的IT之旅(ID:Jake_Internet)頭圖 | CSDN 下載自東方IC公眾號「傑哥的IT之旅」後臺回覆:「matplotlib數據可視化」,獲取本文完整數據集。Python 中可以通過 matplotlib 模塊的 pyplot 子庫來完成繪圖。
  • Matplotlib繪圖|快速定義圖表樣式的小技巧
    (X,S,color = "blue",linewidth = 3.0,linestyle = ":")為了方便起見,matplotlib 提供一個 matplotlibrc 文件接口,來全局自定義圖表屬性(圖表大小、DPI、線的寬度、坐標軸、樣式、網格屬性等),使用方法為 rcParams 命令,一次定義,對接下來創建的全部圖表的樣式都起效,避免了來回調參的麻煩rcParsms
  • 提高編程能力:Python數據可視化技能提升——好matplotlib第2篇
    上次已經和大家聊了Python數據可視化的經典庫:matplotlib,大家已經知道啦,matplotlib庫是Python中用於繪製二維、三維等這些圖表的數據可視化工具,並且已經和大家聊完了關於matplotlib庫的安裝啦、還有matplotlib庫的兩個函數,分別是plot()函數和scatter()函數哦,相信大家已經對於這兩個函數的用法掌握啦,在這就不多說了哈,如果還想繼續了解
  • matplotlib繪圖的核心原理講解
    作者:朱小五來自:凹凸數據(ID:alltodata)matplotlib是基於Python語言的開源項目,旨在為Python提供一個數據繪圖包。相信大家都用過它來數據可視化,之前我還分享過25個常用Matplotlib圖的Python代碼。可是你了解過它繪圖的核心原理嗎?
  • 數字黑洞:python-matplotlib來實現可視化
    1.2 數字黑洞與python-matplotlib可視化1.2.4 python-matplotlib可視化來看看效果::13-40-20-10-5-16-8-4-2-1pic5:輸入n為個位數1~6的情況
  • 50種常用的matplotlib可視化,再也不用擔心模型背著我亂跑了
    機器之心報導參與:思源數據分析與機器學習中常需要大量的可視化,因此才能直觀了解模型背地裡都幹了些什麼。而在可視化中,matplotlib 算得上是最常用的工具,不論是對數據有個預先的整體了解,還是可視化預測效果,matplotlib 都是不可缺失的模塊。
  • 使用Matplotlib繪製堆積條形圖
    就像任何可視化一樣,條形圖也有一些缺點,例如它們的可伸縮性較差。條形圖太多會使人感到難以閱讀,尤其是在當我們處理層次化的類別,也就是當我們有需要可視化的組和子組時,這個問題更常見。在這種情況下,堆積條形圖是一個很好的選擇,它讓我們能更好地比較和分析數據。在本文中,我們將探討如何使用Python的Matplotlib構建這些可視化圖形。
  • 有這5小段代碼在手,輕鬆實現數據可視化(Python+Matplotlib)
    大數據文摘作品編譯:傅一洋、吳雙、龍牧雪本文要講的是Matplotlib,一個強大的Python可視化庫。一共5小段代碼,輕鬆實現散點圖、折線圖、直方圖、柱狀圖、箱線圖,每段代碼只有10行,也是再簡單不過了吧!數據可視化是數據科學家工作的一項主要任務。
  • 30分鐘入門 Matplotlib 繪圖
    數據可視化是數據分析的重要環節,藉助圖形能夠幫助更加直觀地表達出數據背後的」東西」。Matplolib最初主要模仿Matlab的畫圖命令,但是它是獨立於Matlab的,可以自由、免費使用的繪圖包。Matplotlib依賴於之前介紹的Numpy庫來提供出色的繪圖能力。
  • 可視化工具不知道怎麼選?深度評測5大Python數據可視化工具
    作者 | 劉早起來源 | 早起Python(ID: zaoqi-python)相信很多讀者學習Python就是希望作出各種酷炫的可視化圖表,當然你一定會聽說過Matplotlib、Pyecharts、Seaborn、Plotly、Bokeh這五大工具,本文就將通過真實繪圖來深度評測這五個Python數據可視化的庫,看看到底這幾種工具各有什麼優缺點
  • 這麼用MatPlotLib視覺化呈現數據,你值得擁有!
    數據視覺化呈現工具以下介紹幾個常用的數據視覺化工具:1. Matplotlib2. Seaborn3. Plotly4. Pandas學習使用這些視覺化工具可促進數據理解、信息提取和決策制定。本文將對Matplotlib工具進行詳細介紹。
  • Matplotlib數據可視化:餅圖與箱線圖
    from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParams['font.sans-serif
  • python matplotlib畫圖教程學習:使用介紹
    本篇文章介紹matplotlib包使用時,需要掌握的一些基本概念。下圖顯示了matplotlib圖形的基本構成部分,如figure(圖形)、axes(子圖形)、title(標題)、legend(圖例)、Major tick(大標尺刻度)、Minor tick(小標尺刻度)、Major tick label(大標尺刻度數值)、Minor tick label(小標尺刻度數值)、Y axis label(y軸指標說明)、X axis label(x軸指標說明)、Line
  • 見識matplotlib:不常見的一面,折線圖!
    總之不管有什麼樣的想法,matplotlib大概率都能想辦法實現,3D圖像也不在話下,比如官網首頁的那四個圖最後一個就是3D的呢!嗯~?太小?看不清?這都不叫事兒,3D清晰大圖來一個!個人感覺這個像帽子一樣的3D圖,不論是從配色還是到形狀都還挺好看的。這「帽子」是官網上給的示例圖,只不過背景上的格子線和刻度被我去掉了,看起來還蠻有質感的樣子。
  • Python 繪圖庫 Matplotlib 入門教程
    /Matplotlib是一個Python語言的2D繪圖庫,它支持各種平臺,並且功能強大,能夠輕易繪製出各種專業的圖像。而matplotlib本身為我們設置了圖形的橫坐標(x軸):[0, 100],因為我們剛好有100個數值通過plt.show()將這個圖形顯示出來這段代碼非常的簡單,運行起來也是一樣。
  • 超硬核的 Python 數據可視化教程!
    Python實現可視化的三個步驟:確定問題,選擇圖形 轉換數據,應用函數 參數設置,一目了然 1、首先,要知道我們用哪些庫來畫圖?matplotlibpython中最基本的作圖庫就是matplotlib,是一個最基礎的Python可視化庫,一般都是從matplotlib上手Python數據可視化,然後開始做縱向與橫向拓展。
  • Python數據可視化實例之繪製圖表
    Python數據可視化實例之繪製圖表原創 蟲蟲安全 2018-09-05 17:41:57得利於語言的簡單明了、豐富的數據結構、豐富的類和模塊,Python如今成了數據科學中的香餑餑,成了matlab、R語言之外又一強大的數據分析工具。拋開其他方面的、今天蟲蟲帶大家一起來探索Python在數據可視化方面的應用。