前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 Matplotlib 是一個 Python 的 2D繪圖庫(當然也可以畫三維形式的圖形哦),它以各種硬拷貝格式和跨平臺的互動式環境生成出版質量級別的圖形 。通過 Matplo ...
前言
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。
Matplotlib 是一個 Python 的 2D繪圖庫(當然也可以畫三維形式的圖形哦),它以各種硬拷貝格式和跨平臺的互動式環境生成出版質量級別的圖形 。通過 Matplotlib,開發者僅需要幾行代碼,便可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等。
Matplotlib 主要有兩大模塊:pyplot 和 pylab,這二者之間有何區別和聯繫呢?
首先 pyplot 和 pylab 都可以畫出圖形,且兩者 API 也是類似的, 其中 pylab 包括了許多 numpy 和 pyplot 模塊中常用的函數,對互動式使用(如在 IPython 互動式環境中)來說比較方便,既可以畫圖又可以進行計算,不過官方推薦對於項目編程最好還是分別導入 pyplot 和 numpy 來作圖和計算。
先來個簡單的
import numpy as np from matplotlib import pyplot as plt x = np.arange(0, 11) y = 2*x plt.plot(x, y, marker='o') plt.show()
同一幅圖中多條線
x = np.arange(0, 11) y1 = 2*x y2 = 4*x # g-- 表示綠色虛線 r- 表示紅色實線 plt.plot(x, y1, 'g--') plt.plot(x, y2, 'r-') plt.show()
Matplotlib Api 風格
Matplotlib 有兩種編程風格,一種是 Matlab 用戶熟悉的風格,一種是面向對象式的風格,推薦後者
Matlab 風格的 Api
plt.figure(figsize=(10, 5)) x = [1, 2, 3] y = [2, 4, 6] plt.plot(x, y, 'r') plt.xlabel('x axis') plt.ylabel('y axis') plt.title('figure title') plt.show()
面向對象風格的 Api
fig = plt.figure(figsize=(10, 5)) # add_subplot(nrows, ncols, index, **kwargs) 預設 (1, 1, 1) axes = fig.add_subplot() x = [1, 2, 3] y = [2, 4, 6] axes.plot(x, y, 'r') axes.set_xlabel('x axis') axes.set_ylabel('y axis') axes.set_title('figure title') plt.show()
都得到以下圖形
多個子圖
fig: plt.Figure = plt.figure(figsize=(10, 5)) axes1 = fig.add_subplot(2, 1, 1) # (nrows, ncols, index) # 與 axes1 共用x,y軸 # the axis will have the same limits, ticks, and scale as the axis # facecolor: 坐標軸圖形背景顏色 axes2 = fig.add_subplot(2, 1, 2, sharex=axes1, sharey=axes1, facecolor='k') x = np.linspace(-5, 5, 100) y1 = np.sin(x) y2 = np.cos(x) axes1.plot(x, y1, color='red', linestyle='solid') axes2.plot(x, y2, color='#00ff00', linestyle='dashed') axes1.set_title('axes1 title') axes2.set_title('axes2 title') plt.show()
# 設置圖的位置、大小 axes1 = fig.add_axes([0.1, 0.1, 0.8, 0.8]) # [left, bottom, width, height] axes2 = fig.add_axes([0.7, 0.7, 0.2, 0.2])
對象關係
在 matplotlib 中,整個圖像為一個 Figure 對象。在 Figure 對象中可以包含一個,或者多個 Axes 對象,每個 Axes 對象都是一個擁有自己坐標系統的繪圖區域。
Title——標題 Axis——坐標軸 Label——坐標軸標註 Tick——刻度線 Tick Label——刻度註釋
設置樣式
設置圖形樣式時可參考以下表
axes.plot(x, y, color='red', linestyle='solid', marker='o')
顏色
簡寫形式
線類型
點標記
只列出了常用的(只支持簡寫形式)
圖例
axes.plot(x, y, 'r', label='y=2x') # or axes.set_label('y=2x') axes.legend(loc='upper right') # 預設 legend(loc='best') # 同時設置多個 plt.legend((axes1, axes2, axes3), ('label1', 'label2', 'label3'))
調整坐標軸的上下限
# xlim(left=None, right=None, emit=True, auto=False, *, xmin=None, xmax=None) # ylim(bottom=None, top=None, emit=True, auto=False, *, ymin=None, ymax=None) axes.set_xlim(0, 8) axes.set_ylim(0, 8)
直至坐標軸顯示間隔
from matplotlib.ticker import MultipleLocator # 如設置主要刻度線間隔為 2 axes.xaxis.set_major_locator(MultipleLocator(2))
調整坐標軸標簽的顯示
# 當點比較密集時,x 軸刻度線標簽可能會重疊在一起,尤其是時間時 # 1. 對於時間可以使用 autofmt_xdate 自動調整對齊和旋轉 fig.autofmt_xdate() # 2. 通用的 ax.set_xticklabels(xticks, rotation=30, ha='right') # 對於日期顯示還可以自定義格式 from matplotlib.dates import DateFormatter ax.xaxis.set_major_formatter(DateFormatter('%Y-%m'))
設置坐標軸名稱
# 坐標軸下方或左邊顯示的標簽 ax.set_xlabel('Time Series') ax.set_ylabel('Microseismicity')
綜合示例
fig = plt.figure() axes = fig.add_subplot() t = np.linspace(0, np.pi, 64) x = np.sin(t) y = np.cos(t) + np.power(x, 2.0 / 3) # 採用參數定義樣式 axes.plot(x, y, color='red', marker='o', linestyle='solid', linewidth=2, label='x>0') # 採用簡寫 color marker linestyle 沒有順序之分,不需要都寫 axes.plot(-x, y, 'ro-', linewidth=2, label='x<0') # 設置標題 axes.set_title('心型圖', fontdict={'size': 16, 'color': 'r', 'family': 'SimHei'}) # 設置坐標軸數值範圍 axes.set_xlim(-1.5, 1.5) # 設置坐標軸刻度線 axes.set_xticks([-1.5, -1, 0, 1, 1.5]) # 設置坐標軸刻度線標簽,不設置則是坐標軸數值 axes.set_xticklabels(['-1.5', '-1', '原點', '1', '1.5'], fontdict={'family': 'SimHei'}) # 設置顯示圖例 axes.legend() # 設置顯示網格線 axes.grid(color='#cccccc', ls='-.', lw=0.25) plt.show()
一些配置項
# 使用 pycharm 運行 plt.show() 預設不在獨立視窗顯示(terminal 運行可以) # 切換 backend 為 TkAgg 時, pycharm 運行可以在獨立視窗展示圖,同時 terminal 運行也可以 # 預設 non-interactive backends = agg # 如果不切換 backend 又想在獨立視窗顯示,可以按如下設置 # File -> Settings -> Tools -> Python Scientific -> 去掉Show plots in tool window勾選 plt.switch_backend('TkAgg') # 當 figure 開啟超過 20 個時會有警告(一般迴圈畫圖出現),可以主動 close 圖 for y in data: fig: plt.Figure = plt.figure() axes = fig.add_subplot() axes.plot(y, color='red', marker='o', linestyle='solid') plt.savefig('xxx.png') plt.close() # 設置網格線 plt.grid(True) # 設置字體,預設不支持中文顯示,可以指定中文字體來顯示中文 plt.rcParams["font.family"] = 'SimHei' # mac os可以使用 Heiti TC # 也可以在使用的時候分別設置 axes.set_title('中文字體 SimHei', fontdict={'size': 16, 'color': 'r', 'family': 'SimHei'}) # 解決坐標軸負數的負號顯示問題 plt.rcParams['axes.unicode_minus'] = False
圖形類型