一周學會Matplotlib3 Python 數據可視化-多子圖及布局實現

鋒哥原創的Matplotlib3 Python數據可視化視頻教程:

2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili

課程介紹


本課程講解利用python進行數據可視化 科研繪圖-Matplotlib,學習Matplotlib圖形參數基本設置,繪圖參數及主要函數,以及Matplotlib基礎繪圖,和Matplotlib高級繪圖。

多子圖及布局實現

Matplotlib 提供了多種創建多子圖布局的方式,適用于數據對比、多維度可視化等場景。以下是三種核心方法及示例:

方法一:plt.subplots()(推薦)

適用場景:創建均勻網格布局的子圖

plt.subplots() 是 Matplotlib 中用于批量創建圖形(Figure)和子圖(Axes)的核心函數。它簡化了多子圖的布局管理,比傳統的 plt.subplot() 更靈活高效。下面從功能、參數到示例詳細解析:

fig, axes = plt.subplots(nrows=1, ? ? ? ? ? # 子圖行數 (默認1)ncols=1, ? ? ? ? ? # 子圖列數 (默認1)sharex=False, ? ? ?# 是否共享x軸sharey=False, ? ? ?# 是否共享y軸figsize=None, ? ? ?# 圖形大小 (元組: (寬, 高))constrained_layout=False, ?# 自動調整布局**kwargs ? ? ? ? ? # 其他Figure參數 (如dpi, facecolor等)
)

我們看一個示例:

import matplotlib.pyplot as plt
import numpy as np
?
# 設置中文字體支持
plt.rcParams['font.sans-serif'] = ['SimHei'] ?# 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False ?# 用來正常顯示負號
?
# 生成數據
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x / 8)
?
# 創建2×2子圖布局 (返回Figure對象和Axes數組)
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
fig.suptitle('2×2 子圖示例', fontsize=16)
?
# 繪制第一個子圖
axs[0, 0].plot(x, y1, 'r-')
axs[0, 0].set_title('正弦函數')
axs[0, 0].grid(True)
?
# 繪制第二個子圖
axs[0, 1].plot(x, y2, 'b--')
axs[0, 1].set_title('余弦函數')
axs[0, 1].set_facecolor('#f0f0f0') ?# 設置背景色
?
# 繪制第三個子圖 (對數坐標)
axs[1, 0].semilogy(x, y4, 'g-')
axs[1, 0].set_title('指數函數(對數Y軸)')
axs[1, 0].set_xlabel('X軸')
?
# 繪制第四個子圖 (設置Y軸范圍)
axs[1, 1].plot(x, y3, 'm-.')
axs[1, 1].set_title('正切函數')
axs[1, 1].set_ylim(-5, 5) ?# 限制Y軸范圍
?
# 調整布局
plt.tight_layout(rect=[0, 0, 1, 0.96]) ?# 為總標題留空間
plt.show()

運行截圖:

方法二:GridSpec(復雜布局)

適用場景:創建不規則大小的子圖

GridSpec 是 Matplotlib 中用于創建復雜、非均勻子圖布局的高級工具。它提供了比 plt.subplots() 更精細的控制,允許你定義不同大小的子圖、跨行列的子圖以及復雜的布局比例。

核心概念

GridSpec 通過定義一個網格系統來工作:

  • 將整個圖形區域劃分為行和列的網格

  • 允許子圖跨越多個網格單元

  • 支持設置行和列的相對大小比例

基本語法:

from matplotlib.gridspec import GridSpec
?
# 創建 GridSpec 對象
gs = GridSpec(nrows, ? ? ? ? ? ? ?# 網格總行數ncols, ? ? ? ? ? ? ?# 網格總列數figure=None, ? ? ? ?# 關聯的 Figure 對象left=None, ? ? ? ? ?# 網格左側位置 (0-1)right=None, ? ? ? ? # 網格右側位置 (0-1)bottom=None, ? ? ? ?# 網格底部位置 (0-1)top=None, ? ? ? ? ? # 網格頂部位置 (0-1)wspace=None, ? ? ? ?# 列間距 (寬度比例)hspace=None, ? ? ? ?# 行間距 (高度比例)width_ratios=None, ?# 列寬度比例列表height_ratios=None, # 行高度比例列表
)

我們看一個示例:

