帶你十分鐘快速入門畫圖神器 Matplotlib

作者

王偉同學

一篇快速上手 Matplotlib 的好文章~

在開始正式介紹 Matplotlib 用法之前,先來簡單瞭解下 Matplotlib。

Matplotlib 是 Python 的一個繪圖庫。它包含了大量的工具,你可以使用這些工具創建各種圖形,包括簡單的散點圖,正弦曲線,甚至是三維圖形。

目錄

1. 畫一個簡單的圖形

2. 在一張圖紙裡繪製多個圖形

3. 更多設置

3.1 設置 figure

3.2 設置標題

3.3 設置座標軸

3.4 設置 label 和 legend

3.5 添加註釋

4. 使用子圖

5. 常見的圖形

5.1 散點圖

5.2 柱狀圖

6. 中文亂碼解決

<code># 導入相關模塊
import matplotlib.pyplot as plt
import numpy as np
/<code>

畫一個簡單的圖形

這裡我們通過畫出一個正弦曲線圖來講解下基本用法。

首先通過 <code>np.linspace/<code>方式生成 x,它包含了 50 個元素的數組,這 50 個元素均勻的分佈在 [0, 2pi] 的區間上。然後通過<code>np.sin(x)/<code>生成 y。

<code>x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
/<code>

有了 x 和 y 數據之後,我們通過 <code>plt.plot(x, y)/<code>來畫出圖形,並通過<code>plt.show/<code>來顯示。

<code>plt.plot(x, y)


plt.show
/<code>

在一張圖紙裡繪製多個圖形

有時候,可能需要在一個圖紙裡繪製多個圖形,這裡我們同時繪製了 (x, y), (x, y * 2)兩個圖形。

<code>plt.plot(x, y)
plt.plot(x, y * 2)
plt.show/<code>

繪製出圖形之後,我們可以自己調整更多的樣式,比如顏色、點、線。

<code>plt.plot(x, y, 'y*-')
plt.plot(x, y * 2, 'm--')
plt.show/<code>

可以看到,設置樣式時,就是增加了一個字符串參數,比如 <code>'y*-'/<code>,其中 y 表示黃色,* 表示 星標的點,- 表示實線。

這裡列舉一些常見的顏色表示方式:

<table><thead>顏色表示方式/<thead><tbody>藍色b綠色g紅色r青色c品紅m黃色y黑色k白色w/<tbody>/<table>

常見的點的表示方式:

<table><thead>點的類型表示方式/<thead><tbody>點.像素,圓o方形s三角形^/<tbody>/<table>

常見的線的表示方式:

<table><thead>線的類型表示方式/<thead><tbody>直線-虛線--點線:點劃線-./<tbody>/<table>

更多設置

Matplotlib 支持各種靈活的設置,這裡我們列舉一些常見的內容。

設置 figure

你可以認為Matplotlib繪製的圖形都在一個默認的 figure 中,當然了,你可以自己創建 figure,好處就是可以控制更多的參數,常見的就是控制圖形的大小,這裡創建一個 figure,設置大小為 <code>(6, 3)/<code>。

<code>plt.figure(figsize=(6, 3))
plt.plot(x, y)
plt.plot(x, y * 2)
plt.show/<code>

設置標題

來看下如何設置標題。

<code>plt.plot(x, y)
plt.plot(x, y * 2)
plt.title("sin(x) & 2sin(x)")
plt.show/<code>

直接通過 <code>plt.title/<code>即可設置圖形標題。

設置座標軸

來看下如何設置座標軸的範圍以及名稱。

<code>plt.plot(x, y)


plt.plot(x, y * 2)

plt.xlim((0, np.pi + 1))
plt.ylim((-3, 3))
plt.xlabel('X')
plt.ylabel('Y')

plt.show/<code>

通過 <code>xlim/<code>和<code>ylim/<code>來設限定軸的範圍,通過<code>xlabel/<code>和<code>ylabel/<code>來設置軸的名稱。

此外,我們也可以通過 <code>xticks/<code>和<code>yticks/<code>來設置軸的刻度。

