Python 繪圖,我只用 Matplotlib(二)

2021-02-21 極客猴

Photo by MontyLov on Unsplash


上篇文章,我們了解到 Matplotlib 是一個風格類似 Matlab 的基於 Python 的繪圖庫。它提供了一整套和matlab相似的命令API,十分適合交互式地進行製圖。而且我們也可以方便地將它作為繪圖控制項,嵌入GUI應用程式中。本文主要走進 Matplotlib 的世界,初步學會繪製圖形。

在學習繪製之前,先來了解下 Matplotlib 基礎概念。


我們繪製圖形主要用到兩個庫,matplotlib.pyplot 和 numpy。在編碼過程中,這兩個庫的使用頻率較高,而這兩個庫的名字較長。這難免會給我們帶來不便。所以我們一般給其設置別名, 大大減少重複性工作量。具體如下代碼:


import matplotlib.pyplot as plt  
import numpy as np          


numpy 是 Python 用於數學運算的庫,它是在安裝 matplotlib 時候順帶安裝的。pyplot 是 matplotlib 一個子模塊,主要為底層的面向對象的繪圖庫提供狀態機界面。狀態機隱式地自動創建數字和坐標軸以實現所需的繪圖。 matplotlib 中的所有內容都按照層次結果進行組織。頂層就是由 pyplot 提供的 matplotlib 「狀態機環境」。基於這個狀態機環境,我們就可以創建圖形。


我在 matplotlib 官網上找圖像組件說明圖並在上面增加中文翻譯。通過這張圖,我們對 matplotlib 整體地認識。

接下來,我主要講解 matplotlib 中幾個重要的標籤。


Figure 翻譯成中文是圖像窗口。Figure 是包裹 Axes、tiles、legends 等組件的最外層窗口。它其實是一個 Windows 應用窗口 。

Figure 中最主要的元素是 Axes(子圖)。一個 Figure 中可以有多個子圖,但至少要有一個能夠顯示內容的子圖。


Axes 翻譯成中文是軸域/子圖。Axes 是帶有數據的圖像區域。從上文可知,它是位於 Figure 裡面。那它和 Figure 是什麼關係?這裡可能文字難以表述清楚,我以圖說文。用兩圖帶你徹底弄清它們的關係。


在看運行結果之前,我先呈上代碼給各位看官品嘗。


fig = plt.figure()                
fig.suptitle('No axes on this figure')  

fig, ax_lst = plt.subplots(2, 2) 
plt.show()


根據運行結果圖,我們不難看出。左圖的 Figure1 中沒有 axes,右圖的 Figure2 中有 4 個 axes。因此,我們可以將 Axes 理解為面板,而面板是覆在窗口(Figure) 上。 


Axis 在中文的意思是軸。官網文檔對 Axis 定義解釋不清楚,讓我們看得雲裡霧裡的。如果你有留意前文的組成說明圖,可以看到 X Axis 和 Y Axis 的字樣。按照平常人的見識, 觀察該圖就能明白 Axis 是軸的意思。此外,Axis 和 Axes 以及 Figure 這三者關係,你看完下圖,會恍然大悟。


按照劇本發展,我接下來以繪製曲線並逐步美化它為例子,一步步講解如何繪製圖形。在這過程中,我也會逐一說明各個函數的作用。



import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 6, 50)
y1 = x + 3      
y2 = 3 - x      
plt.figure()    
plt.plot(x, y1)  
plt.plot(x, y2)  
plt.show()


調用 np.linspace 是創建一個 numpy 數組,並記作 x。x 包含了從 -2 到 6 之間等間隔的 50 個值。y1 和 y2 則分別是這 50 個值對應曲線的函數值組成的 numpy 數組。前面的操作還處於設置屬性的階段,還沒有開始繪製圖形。plt.figure() 函數才意味著開始執行繪圖操作。最後別忘記調用 show() 函數將圖形呈現出來。



我們已經繪製出兩條直線,但樣式比較簡陋。所以我給兩條曲線設置鮮豔的顏色、線條類型。同時,還給縱軸和橫軸的設置上下限,增加可觀性。


import matplotlib.pyplot as plt
import numpy as np


plt.figure(figsize=(8, 6), dpi=80)


plt.subplot(111)

x = np.linspace(-2, 6, 50)
y1 = x + 3        
y2 = 3 - x        


plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-")

plt.plot(x, y2, color="#800080", linewidth=2.0, linestyle="--")


plt.xlim(-1, 6)

plt.ylim(-2, 10)

plt.show()



在圖像中,我們不能一味地認為橫軸就是 X 軸,縱軸就是 Y 軸。圖形因內容數據不同,縱橫軸標籤往往也會不同。這也體現了給縱橫軸設置標籤說明的重要性。


...
# 設置橫軸標籤
plt.xlabel("X")
# 設置縱軸標籤
plt.ylabel("Y")

plt.show()



matplotlib 畫圖設置的刻度是由曲線以及窗口的像素點等因素決定。這些刻度精確度無法滿足需求,我們需要手動添加刻度。上圖中,縱軸只顯示 2 的倍數的刻度,橫軸只顯示 1 的倍數的刻度。我們為其添加精準刻度,縱軸變成單位間隔為 1 的刻度,橫軸變成單位間隔為 0.5 的刻度。


...

plt.xticks([-1, -0.5, 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5])

plt.yticks([-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

plt.show()


xticks() 和 yticks() 需要傳入一個列表作為參數。

該方法默認是將列表的值來設置刻度標籤,如果你想重新設置刻度標籤,則需要傳入兩個列表參數給 xticks() 和 yticks() 。第一個列表的值代表刻度,第二個列表的值代表刻度所顯示的標籤。


...

plt.xticks([-1, 0, 1, 2, 3, 4, 5, 6],
          ["-1m", "0m", "1m", "2m", "3m", "4m", "5m", "6m"])

plt.yticks([-2, 0, 2, 4, 6, 8, 10],
          ["-2m", "0m", "2m", "4m", "6m", "8m", "10m"])
plt.show()



如果需要在圖的左上角添加一個圖例。我們只需要在 plot() 函數裡以「鍵 - 值」的形式增加一個參數。首先我們需要在繪製曲線的時候,增加一個 label 參數,然後再調用 plt.legend() 繪製出一個圖例。plt.legend() 需要傳入一個位置值。loc 的值可選如下:

值說明best自動選擇最佳位置,默認是左上upper right右上upper left左上lower right右下lower left左下right右邊,默認是右上。如果因圖形擋住右上,會自動往下選擇空白地方繪製center right垂直居中且靠右center left垂直居中且靠左lower center垂直居中且靠底部upper center垂直居中且靠頂部center居中

...

plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="y1")

plt.plot(x, y2, color="#800080", linewidth=2.0, linestyle="--", label="y2")
plt.legend(loc="upper left")
...


有時某些數據點非常關鍵,需要突顯出來。我們需要將改點繪製出來,即繪製散點圖,再對其做注釋。實現上述需求,我們要用到 scatter()annotate() 函數。scatter() 是用於繪製散圖,這裡我們只是用其來繪製單個點。scatter() 用法,後續文章會詳細對其用法做說明。annotate() 則是添加標註 。


scatter() 函數必須傳入兩個參數 x 和 y。值得注意得是,它們的數據類型是列表。x 代表要標註點的橫軸位置,y 代表要標註點的橫軸位置。x 和 y 列表中下標相同的數據是對應的。例如 x 為 [3, 4],y 為 [6, 8],這表示會繪製點(3,6),(4, 8)。因此,x 和 y 長度要一樣。


annotate() 函數同樣也有兩個必傳參數,一個是標註內容,另一個是 xy。標註內容是一個字符串。xy 表示要在哪個位置(點)顯示標註內容。xy 位置地選定。一般是在 scatter() 繪製點附近,但不建議重合,這樣會影響美觀。


...

plt.plot(x, y1, color="blue", linewidth=1.0, linestyle="-", label="y1")

plt.scatter([3], [6], s=30, color="blue")      

plt.annotate("(3, 6)",
            xy=(3.3, 5.5),    
            fontsize=16,    
            xycoords='data')  


plt.plot(x, y2, color="#800080", linewidth=2.0, linestyle="--", label="y2")

plt.scatter([3], [0], s=50, color="#800080")

plt.annotate("(3, 0)",
            xy=(3.3, 0),    
            fontsize=16,    
            xycoords='data')  

點已經被標註出來了,如果你還想給點添加注釋。這需要使用 text() 函數。text(x,y,s) 作用是在點(x,y) 上添加文本 s。matplotlib 目前好像對中午支持不是很友好,中文均顯示為亂碼。


...

plt.scatter([3], [0], s=50, color="#800080")

plt.annotate("(3, 0)", xy=(3.3, 0))
plt.text(4, -0.5, "this point very important",
        fontdict={'size': 12, 'color': 'green'})  


到此為止,我們基本上完成了繪製直線所有工作。Matplotlib 能繪製種類繁多且繪圖功能強大,所以我接下來的文章將單獨對每種類型圖做分享講解。

作者:猴哥

公眾號:極客猴

愛好讀書,喜歡鑽研技術,夢想成為文藝青年的 boy。


相關焦點

  • 「繪圖,讓科學生動起來」:Python-matplotlib繪圖(專題一)python環境搭建篇
    筆者寄語:各位好,從今天開始,「科學是什麼東東」將推出一個全新系列專題:採用時下最流行的python計算機設計語言,對其中的一個第三方繪圖庫,即matplotlib繪圖庫進行講解,並將其強大的繪圖與編程功能應用到數學函數,化學,地理,物理,教育等諸多領域。
  • 如何用matplotlib繪圖呢?
    什麼是matplotlib?使用過python做數據分析的小夥伴都知道,matplotlib是一款命令式、較底層、可定製性強、圖表資源豐富、簡單易用、出版質量級別的python 2D繪圖庫。matplotlib算是python繪圖的元老級庫,類似程式語言裡的C語言。很多其它的python繪圖庫是基於matplotlib開發的,比如seaborn、ggplot、plotnine、holoviews、basemap等。matplotlib可用於python腳本、python shell、jupyter notebook、web等。
  • python:matplotlib入門詳細教程
    與之齊名,matplotlib作為數據科學的的另一必備庫,算得上是python可視化領域的元老,更是很多高級可視化庫的底層基礎,其重要性不言而喻。本篇對matplotlib進行系統性介紹,不會面面俱到,但求體系完備、詳略得當。
  • python使用matplotlib畫動態圖
    matplotlib是python的核心繪圖庫,是python的一個開源項目,旨在為python提供一個繪圖庫。matplotlib與numpy組合是一種可行的matlab替代方案。在可視化中matplotlib是最常使用的工具,是對數據整體判斷、效果預測不可或缺的重要模塊。
  • python數據科學系列:matplotlib入門詳細教程
    與之齊名,matplotlib作為數據科學的的另一必備庫,算得上是python可視化領域的元老,更是很多高級可視化庫的底層基礎,其重要性不言而喻。本篇對matplotlib進行系統性介紹,不會面面俱到,但求體系完備、詳略得當。
  • python - matplotlib繪圖
    一、繪圖基礎import matplotlib.pyplot as pltimport numpy as npimport tensorflow as tfimport pandas as pd>'''Matplotlib中的pyplot子庫可用來快速繪製二維圖表figure 創建畫布plot 繪製圖形show 顯示繪圖figure(num,figsize,dpi,facecolor
  • Python matplotlib繪圖示例 - 繪製三維圖形
    Python matplotlib模塊是擴展的MATLAB的一個繪圖工具庫。
  • Matplotlib入門詳細教程
    行文目錄結構,重點是右三分支matplotlib是python的一個繪圖庫,與numpy、pandas共享數據科學三劍客的美譽,也是很多高級可視化庫的基礎。matplomatplotlib不是python內置庫,調用前需手動安裝,且需依賴numpy庫。截至當前,matplotlib發行版本號為3.2.1,適配python3.6及以上版本。
  • Python 數據分析:Matplotlib 繪圖
    簡介Matplotlib 是 Python 提供的一個繪圖庫,通過該庫我們可以很容易的繪製出折線圖、直方圖、散點圖、餅圖等豐富的統計圖,安裝使用 pip install matplotlib 命令即可,Matplotlib 經常會與 NumPy 一起使用。
  • 高效使用 Python 可視化工具 Matplotlib
    如果你花時間了解了這一點,才會理解matplotlib API的其餘部分。此外,許多python的高級軟體包,如seaborn和ggplot都依賴於matplotlib。因此,了解這些基礎知識後再學那些功能更強大的框架會容易一些。最後,我不是說你應該避免選擇例如ggplot(aka ggpy),bokeh,plotly或者altair等其他更好的工具。
  • matplotlib繪圖的核心原理講解
    作者:朱小五來自:凹凸數據(ID:alltodata)matplotlib是基於Python語言的開源項目,旨在為Python提供一個數據繪圖包。相信大家都用過它來數據可視化,之前我還分享過25個常用Matplotlib圖的Python代碼。
  • matplotlib繪圖邏輯(上)
    matplotlib繪圖邏輯(上)matplotlib是一個基於Python的繪圖庫,具有對2D的完全支持和對3D圖形的有限支持,在Python科學計算社區中廣泛使用。本文對matplotblib的基本繪圖邏輯進行了比較詳細的梳理。寫作過程中參考了很多資料,由於筆記是斷續的,有些可能忘記引用,在此表達感謝。
  • Python 繪圖庫 Matplotlib 入門教程
    /Matplotlib是一個Python語言的2D繪圖庫,它支持各種平臺,並且功能強大,能夠輕易繪製出各種專業的圖像。筆者推薦大家通過pip的方式進行安裝,具體方法如下:sudo pip3 install matplotlib本文的代碼在如下環境中測試:Apple OS X 10.13Python 3.6.3matplotlib 2.1.1numpy 1.13.3介紹
  • 專題第19篇:Python繪圖神器之matplotlib
    我的施工之路今天,繼續施工專題第19篇:Python繪圖神器:matplotlib(上)使用版本本文使用的 matplotlib 版本: 3.1.3使用的 NumPy版本: 1.18.1順便說一句,matplotlib 的近親是 NumPy,對其的親緣性最好,無縫支持。
  • Python Matplotlib入門學習(一)
    的官方文檔帶領大家學習如何進行基本繪圖。Matplotlib是一個相當大的繪圖工具庫,我們這次討論的主要的是pyplot接口(api)也就是我們經常看到的,諸多代碼在使用前調用的:import matplotlib.pyplot as plt官網解釋到:
  • Python 繪圖,我只用 Matplotlib
    圖1-1 散點圖示例使用Matplotlib的scatter()函數繪製散點圖,其中x和y是相同長度的數組序列。scatter()函數的一般用法為:主要參數說明如下:x,y:數組。s:散點圖中點的大小,可選。c:散點圖中點的顏色,可選。 marker:散點圖的形狀,可選。alpha:表示透明度,在 0~1 取值,可選。
  • Python-Matplotlib: 官方學習手冊獲取與學習
    它利用通用的圖形用戶界面工具包,如Tkinter, wxPython, Qt或GTK+,向應用程式嵌入式繪圖提供了應用程式接口(API)。此外,matplotlib還有一個基於圖像處理庫(如開放圖形庫OpenGL)的pylab接口,其設計與MATLAB非常類似--儘管並不怎麼好用。SciPy就是用matplotlib進行圖形繪製。matplotlib最初由John D.
  • python matplotlib畫圖教程學習:使用介紹
    本篇文章介紹matplotlib包使用時,需要掌握的一些基本概念。除了圖中顯示的紅藍線型圖和散點圖,matplotlib還能繪製柱形圖、燭型圖、餅圖、3D圖形等等各種個性化圖形,將在後續文章一一介紹。canvas對象一般不可見,通常無需直接操作該對象,matplotlib程序實際繪圖時需要調用該對象。Axes對象字面上理解,axes是數據軸axis的複數,但它並不是指數據軸,而是子圖對象。
  • Matplotlib繪圖遇到時間刻度就犯難?現在,一次性告訴你四種方法
    最近有小夥伴私信我關於matplotlib時間類型刻度的設置問題,第一感覺就是官網有好多例子介紹啊 轉念一想,在實際應用中類似設置還挺多和好多小夥伴詢問,那麼本期就就簡單介紹下Python-matplotlib「刻度(ticker)」 的使用方法,並結合具體例子講解時間刻度設置問題,使小夥伴們定製化刻度不再煩惱
  • Python matplotlib基礎繪圖函數示例
    X,Y,Z,N)繪製等值圖plt.vlines()繪製垂直圖plt.stem(x,y,linefmt,markerfmt)繪製柴火圖plt.plot_date()繪製數據日期程序示例:繪製餅圖:# -*- coding:utf-8 -*-import matplotlib.pyplot