import matplotlib.pyplot as plt
import numpy as np
?
from matplotlib.gridspec import GridSpec
?
# 設置中文字體支持
plt.rcParams['font.sans-serif'] = ['SimHei'] ?# 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False ?# 用來正常顯示負號
?
# 生成數據
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x / 8)
?
fig = plt.figure(figsize=(12, 8))
gs = GridSpec(3, 3, figure=fig) ?# 3×3網格
?
# 創建跨行列的子圖
ax1 = fig.add_subplot(gs[0, :]) ?# 首行全寬
ax2 = fig.add_subplot(gs[1, :-1]) ?# 第二行左側兩列
ax3 = fig.add_subplot(gs[1:, 2]) ?# 后兩行最右列
ax4 = fig.add_subplot(gs[2, 0]) ?# 第三行首列
ax5 = fig.add_subplot(gs[2, 1]) ?# 第三行第二列
?
# 填充子圖內容
ax1.plot(x, y1, color='tab:blue')
ax1.set_title('全寬標題區')
?
ax2.scatter(x, y2, c=y4, cmap='viridis')
ax2.set_title('散點圖(帶顏色映射)')
?
ax3.barh(x[:10], y4[:10], height=0.3)
ax3.set_title('橫向柱狀圖')
?
ax4.pie([15, 30, 45, 10], labels=['A', 'B', 'C', 'D'])
ax4.set_title('餅圖')
?
ax5.hist(np.random.randn(1000), bins=30)
ax5.set_title('直方圖')
?
plt.suptitle('GridSpec 不規則布局', fontsize=16)
plt.tight_layout()
plt.show()

運行截圖:

方法三:subplot2grid(傳統方法)

適用場景:快速實現簡單不規則布局

subplot2grid() 是 Matplotlib 中用于創建復雜子圖布局的靈活方法,特別適合構建非均勻網格布局。它結合了 subplot() 的簡單性和 GridSpec 的靈活性,是創建自定義布局的高效工具。

核心概念

subplot2grid() 允許你:

  1. 定義一個網格系統(行和列)

  2. 指定子圖的起始位置(行索引和列索引)

  3. 設置子圖跨越的行數和列數

  4. 直接創建 Axes 對象

基本語法:

ax = plt.subplot2grid(shape, ? ? ? ? ?# 網格形狀 (行數, 列數)loc, ? ? ? ? ? ?# 子圖起始位置 (行索引, 列索引)rowspan=1, ? ? ?# 子圖跨越的行數(默認為1)colspan=1, ? ? ?# 子圖跨越的列數(默認為1)fig=None, ? ? ? # 關聯的Figure對象**kwargs ? ? ? ?# 其他Axes參數
)

我們看一個示例:

import matplotlib.pyplot as plt
import numpy as np
?
# 設置中文字體支持
plt.rcParams['font.sans-serif'] = ['SimHei'] ?# 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False ?# 用來正常顯示負號
?
# 生成數據
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = np.exp(x / 8)
?
plt.figure(figsize=(10, 6))
?
# 定義網格形狀 (3×3)
ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2)
ax2 = plt.subplot2grid((3, 3), (0, 2), rowspan=2)
ax3 = plt.subplot2grid((3, 3), (1, 0))
ax4 = plt.subplot2grid((3, 3), (1, 1))
ax5 = plt.subplot2grid((3, 3), (2, 0), colspan=3)
?
# 填充內容
ax1.fill_between(x, y1, y2, alpha=0.3)
ax2.plot(x, y3, 'r--', linewidth=2)
ax3.scatter(x[::5], y4[::5], s=50)
ax4.boxplot([np.random.normal(0, std, 100) for std in range(1, 4)])
ax5.stackplot(x, y1, y2, labels=['sin', 'cos'])
?
# 添加圖例和標題
ax5.legend(loc='lower right')
plt.suptitle('subplot2grid 布局示例', fontsize=14)
plt.tight_layout()
plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95902.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95902.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95902.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark執行計劃與UI分析

文章目錄1.Spark任務階段劃分1.1 job,stage與task1.2 job劃分1.3 stage和task劃分2.任務執行時機3.task內部數據存儲與流動4.根據sparkUI了解Spark執行計劃4.1查看job和stage4.2 查看DAG圖4.3查看task1.Spark任務階段劃分 1.1 job,stage與task 首先根據…

16-docker的容器監控方案-prometheus實戰篇

文章目錄一.前置知識1.監控與報警2.監控系統的設計3.監控系統的分類二、prometheus概述1.什么是prometheus2.prometheus的歷史3.為什么要學習prometheus4.prometheus的使用場景5.prometheus的宏觀架構圖6.prometheus軟件下載地址三、部署prometheus server監控軟件1.同步集群時…

集成電路學習:什么是Image Processing圖像處理

Image Processing,即圖像處理,是計算機視覺、人工智能、多媒體等領域的重要基礎。它利用計算機對圖像進行分析、加工和處理,以達到預期目的的技術。以下是對圖像處理的詳細解析: 一、定義與分類 定義: 圖像處理是指用計算機對圖像進行分析,以達到所需結果的技術,又稱…

基于Android的隨身小管家APP的設計與實現/基于SSM框架的財務管理系統/android Studio/java/原生開發

基于Android的隨身小管家APP的設計與實現/基于SSM框架/android Studio/java/原生開發

Web 開發 16

1 在 JavaScript(包括 JSX)中,函數體的寫法和返回值處理在 JavaScript(包括 JSX)中,函數體的寫法和返回值處理確實有一些簡潔的語法規則,尤其是在箭頭函數中。這些規則常常讓人混淆,…

超高車輛碰撞預警系統如何幫助提升城市立交隧道安全?