<code>plt.plot(x, y)
plt.plot(x, y * 2)
plt.xticks((0, np.pi * 0.5, np.pi, np.pi * 1.5, np.pi * 2))
plt.show/<code>

設置 label 和 legend

設置 label 和 legend 的目的就是為了區分出每個數據對應的圖形名稱。

<code>plt.plot(x, y, label="sin(x)")
plt.plot(x, y * 2, label="2sin(x)")
# plt.legend
plt.legend(loc='best')
plt.show/<code>

添加註釋

有時候我們需要對特定的點進行標註,我們可以使用 <code>plt.annotate/<code>函數來實現。

這裡我們要標註的點是 <code>(x0, y0) = (π, 0)/<code>。

我們也可以使用 <code>plt.text/<code>函數來添加註釋。

<code>plt.plot(x, y)

x0 = np.pi
y0 = 0

# 畫出標註點
plt.scatter(x0, y0, s=50)

plt.annotate('sin(np.pi)=%s' % y0, xy=(np.pi, 0), xycoords='data', xytext=(+30, -30),
textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle='->', connection))

plt.text(0.5, -0.25, "sin(np.pi) = 0", fontdict={'size': 16, 'color': 'r'})

plt.show/<code>

對於 <code>annotate/<code>函數的參數,做一個簡單解釋:

<code>'sin(np.pi)=%s' % y0/<code>代表標註的內容,可以通過字符串 %s 將 y0 的值傳入字符串;

參數 <code>xycoords='data'/<code>是說基於數據的值來選位置;

<code>xytext=(+30, -30)/<code>和<code>textcoords='offset points'/<code>表示對於標註位置的描述 和 xy 偏差值,即標註位置是 xy 位置向右移動 30,向下移動30;

<code>arrowprops/<code>是對圖中箭頭類型和箭頭弧度的設置,需要用 dict 形式傳入。

使用子圖

有時候我們需要將多張子圖展示在一起,可以使用 <code>subplot/<code>實現。即在調用<code>plot/<code>函數之前需要先調用<code>subplot/<code>函數。該函數的第一個參數代表子圖的總行數,第二個參數代表子圖的總列數,第三個參數代表活躍區域。

<code>ax1 = plt.subplot(2, 2, 1) # (行,列,活躍區)
plt.plot(x, np.sin(x), 'r')

ax2 = plt.subplot(2, 2, 2, sharey=ax1) # 與 ax1 共享y軸
plt.plot(x, 2 * np.sin(x), 'g')

ax3 = plt.subplot(2, 2, 3)
plt.plot(x, np.cos(x), 'b')

ax4 = plt.subplot(2, 2, 4, sharey=ax3) # 與 ax3 共享y軸
plt.plot(x, 2 * np.cos(x), 'y')

plt.show/<code>

上面的 <code>subplot(2, 2, x)/<code>表示將圖像窗口分為 2 行 2 列。x 表示當前子圖所在的活躍區。

可以看到,上面的每個子圖的大小都是一樣的。有時候我們需要不同大小的子圖。比如將上面第一張子圖完全放置在第一行,其他的子圖都放在第二行。

<code>ax1 = plt.subplot(2, 1, 1) # (行,列,活躍區)
plt.plot(x, np.sin(x), 'r')

ax2 = plt.subplot(2, 3, 4)
plt.plot(x, 2 * np.sin(x), 'g')

ax3 = plt.subplot(2, 3, 5, sharey=ax2)
plt.plot(x, np.cos(x), 'b')

ax4 = plt.subplot(2, 3, 6, sharey=ax2)
plt.plot(x, 2 * np.cos(x), 'y')

plt.show/<code>

簡單解釋下,<code>plt.subplot(2, 1, 1)/<code>將圖像窗口分為了 2 行 1 列, 當前活躍區為 1。

使用 <code>plt.subplot(2, 3, 4)/<code>將整個圖像窗口分為 2 行 3 列, 當前活躍區為 4。

