python matplotlib 画图神器
Matplotlib 是 Python 的一個繪圖庫。它包含了大量的工具,你可以使用這些工具創建各種圖形,包括簡單的散點圖,正弦曲線,甚至是三維圖形。
# 導入相關模塊 import matplotlib.pyplot as plt import numpy as np畫一個簡單的圖形
這里我們通過畫出一個正弦曲線圖來講解下基本用法。
首先通過 np.linspace 方式生成 x,它包含了 50 個元素的數組,這 50 個元素均勻的分布在 [0, 2pi] 的區間上。然后通過 np.sin(x) 生成 y。
x = np.linspace(0, 2 * np.pi, 50) y = np.sin(x)有了 x 和 y 數據之后,我們通過 plt.plot(x, y) 來畫出圖形,并通過 plt.show() 來顯示。
plt.plot(x, y) plt.show()在一張圖紙里繪制多個圖形
有時候,可能需要在一個圖紙里繪制多個圖形,這里我們同時繪制了 (x, y), (x, y * 2)兩個圖形。
plt.plot(x, y) plt.plot(x, y * 2) plt.show()繪制出圖形之后,我們可以自己調整更多的樣式,比如顏色、點、線。
plt.plot(x, y, 'y*-') plt.plot(x, y * 2, 'm--') plt.show()可以看到,設置樣式時,就是增加了一個字符串參數,比如 'y-' ,其中 y 表示黃色,?*表示星標的點,-- 表示虛線。
這里列舉一些常見的顏色表示方式:
| 藍色 | b |
| 綠色 | g |
| 紅色 | r |
| 青色 | c |
| 品紅 | m |
| 黃色 | y |
| 黑色 | k |
| 白色 | w |
常見的點的表示方式:
| 點 | . |
| 像素 | , |
| 圓 | o |
| 方形 | s |
| 三角形 | ^ |
常見的線的表示方式:
| 直線 | - |
| 虛線 | -- |
| 點線 | : |
| 點劃線 | -. |
更多設置
Matplotlib 支持各種靈活的設置,這里我們列舉一些常見的內容。
- 設置 figure
你可以認為Matplotlib繪制的圖形都在一個默認的 figure 中,當然了,你可以自己創建 figure,好處就是可以控制更多的參數,常見的就是控制圖形的大小,這里創建一個 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()?
直接通過 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()通過 xlim 和 ylim 來設限定軸的范圍,通過 xlabel 和 ylabel 來設置軸的名稱。
此外,我們也可以通過 xticks 和 yticks 來設置軸的刻度。
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()- 設置 label 和 legend
設置 label 和 legend 的目的就是為了區分出每個數據對應的圖形名稱。
- 添加注釋
有時候我們需要對特定的點進行標注,我們可以使用 plt.annotate 函數來實現。
這里我們要標注的點是(x0, y0) = (π, 0)。
我們也可以使用 plt.text 函數來添加注釋。
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()?
對于 annotate 函數的參數,做一個簡單解釋:
'sin(np.pi)=%s' % y0 代表標注的內容,可以通過字符串 %s 將 y0 的值傳入字符串;
參數xycoords='data'是說基于數據的值來選位置;
xytext=(+30, -30) 和textcoords='offset points'表示對于標注位置的描述 和 xy 偏差值,即標注位置是 xy 位置向右移動 30,向下移動30;
arrowprops 是對圖中箭頭類型和箭頭弧度的設置,需要用 dict 形式傳入。
- 使用子圖
有時候我們需要將多張子圖展示在一起,可以使用 subplot() 實現。即在調用 plot() 函數之前需要先調用 subplot() 函數。該函數的第一個參數代表子圖的總行數,第二個參數代表子圖的總列數,第三個參數代表活躍區域。
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()上面的 subplot(2, 2, x) 表示將圖像窗口分為 2 行 2 列。x 表示當前子圖所在的活躍區。
可以看到,上面的每個子圖的大小都是一樣的。有時候我們需要不同大小的子圖。比如將上面第一張子圖完全放置在第一行,其他的子圖都放在第二行。
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()簡單解釋下,plt.subplot(2, 1, 1) 將圖像窗口分為了 2 行 1 列, 當前活躍區為 1。
使用 plt.subplot(2, 3, 4) 將整個圖像窗口分為 2 行 3 列, 當前活躍區為 4。
解釋下為什么活躍區為 4,因為上一步中使用 plt.subplot(2, 1, 1) 將整個圖像窗口分為 2 行 1 列, 第1個小圖占用了第1個位置, 也就是整個第1行. 這一步中使用 plt.subplot(2, 3, 4) 將整個圖像窗口分為 2 行 3 列, 于是整個圖像窗口的第1行就變成了3列, 也就是成了3個位置, 于是第2行的第1個位置是整個圖像窗口的第4個位置。
常見的圖形
這里帶大家畫一些常見的示例圖。
- 散點圖
首先來看下如何繪制散點圖。
上面我們首先生成了要繪制的數據的點x 和 y,接下來為每個數據點生成控制大小的數組 size,然后未每個數據點生成控制顏色的數組 colour。最后通過 colorbar() 來增加一個顏色欄。
- 柱狀圖
柱狀圖我們經常會用到,我們來看下如何畫出柱狀圖,并在圖上標注出數據對應的數值。
生成數據 x 和 y 之后,調用 plt.bar 函數繪制出柱狀圖,然后通過 plt.text 標注數值,設置參數 ha='center' 橫向居中對齊,設置 va='bottom'縱向底部(頂部)對齊。
- 中文亂碼解決
Matplotlib 有個讓人惱火的問題是,默認情況下,Matplotlib 中文會亂碼。
可以看到,上面所有的中文都亂碼了,顯示成方框了,如何解決呢?
其實只需要配置下后臺字體即可。
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號plt.plot(x, y) plt.show()歡迎關注公眾號:算法工程師的學習日志
總結
以上是生活随笔為你收集整理的python matplotlib 画图神器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows Pycharm 常用快捷
- 下一篇: YOLO系列算法精讲:从yolov1至y