在數據分析、科學計算以及機器學習實踐中,數據往往不是先靠“計算結果”被理解,而是先靠“圖形表現”被看懂。數字本身當然重要,但當數據規模增大、變量關系變復雜時,僅僅閱讀一串數值,往往很難迅速把握整體特征。此時,圖形就成為理解數據的重要工具。
例如,一組數據如果直接寫成:
[10, 15, 20, 18, 25]我們只能大致知道它在變化,卻不容易立刻感受到變化的趨勢、波動的位置以及增長的快慢;但如果將它繪制成折線圖,數據走勢通常會立即變得清晰得多。也正因為如此,數據可視化幾乎貫穿于數據分析的整個過程:在探索階段幫助我們觀察分布,在建模階段幫助我們檢驗關系,在結果展示階段幫助我們傳達結論。
在 Python 生態中, 是最基礎、也最重要的可視化庫之一。許多更高級的可視化工具,本質上都與它存在直接或間接的聯系。
一、Matplotlib 是什么
Matplotlib 是 Python 中用于繪制二維圖形的通用可視化庫。它支持折線圖、散點圖、柱狀圖、直方圖、餅圖等多種常見圖形,也可以進一步擴展到更復雜的可視化任務。
它之所以被廣泛使用,主要有幾個原因。
第一,它覆蓋了數據分析中最常見的繪圖需求。無論是展示趨勢、比較類別、觀察分布,還是分析變量關系,Matplotlib 都能提供基礎支持。
第二,它與 NumPy、Pandas 等科學計算庫結合緊密。很多時候,我們并不是單獨“為了畫圖而畫圖”,而是在數組計算、表格處理、統計分析之后,順勢進入可視化階段。Matplotlib 恰好位于這條工作鏈的末端,是分析結果的主要展示工具之一。
第三,它具有較強的可定制性。圖中的線條、顏色、標簽、刻度、圖例、網格、尺寸、分辨率等,通常都可以調整。這使得它既適合教學演示,也適合科研繪圖和工程輸出。
安裝:
pip install matplotlib導入時最常見的寫法是:
import matplotlib.pyplot as plt這里的 pyplot 是 Matplotlib 中最常用的接口模塊。它提供了一套類似 MATLAB 風格的狀態式繪圖方式,因此在入門階段非常常見。不過,Matplotlib 并不僅僅只有這一種寫法。要真正理解它,必須先弄清楚它的圖形結構。
二、Matplotlib 的圖形結構
學習 Matplotlib 時,最容易混淆的問題之一,是“圖到底是什么”。很多初學者只記住了 plt.plot()、plt.show(),卻沒有真正理解一幅圖由哪些對象構成。實際上,Matplotlib 的圖形系統是有清晰層次的。
從整體上看,可以把它理解為:
Figure → Axes → 具體圖形元素
1、Figure:整個圖形對象
Figure 表示整個圖形對象,可以把它理解為一張完整的畫布。它是所有繪圖內容的最外層容器。圖像的尺寸、分辨率、整體布局等,通常都與 Figure 有關。
2、Axes:實際繪圖的區域
Axes 表示一個具體的繪圖區,也就是帶有坐標系的區域。絕大多數繪圖操作,實際上都發生在 Axes 上。折線、散點、柱子、標題、坐標軸標簽、圖例等,都通常依附于某個 Axes。
很多初學者會把 Axes 理解為“坐標軸”,這并不準確。更合適的理解是:Axes 是一個完整的繪圖區,其中包含橫軸、縱軸以及這個區域中的各種圖形元素。
3、圖形元素:線條、文本、圖例等
在 Axes 內部,還存在許多更具體的元素,例如:
? 折線
? 散點
? 柱形
? 標題
? 坐標軸標簽
? 圖例
? 網格線
這些是圖中真正被看到的內容。從使用角度看,初學階段只需要先把握 Figure 和 Axes 的關系即可,不必過早深入到底層對象體系。
4、直觀理解
可以把 Matplotlib 的結構粗略理解為:
└── 坐標軸如果一張圖中包含多個子圖,那么一個 Figure 中就會包含多個 Axes。
三、最基本的繪圖流程
無論繪制什么類型的圖形,Matplotlib 的基本過程大致都可以歸納為以下幾步:
1、準備數據
2、創建圖形對象或繪圖區
3、調用繪圖函數
4、添加標題、標簽、圖例、網格等輔助信息
5、顯示圖形或保存圖像
例如,下面是一段最基礎的繪圖代碼:
plt.show()![]()
這段代碼雖然很短,但已經包含了最核心的動作:
? x 和 y 是數據
? plt.plot(x, y) 用于繪制圖形
? plt.show() 用于顯示圖形
不過,這樣得到的圖通常還比較“原始”。在實際使用中,我們往往還需要進一步補充說明信息。例如:
plt.show()![]()
這時圖形就更完整了,因為它不僅有數據曲線,還有標題、坐標軸標簽、圖例和網格。對于讀者來說,圖形的可讀性會明顯提高。
四、最常見的幾類基礎圖形
Matplotlib 支持的圖形類型很多,但在入門階段,應先掌握最常見、最有代表性的幾類。它們分別對應不同的數據表達任務。
![]()
1、折線圖:觀察趨勢
折線圖是最常見的基礎圖形之一,適合展示數據隨某個變量的變化趨勢。例如時間序列、訓練輪次、函數曲線等,都常常使用折線圖。
示例:
plt.show()折線圖強調的是“連續變化”。如果我們關心的是走勢、波動、上升下降趨勢,那么它通常是首選。
2、散點圖:觀察變量關系
散點圖適合展示兩個變量之間的關系。每一個點對應一組觀測值,點的分布形態可以幫助我們初步判斷相關性、聚集趨勢或異常值。
示例:
plt.show()如果折線圖強調“連起來看變化”,那么散點圖更強調“分布在哪里、關系怎樣”。在回歸分析、相關分析和實驗觀察中,散點圖都很常見。
3、柱狀圖:比較類別大小
柱狀圖適合比較不同類別的數據大小。例如不同班級人數、不同商品銷量、不同模型準確率等,往往都可以用柱狀圖呈現。
示例:
plt.show()柱狀圖強調的是“類別間比較”。它不是為了展示連續變化,而是為了直觀比較不同項目之間的差異。
4、直方圖:觀察數據分布
直方圖與柱狀圖外觀相似,但含義不同。它不是用來比較離散類別,而是用來統計數據在各個區間中的分布情況。
示例:
plt.show()直方圖常用于回答這些問題:
? 數據主要集中在哪些范圍
? 數據分布是否對稱
? 是否接近正態分布
? 是否存在明顯偏態或異常集中現象
因此,在統計分析和機器學習的數據探索階段,直方圖尤其常見。
5、餅圖:展示整體中的占比
餅圖適合展示各部分在整體中的比例關系。
示例:
plt.show()餅圖雖然直觀,卻并不總是最優選擇。當類別較多或各部分差異不明顯時,餅圖的可讀性會明顯下降,這時柱狀圖往往更清晰。因此,餅圖適合在類別不多、比例關系明確時使用。
五、狀態式繪圖與面向對象繪圖
所謂“狀態式繪圖”,可以理解為:當前有一個默認的圖形環境,pyplot 會把你的操作自動作用到當前圖或當前繪圖區上。這種方式依賴的是 pyplot 提供的狀態式接口,優點是上手快,代碼短,適合簡單場景。
比如:
plt.show()但當圖形變復雜時,它也容易讓人分不清“當前到底在操作哪一個圖、哪一個子圖”。
因此,Matplotlib 官方更推薦另一種方式:面向對象繪圖。
1、面向對象寫法的基本形式
示例:
plt.show()? fig 表示整個圖形對象
? ax 表示具體繪圖區
也就是說,圖是先被創建出來的,然后再明確地在某個 ax 上繪制內容。
2、為什么更推薦面向對象方式
面向對象寫法的最大優點,是結構清楚。尤其當一張圖中包含多個子圖時,這種優勢會更加明顯。
示例:
plt.show()![]()
這里的兩個子圖各自對應一個 Axes 對象。因為每個圖都明確屬于自己的 ax,所以代碼更容易維護,也更不容易混亂。
3、如何理解兩種方式的關系
初學時,可以先用狀態式寫法快速熟悉繪圖流程;但隨著圖形復雜度提高,應逐步過渡到面向對象寫法。
從本質上說:
? plt.plot() 是在“當前 Axes 上畫圖”
? ax.plot() 是在“指定 Axes 上畫圖”
前者強調方便,后者強調清晰。
六、圖形修飾:讓圖真正可讀
一張圖并不是畫出來就結束了。真正有用的圖,通常還需要經過修飾,才能成為清晰的信息表達工具。
最常見的修飾包括以下幾類。
1、標題
標題告訴讀者這張圖在展示什么內容。沒有標題的圖,往往需要讀者自行猜測含義。
plt.title("Example Function")或在面向對象寫法中:
ax.set_title("Example Function")2、坐標軸標簽
橫軸和縱軸標簽用于說明變量含義。如果坐標軸沒有標簽,讀者常常不知道橫縱軸分別代表什么。
plt.ylabel("y")對應的面向對象寫法為:
ax.set_ylabel("y")3、圖例
當圖中有多條曲線或多個圖形對象時,圖例非常重要。它用于說明不同顏色、不同線條分別對應什么含義。
plt.legend()4、網格
網格不是必須的,但在很多圖中,它可以幫助讀者更容易估計位置和數值范圍,特別是在教學、分析和報告場景中很有幫助。
plt.grid(True)5、子圖間距調整
當一個 Figure 中有多個子圖時,標題、標簽和刻度文字可能互相擠壓。此時通常需要調整布局。
plt.tight_layout()它的作用是自動優化子圖之間的間距,減少重疊問題。
七、圖形顯示、保存與輸出后端
繪圖完成后,通常還需要處理兩個問題:一是怎樣顯示圖形,二是怎樣保存圖像。
1、顯示圖形
plt.show()在普通 Python 腳本中,通常需要顯式調用 show(),圖形窗口才會彈出。
在某些交互式環境中,圖形可能會自動顯示,但理解 show() 的作用仍然很重要。
2、保存圖像
plt.savefig("plot.png", dpi=300, bbox_inches="tight")這里:
? "plot.png" 是輸出文件名
? dpi=300 表示較高分辨率
? bbox_inches="tight" 表示盡量裁剪多余空白
一般來說,常見輸出格式包括 PNG、PDF、SVG 等。
其中,PNG 適合普通圖像輸出,PDF 和 SVG 更適合高質量文檔或矢量圖場景。
在實際使用中,通常建議先保存,再顯示。因為在某些環境中,如果先調用 show(),再調用 savefig(),可能會得到空白圖像。
示例:
plt.show()3、輸出后端
在 Matplotlib 中,圖形之所以能夠顯示在屏幕上,或保存為 PNG、PDF、SVG 等文件,背后都依賴于后端(backend)。可以把后端簡單理解為:圖形最終通過什么方式被顯示或輸出。
輸出后端常分為兩種:
? 交互式后端主要用于在窗口、瀏覽器或 Notebook 中顯示圖形
? 非交互式后端主要用于生成圖片文件或文檔圖形,而不強調界面交互
大多數情況下,Matplotlib 會自動選擇合適的后端,因此不需要手動設置。
如果想查看當前 Matplotlib 使用的后端,可以寫:
print(matplotlib.get_backend())如果確實需要手動設置后端,可以寫:
matplotlib.use("Agg")"Agg" 表示基于 Anti-Grain Geometry 渲染引擎的非交互式后端,主要用于生成高質量的位圖圖像文件,如 PNG。
八、中文顯示與簡單全局配置
在中文環境下,Matplotlib 的一個常見問題是:圖中中文可能無法正常顯示,或者負號顯示異常。這并不是繪圖函數本身的問題,而通常與默認字體配置有關。
一種常見處理方式是使用 rcParams 設置全局參數:
plt.rcParams["axes.unicode_minus"] = False這里:
? font.sans-serif 用于指定無襯線字體列表
? axes.unicode_minus = False 用于避免負號顯示異常
這類設置屬于全局默認配置,會影響后續創建的圖形。
除了字體外,還可以通過 rcParams 調整默認圖像尺寸、分辨率、線寬等內容。例如:
plt.rcParams["figure.dpi"] = 120一般從說,不必一次記住太多全局參數。只需知道:Matplotlib 不僅可以“在單張圖上修改”,也可以通過全局配置改變后續圖形的默認行為。
九、綜合示例
下面給出一個簡單的綜合示例,將圖形創建、繪圖、修飾與輸出串聯起來。
小結
Matplotlib 是 Python 中最基礎的數據可視化庫。學習它的關鍵,不只是會調用 plot()、scatter()、bar() 這樣的函數,更重要的是理解 Figure 與 Axes 的結構關系,以及“準備數據—創建圖形—繪制內容—修飾圖形—顯示或保存”的基本流程。當這條主線建立起來之后,后續無論是學習更復雜的繪圖函數,還是處理多子圖、樣式配置與圖像輸出,都會更自然、更穩固。
“點贊有美意,贊賞是鼓勵”
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.