解釋下為什麼活躍區為 4,因為上一步中使用 <code>plt.subplot(2, 1, 1)/<code>將整個圖像窗口分為 2 行 1 列, 第1個小圖佔用了第1個位置, 也就是整個第1行. 這一步中使用<code>plt.subplot(2, 3, 4)/<code>將整個圖像窗口分為 2 行 3 列, 於是整個圖像窗口的第1行就變成了3列, 也就是成了3個位置, 於是第2行的第1個位置是整個圖像窗口的第4個位置。

常見的圖形

這裡帶大家畫一些常見的示例圖。

散點圖

首先來看下如何繪製散點圖。

<code>k = 500
x = np.random.rand(k)
y = np.random.rand(k)
size = np.random.rand(k) * 50 # 生成每個點的大小
colour = np.arctan2(x, y) # 生成每個點的顏色大小
plt.scatter(x, y, s=size, c=colour)
plt.colorbar # 添加顏色欄

plt.show/<code>

上面我們首先生成了要繪製的數據的點<code>x/<code>和<code>y/<code>,接下來為每個數據點生成控制大小的數組<code>size/<code>,然後未每個數據點生成控制顏色的數組<code>colour/<code>。最後通過<code>colorbar/<code>來增加一個顏色欄。

柱狀圖

柱狀圖我們經常會用到,我們來看下如何畫出柱狀圖,並在圖上標註出數據對應的數值。

<code>k = 10
x = np.arange(k)
y = np.random.rand(k)
plt.bar(x, y) # 畫出 x 和 y 的柱狀圖

# 增加數值
for x, y in zip(x, y):
plt.text(x, y , '%.2f' % y, ha='center', va='bottom')

plt.show/<code>

生成數據 <code>x/<code>和<code>y/<code>之後,調用<code>plt.bar/<code>函數繪製出柱狀圖,然後通過<code>plt.text/<code>標註數值,設置參數<code>ha='center'/<code>橫向居中對齊,設置<code>va='bottom'/<code>縱向底部對齊。

中文亂碼解決

Matplotlib 有個讓人惱火的問題是,默認情況下,Matplotlib 中文會亂碼。

<code>x = ['北京', '上海', '深圳', '廣州']
y = [60000, 58000, 50000, 52000]
plt.plot(x, y)
plt.show/<code>

可以看到,上面所有的中文都亂碼了,顯示成方框了,如何解決呢?

其實只需要配置下後臺字體即可。

<code>plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號

plt.plot(x, y)
plt.show/<code>

01

微 信 群

添加小編微信:tangguoyemeng,備註“進群”即可,加入【雲計算學習交流群】,和志同道合的朋友們共同打卡學習!

成為群成員,或拉人進群,

還有機會參與紅包抽獎,獲得免費贈書哦~~

02

徵 稿

CSDN作為國內專業的雲計算服務平臺,目前提供雲計算、大數據、虛擬化、數據中心、OpenStack、CloudStack、機器學習、智能算法等相關雲計算觀點、技術、平臺、實踐、雲產業諮詢等服務。CSDN 公眾號也一直堅持「與千萬技術人共成長」的理念,深度解讀行業內熱門技術與場景應用,致力於讓所有開發者保持敏銳的技術嗅覺、對行業趨勢與技術獲得更廣闊的認知。

文章題材

首先你需要關注我們的公眾號“CSDN雲計算”,這樣你會更準確瞭解我們需要的文章風格;

側重於雲計算領域相關的文章,可以是技術、運維、趨勢等方面的務實內容;

稿費:根據原創性、實用性和時效性等方面進行審核,通過的文章會發布在本微信平臺。一經採用,我們將支付作者酬勞。酬勞可能不多,這代表的是一個心意,更多是因為愛好,是有識之士抒發胸懷的一種方式;

字數要求:稿件字數以2K-8K為宜,少於2K或多於8K都會一定程度降低閱讀愉悅感;

投稿郵箱:lijy@csdn.net。或者添加微信表明來意,微信號:tangguoyemeng。請備註投稿+姓名+公司職位


如果咱們的合作穩定又愉快,還可以簽訂合同長期合作哦!