超高車輛帶來的安全隱患立交橋和隧道的設計通常基于常規車輛的高度標準。然而,隨著重型運輸業和超高貨車的增加,很多超高車輛會誤入這些限高區域,造成潛在的安全隱患。超高車輛與立交橋梁或隧道頂蓋發生碰撞時,可能導致結構受損&a…

三種變量類型在局部與全局作用域的區別

一、基本概念作用域(Scope): 全局作用域:定義在所有函數外部的變量或函數,具有文件作用域,生命周期為整個程序運行期間。局部作用域:定義在函數、塊(如 {})或類內部的變量…

InfluxDB 數據遷移工具:跨數據庫同步方案(二)

六、基于 API 的同步方案實戰6.1 API 原理介紹InfluxDB 提供的 HTTP API 是實現數據遷移的重要途徑。通過這個 API,我們可以向 InfluxDB 發送 HTTP 請求,以實現數據的讀取和寫入操作。在數據讀取方面,使用GET請求,通過指定數據庫名…

JVM安全點輪詢匯編函數解析

OpenJDK 17 源碼的實現邏輯,handle_polling_page_exception 函數在方法返回時的調用流程如下:調用流程分析:棧水印檢查觸發跳轉:當線程執行方法返回前的安全點輪詢時(MacroAssembler::safepoint_poll 中 at_returntrue…

Linux怎么查看服務器開放和啟用的端口

在 Linux 系統中,可以通過以下方法查看 服務器開放和啟用的端口。以下是詳細的步驟和工具,適用于不同場景。1. 使用 ss 查看開放的端口ss 是一個現代化工具,用于顯示網絡連接和監聽的端口。1.1 查看正在監聽的端口運行以下命令:ba…

XF 306-2025 阻燃耐火電線電纜檢測

近幾年隨著我國經濟快速的發展,電氣火災呈現高發趨勢,鑒于電線電纜火災的危險性,國家制定了阻燃,耐火電線電纜的標準,為企業,建設方,施工方等的生產,選材提供了指引。XF 306-2025 阻…

【Java|第二十篇】面向對象(十)——枚舉類

目錄 (四)面向對象: 12、枚舉類: (1)概述: (2)枚舉類的定義格式: (3)編譯與反編譯: (4)Enum類…

第二十一天-OLED顯示實驗

一、OLED顯示原理1、OLED名詞解釋OLED可以自發光,無需背光光源。2、正點原子OLED模塊模塊總體概述模塊接口模式選擇MCU與模塊外部連接8080并口讀寫過程OLED顯存因為要進行顯示,所以需要有顯存。顯存容量為128 x 8 byte,一個點用一位表示。SSD…

會議系統核心流程詳解:創建、加入與消息交互

一、系統架構概覽 會議系統采用"主進程線程池進程池"的分層架構,實現高并發與業務隔離: #mermaid-svg-fDJ5Ja5L3rqPkby0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fDJ5Ja5L3r…

Spring 創建 Bean 的 8 種主要方式

Spring(尤其是 Spring Boot)提供了多種方式來讓容器創建和管理 Bean。Component、Configuration Bean、EnableConfigurationProperties 都是常見方式。 下面我為你系統地梳理 Spring 創建 Bean 的所有主要方式,并說明它們的使用場景和區別。…

React 第七十節 Router中matchRoutes的使用詳解及注意事項

前言 matchRoutes 是 React Router v6 提供的一個核心工具函數,主要用于匹配路由配置與當前路徑。它在服務端渲染(SSR)、數據預加載、權限校驗等場景中非常實用。下面詳細解析其用法、注意事項和案例分析: 1、基本用法 import { m…

iSCSI服務配置全指南(含服務器與客戶端)

iSCSI服務配置全指南(含服務器與客戶端)一、iSCSI簡介 1. 概念 互聯網小型計算機系統接口(Internet Small Computer System Interface,簡稱iSCSI)是一種基于TCP/IP的協議,其核心功能是通過IP網絡仿真SCSI高…

堆(Heap):高效的優先級隊列實現

什么是堆?堆是一種特殊的完全二叉樹,滿足以下性質:堆序性:每個節點的值與其子節點滿足特定關系最小堆:父節點 ≤ 子節點(根最小)最大堆:父節點 ≥ 子節點(根最大&#xf…

朝花夕拾(四) --------python中的os庫全指南

目錄 Python os模塊完全指南:從基礎到高階文件操作 1. 引言:為什么需要os模塊? 1.1 os模塊的重要性 1.2 適用場景 1.3 os模塊的"瑞士軍刀"特性 2. os模塊基礎功能 2.1 文件與目錄操作 2.1.1 核心方法介紹 2.1.2 避坑指南 …

uniappx 安卓端本地打包的一些總結

本人之前沒用過android studio,因為有打包到安卓端的需求,所以有了這篇文章。下面一些內容不正常工作,也不報錯,是很煩的,根本不知道是哪里出了問題。比如對應的aar包沒有引入。或者沒有注冊信息。 在實現過程中我遇到…