PYTHON 畫圖神器 Matplotlib

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

# 導入相關模塊
import matplotlib.pyplot as plt
import numpy as np
畫一個簡單的圖形

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

首先通過 np.linspace 方式生成 x,它包含了 50 個元素的數(shù)組,這 50 個元素均勻的分布在 [0, 2pi] 的區(qū)間上。然后通過 np.sin(x) 生成 y。

x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)

有了 x 和 y 數(shù)據(jù)之后,我們通過 plt.plot(x, y) 來畫出圖形,并通過 plt.show() 來顯示。

plt.plot(x, y)
plt.show()
image
在一張圖紙里繪制多個圖形

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

plt.plot(x, y)
plt.plot(x, y * 2)
plt.show()
image

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

plt.plot(x, y, 'y*-')
plt.plot(x, y * 2, 'm--')
plt.show()
image

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

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

顏色 表示方式
藍色 b
綠色 g
紅色 r
青色 c
品紅 m
黃色 y
黑色 k
白色 w

常見的點的表示方式:

點的類型 表示方式
.
像素 ,
o
方形 s
三角形 ^

常見的線的表示方式:

線的類型 表示方式
直線 -
虛線 --
點線 :
點劃線 -.
更多設置

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

  • 設置 figure

你可以認為Matplotlib繪制的圖形都在一個默認的 figure 中,當然了,你可以自己創(chuàng)建 figure,好處就是可以控制更多的參數(shù),常見的就是控制圖形的大小,這里創(chuàng)建一個 figure,設置大小為 (6, 3)。

plt.figure(figsize=(6, 3))
plt.plot(x, y)
plt.plot(x, y * 2)
plt.show()
image
  • 設置標題

來看下如何設置標題。

plt.plot(x, y)
plt.plot(x, y * 2)
plt.title("sin(x) & 2sin(x)")
plt.show()

image

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

  • 設置坐標軸

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

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()
image

通過 xlimylim 來設限定軸的范圍,通過 xlabelylabel 來設置軸的名稱。

此外,我們也可以通過 xticksyticks 來設置軸的刻度。

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()
image
  • 設置 label 和 legend
    設置 label 和 legend 的目的就是為了區(qū)分出每個數(shù)據(jù)對應的圖形名稱。
plt.plot(x, y, label="sin(x)")
plt.plot(x, y * 2, label="2sin(x)")
# plt.legend()
plt.legend(loc='best')
plt.show()
image
  • 添加注釋

有時候我們需要對特定的點進行標注,我們可以使用 plt.annotate 函數(shù)來實現(xiàn)。

這里我們要標注的點是(x0, y0) = (π, 0)。

我們也可以使用 plt.text 函數(shù)來添加注釋。

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='->', connectionstyle="arc3,rad=.2"))

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

plt.show()
image

對于 annotate 函數(shù)的參數(shù),做一個簡單解釋:
'sin(np.pi)=%s' % y0 代表標注的內容,可以通過字符串 %sy0 的值傳入字符串;
參數(shù)xycoords='data'是說基于數(shù)據(jù)的值來選位置;
xytext=(+30, -30)textcoords='offset points'表示對于標注位置的描述 和 xy 偏差值,即標注位置是 xy 位置向右移動 30,向下移動30;
arrowprops 是對圖中箭頭類型和箭頭弧度的設置,需要用 dict 形式傳入。

  • 使用子圖

有時候我們需要將多張子圖展示在一起,可以使用 subplot() 實現(xiàn)。即在調用 plot() 函數(shù)之前需要先調用 subplot() 函數(shù)。該函數(shù)的第一個參數(shù)代表子圖的總行數(shù),第二個參數(shù)代表子圖的總列數(shù),第三個參數(shù)代表活躍區(qū)域。

ax1 = plt.subplot(2, 2, 1) # (行,列,活躍區(qū))
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()
image

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

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

ax1 = plt.subplot(2, 1, 1) # (行,列,活躍區(qū))
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()
image

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

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

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

常見的圖形

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

  • 散點圖
    首先來看下如何繪制散點圖。
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()
image

上面我們首先生成了要繪制的數(shù)據(jù)的點xy,接下來為每個數(shù)據(jù)點生成控制大小的數(shù)組 size,然后未每個數(shù)據(jù)點生成控制顏色的數(shù)組 colour。最后通過 colorbar() 來增加一個顏色欄。

  • 柱狀圖
    柱狀圖我們經(jīng)常會用到,我們來看下如何畫出柱狀圖,并在圖上標注出數(shù)據(jù)對應的數(shù)值。
k = 10
x = np.arange(k)
y = np.random.rand(k)
plt.bar(x, y) # 畫出 x 和 y 的柱狀圖

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

plt.show()
image

生成數(shù)據(jù) xy 之后,調用 plt.bar 函數(shù)繪制出柱狀圖,然后通過 plt.text 標注數(shù)值,設置參數(shù) ha='center' 橫向居中對齊,設置 va='bottom'縱向底部(頂部)對齊。

  • 中文亂碼解決
    Matplotlib 有個讓人惱火的問題是,默認情況下,Matplotlib 中文會亂碼。
x = ['北京', '上海', '深圳', '廣州']
y = [60000, 58000, 50000, 52000]
plt.plot(x, y)
plt.show()
image

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

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

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

plt.plot(x, y)
plt.show()
image
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Python畫圖之總結待整理 https://morvanzhou.github.io/tutorials/dat...
    jiandanjinxin閱讀 17,694評論 1 14
  • 前言 有時候為了直觀,我們需要將數(shù)據(jù)可視化,Python編程中最為常用的一個庫是matplotlib。那么什么是m...
    開發(fā)者也閱讀 5,519評論 2 46
  • 一、概述 深度學習的一個重要手段是訓練數(shù)據(jù)和訓練過程的可視化,因此,我們關于深度學習的系列介紹文章就從Matplo...
    aoqingy閱讀 6,575評論 0 24
  • Matplotlib 入門教程 來源:Introduction to Matplotlib and basic l...
    布客飛龍閱讀 32,276評論 5 162
  • 1.感賞老板給我發(fā)200塊獎金 2.感賞老公今天給我轉500塊過來 3.感賞舊未聯(lián)系的阿姨請我吃飯 4.感賞師姐把...
    幸福萍寶閱讀 216評論 0 0

友情鏈接更多精彩內容