使用python的頭文件Matplotlib時plt.show()【標題字體過小】問題根源與解決方案

使用python的頭文件Matplotlib時plt.show【標題字體過小】問題根源與解決方案

  • 1. 問題復現
  • 2. 問題分析
  • 3. 解決方案
    • 方案一(`推薦`):使用 `fig.suptitle` 結合 `subplots_adjust`
    • 方案二:以保存文件函數`plt.savefig`為準
    • 方案三:不使用 `tight_layout` ,完全手動布局
  • 4. 總結與建議

1. 問題復現

我們使用python的matplotlib頭文件時可能會遇到一個現象:在代碼中將**標題-**的fontsize設置為一個較大的值,但在plt.show()彈出的交互式窗口中,標題的顯示卻非常小。

比如以下代碼嘗試為一個簡單的條形圖設置一個fontsize=40的標題。

import matplotlib.pyplot as plt
import pandas as pd
import os
from matplotlib.font_manager import FontPropertiesdef get_chinese_font():"""一個輔助函數,用于獲取系統中可用的中文字體。"""font_path_msyh = r'C:\Windows\Fonts\msyh.ttc'font_path_deng = r'C:\Windows\Fonts\Deng.ttf'if os.path.exists(font_path_msyh):print("成功加載字體:微軟雅黑 (msyh.ttc)")return FontProperties(fname=font_path_msyh)elif os.path.exists(font_path_deng):print("注意: 未找到微軟雅黑,已加載備用字體:等線 (Deng.ttf)")return FontProperties(fname=font_path_deng)else:print("\033[91m錯誤: 微軟雅黑和等線字體均未找到!\033[0m")return FontProperties()# 獲取中文字體并準備數據
my_font = get_chinese_font()
data = {'類別': ['A', 'B', 'C', 'D'], '數值': [10, 25, 18, 32]}
df = pd.DataFrame(data)# --- 問題復現代碼 ---
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(df['類別'], df['數值'])# 嘗試設置一個非常大的標題字體
ax.set_title('這是一個標題(fontsize=40)', fontsize=40, fontproperties=my_font)
ax.set_xlabel('類別', fontproperties=my_font, fontsize=12)
ax.set_ylabel('數值', fontproperties=my_font, fontsize=12)# 使用自動緊湊布局
plt.tight_layout()
plt.show()

在這里插入圖片描述

  • 預期結果:標題的字體設置為40,本應是一個標題占據圖表顯著高度、字體極大的圖像。
  • 實際結果:在 plt.show() 窗口中,其視覺大小遠未達到 fontsize=40 應有的效果,甚至很小。

2. 問題分析

這是matplotlib頭文件的布局與渲染機制交互作用的結果。其核心原因可歸結為以下三點:

  1. 絕對字體大小fontsize 參數的單位是 points,是一個絕對度量單位。Matplotlib會根據該值計算標題所需的物理空間。
  2. plt.tight_layout() 的動態調整:當tight_layout()檢測到大尺寸標題時,為防止其與圖表主體(Axes)重疊,它會增加整個畫布(Figure)的理論高度,為標題分配空間。
  3. plt.show() 窗口的縮放行為plt.show()打開的交互式窗口大小受限于當前屏幕分辨率。當它需要展示一個被tight_layout()“撐高”的畫布時,為將整個畫布完整地放入窗口內,它必須對整個圖像進行等比例縮小

結論:預覽窗口的整體縮放,抵消了原始設置的巨大字體尺寸。雖然標題相對于圖表主體的比例確實變大了,但由于整體圖像被縮小,其在屏幕上的絕對視覺大小并未顯著增加。

3. 解決方案

方案一(推薦):使用 fig.suptitle 結合 subplots_adjust

通過將標題從“子圖級別”(Axes)提升到“畫布級別”(Figure),并手動為其預留空間,從而繞開 tight_layout 的過度調整問題。

首先要明白 Matplotlib 的兩個核心層級:

  1. 畫布 (Figure):整個繪圖窗口,就像一張畫紙。
  2. 子圖 (Axes):畫紙上用來畫具體圖表(如條形圖)的矩形區域。

我們的策略分為兩步:

  1. 使用 fig.suptitle():與 ax.set_title() 創建的是子圖內部的標題元素不同,fig.suptitle() 創建的是整個畫布(Figure)的全局標題
  2. 使用 tight_layout() 讓子圖內部的元素(坐標軸標簽等)自動排列整齊。
  3. 再用 fig.subplots_adjust(top=0.9) 手動將整個子圖區域在畫布內向下移動。比如top=0.90 的意思是“將所有子圖的頂部邊界向下移動,使其不超過畫布總高度的90%”。這就在畫布的頂部強制留出了10%的空白區域,專門用于容納 suptitle

通過這個組合,我們既利用了 tight_layout 自動調整子圖內部元素的便利,又通過 subplots_adjust 精確地為全局標題提供了穩定、獨立的顯示空間,避免了整個畫布因標題過大而被縮放的問題。

  • 解決方案代碼

import matplotlib.pyplot as plt
import pandas as pd
import os
from matplotlib.font_manager import FontPropertiesdef get_chinese_font():"""一個輔助函數,用于獲取系統中可用的中文字體。"""font_path_msyh = r'C:\Windows\Fonts\msyh.ttc'font_path_deng = r'C:\Windows\Fonts\Deng.ttf'if os.path.exists(font_path_msyh):print("成功加載字體:微軟雅黑 (msyh.ttc)")return FontProperties(fname=font_path_msyh)elif os.path.exists(font_path_deng):print("注意: 未找到微軟雅黑,已加載備用字體:等線 (Deng.ttf)")return FontProperties(fname=font_path_deng)else:print("\033[91m錯誤: 微軟雅黑和等線字體均未找到!\033[0m")return FontProperties()# 獲取中文字體
my_font = get_chinese_font()# 準備數據
data = {'類別': ['A', 'B', 'C', 'D'], '數值': [10, 25, 18, 32]}
df = pd.DataFrame(data)
# ... (前面的數據準備和字體獲取代碼相同) ...# --- 推薦解決方案代碼 ---
fig, ax = plt.subplots(figsize=(10, 6))ax.bar(df['類別'], df['數值'])# 1. 使用 fig.suptitle() 設置Figure級標題
fig.suptitle('這是一個正確的標題(fontsize=24)', fontsize=24,  # 使用一個更合理的字體大小fontweight='bold', fontproperties=my_font)ax.set_xlabel('類別', fontproperties=my_font, fontsize=12)
ax.set_ylabel('數值', fontproperties=my_font, fontsize=12)# 2. 調用 tight_layout() 進行初步布局
plt.tight_layout()# 3. 使用 subplots_adjust() 為 suptitle 預留空間,防止重疊
#    top=0.9 表示將子圖的頂部邊界設置在畫布高度的90%處
fig.subplots_adjust(top=0.90)plt.show()

在這里插入圖片描述

  • 優點
    • 職責分離fig.suptitle()負責全局標題,ax.set_title()負責子圖標題,邏輯清晰。
    • 布局穩定:通過subplots_adjust()為標題提供固定的、不受tight_layout()過度干預的空間,避免了意外的畫布縮放。
    • 所見即所得plt.show()預覽窗口中的標題大小將更接近最終保存文件的效果。

方案二:以保存文件函數plt.savefig為準

plt.show()本質上是快速預覽工具,其渲染可能受GUI后端和屏幕尺寸影響。在學術或報告場景下,最終交付物是靜態圖像文件。可以嘗試使用一下plt.savefig函數

  • 實踐
    1. 在代碼中設置合理的字體大小(如22-26)。
    2. 執行代碼后,調用 plt.savefig('figure.png', dpi=300, bbox_inches='tight')
    3. 檢查生成的圖像文件,看生成的文件是否符合我們的最終效果。
  • 優點:無需修改繪圖邏輯,簡單直接;確保了最終輸出文件的質量。
  • 缺點:未改善交互式預覽的體驗。(而且有的時候我嘗試可能不起作用

方案三:不使用 tight_layout ,完全手動布局

對于需要精確控制的復雜布局,可以不使用自動布局,轉而手動設置所有邊距。

  • 實踐代碼
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(df['類別'], df['數值'])
ax.set_title('手動布局下的標題(fontsize=24)', fontsize=24, fontproperties=my_font)
ax.set_xlabel('類別', fontproperties=my_font, fontsize=12)
ax.set_ylabel('數值', fontproperties=my_font, fontsize=12)# 不調用 plt.tight_layout()
# 手動設置所有邊距
fig.subplots_adjust(left=0.1, right=0.95, top=0.88,  # 為大標題留出足夠空間bottom=0.1
)plt.show()
  • 優點:提供對布局的完全、精確的控制。
  • 缺點:過程繁瑣,需要為每個圖表手動調整參數,通用性差。通常只在tight_layout失效的極端情況下使用。

4. 總結與建議

plt.show()中標題字體過小的問題,源于ax.set_title()plt.tight_layout()及預覽窗口縮放機制的交互。

解決方案優點缺點推薦指數
1. fig.suptitle + subplots_adjust邏輯清晰,布局穩定,預覽效果好需額外代碼★★★★★
2. 以保存文件為準簡單,保證最終輸出質量無法直接預覽,有時不起作用★★★☆☆
3. 手動布局完全控制,精度高繁瑣★★☆☆☆

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

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

相關文章

全面解析MySQL(3)——CRUD進階與數據庫約束:構建健壯數據系統的基石

> 本文將帶你深入探索MySQL的進階CRUD操作與核心約束機制,用設計原則的視角揭示數據庫如何保障數據世界的秩序。 ### 一、進階CRUD:數據操作的精密工具 #### 1. 精準篩選:WHERE子句的深度運用 ```sql -- 基礎篩選:價格大于50的菜品 SELECT * FROM dishes WHERE pric…

使用Redis實現MySQL的數據緩存

使用Redis來實現/mySQL的數據緩存的架構1:目標數據從mySQL讀取數據或者從Redis讀取數據 2:使用cannal監控mySQL:canal-server可以對mysql的blog實行拉取,可以拉去blog里面的(增,刪,改等操作,查詢…

linux配置ntp時間同步

目錄 1.設置時區 2.安裝chrony時間同步工具 3.修改chrony配置文件,添加阿里云NTP服務器作為時鐘源 4.重啟chrony服務,并查看同步結果 1.設置時區 timedatectl set-timezone Asia/Shanghai 2.安裝chrony時間同步工具 apt install chrony -y(dnf ins…

powershell 實現批量把文件夾下的bmp文件轉換為jpg

以下是一個使用PowerShell將BMP圖像批量轉換為JPG&#xff08;質量85&#xff09;的腳本&#xff1a; <# .SYNOPSIS批量將BMP圖像轉換為JPG格式&#xff08;質量85&#xff09; .DESCRIPTION此腳本會遍歷指定文件夾中的所有BMP文件&#xff0c;并將它們轉換為JPG格式&#x…

星圖云開發者平臺新功能速遞 | 頁面編輯器:全場景編輯器,提供系統全面的解決方案

在數字化轉型的浪潮下&#xff0c;高效的低代碼開發工具成為企業和開發者的剛需&#xff0c;其需要針對Web、APP、H5等不同終端快速構建應用。但不同場景的開發往往需要不同的工具和技術棧&#xff0c;導致開發效率低、協作成本高。星圖云開發者平臺創新推出多類型頁面專用編輯…

激活函數Focal Loss 詳解?

Focal Loss 詳解?1. 背景?Focal Loss 是由 Lin et al. (2017) 在論文 《Focal Loss for Dense Object Detection》 中提出的一種損失函數&#xff0c;主要用于解決 目標檢測&#xff08;Object Detection&#xff09; 中的 類別不平衡問題&#xff0c;特別是在 One-Stage 檢測…

Python 鏈接各種中間件[Mysql\redis\mssql\tdengine]

文章目錄鏈接參數設置logger 日志redis 鏈接mysql 鏈接emqx 鏈接mssql 鏈接tdengine 鏈接采集OPCUA的點表的配置信息設備點表OPCUA 采集 數據程序數據采集邏輯鏈接參數 import randomtdengine_connection_params {username: root,password: taosdata,host: 127.0.0.1,port: 6…

C Primer Plus 第6版 編程練習——第11章(上)

本章共16題&#xff0c;分上中下三篇1.設計并測試一個函數&#xff0c;從輸入中獲取n個字符&#xff08;包括空白、制表符、換行符)&#xff0c;把結果存儲在一個數組里&#xff0c;它的地址被傳遞作為一個參數。int get_n_char(char arr[], int n) {int i 0;char ch;while (i…

Java開發崗面試記錄合集

一、Java 核心1. 基礎語法final關鍵字的作用修飾類&#xff1a;類不可被繼承&#xff08;如String類&#xff09;&#xff0c;保證類的穩定性和安全性。修飾方法&#xff1a;方法不可被重寫&#xff08;防止子類篡改父類核心邏輯&#xff0c;如工具類方法&#xff09;。修飾變量…

Linux 系統時間設置(date 和 ntpdate)-linux028

date 命令&#xff1a;查看或設置系統時間1. 查看當前時間date示例輸出&#xff1a;Tue Mar 4 01:36:45 CST 20142. 設置時間&#xff08;不設置日期&#xff09;date -s 09:38:40設置后輸出&#xff1a;Tue Mar 4 09:38:40 CST 20143. 設置完整日期和時間&#xff08;推薦格…

iOS上使用WebRTC推拉流的案例

一、庫集成 首先&#xff0c;確保在你的 Podfile 中添加依賴&#xff1a; pod GoogleWebRTC然后執行 pod install 安裝庫。 二、代碼示例 2.1、權限配置&#xff1a;在 Info.plist 中添加攝像頭、麥克風權限 <!-- 需要在 Info.plist 中添加以下權限 --> <key>NSCam…

API: return response as HTML table

想要把response table變成HTML的table&#xff0c;即想達到下面這種的話<table boarder"1" style"width:100%; boarder-collapse: collapse; text-align:left"><tr><th>Customer</th><th>Date</th><th>Debit Am…

OneNote 當前無法同步筆記。將繼續嘗試。 (錯誤代碼: 0xE00009C8 bb0ur)問題解決

之前因為同步錯誤&#xff0c;導致OneNote一個筆記本內容全部消失&#xff0c;筆記本內容如下圖同步狀態和錯誤如下&#xff1a;提醒錯誤為&#xff1a;OneNote 當前無法同步筆記。將繼續嘗試。 (錯誤代碼: 0xE00009C8 bb0ur)當時心態有點崩&#xff0c;也是查了好些資料&#…

OneCode3.0 Gallery 組件前后端映射機制:從注解配置到前端渲染的完整鏈路

一、注解體系與前端組件的映射基礎 ? OneCode Gallery 組件實現了 Java 注解與前端 UI 組件的深度綁定&#xff0c;通過GalleryAnnotation、GalleryItemAnnotation和GalleryViewAnnotation三個核心注解&#xff0c;構建了從后端配置到前端渲染的完整鏈路。這種映射機制的核心價…

規則分配腳本

需求&#xff1a; 1.根據用戶編寫的要報規則,去mysql庫里SysManage_Rule表獲取已經啟用的規則作為條件&#xff08;例如[{“field”: “關鍵詞”, “logic”: “AND”, “value”: “阿爾法”, “operator”: “”&#xff0c;, “assign_user”: “user222”}]&#xff09;條…

SEO實戰派白楊SEO:SEO中說的框計算、知心搜索(知識圖譜)是什么?有什么用處?

SEO里框計算是什么&#xff1f;有什么用處&#xff1f;SEO里框計劃算是百度2010年提出的&#xff0c;指當用戶搜索某些關鍵詞查詢時&#xff0c;搜索引擎在結果頁直接展示答案的技術&#xff08;如天氣、匯率等&#xff09;&#xff0c;用戶無需點擊網站即可獲取信息&#xff0…

軟件工程:軟件需求

簡介本篇博客記錄了我在軟件工程學習過程中關于軟件需求與面向對象基礎知識的學習體會和要點總結。博客共分為三個關卡內容&#xff1a;第1關圍繞“軟件需求”的定義、分類及分析過程展開&#xff0c;讓我清晰地理解了功能性需求、非功能性需求與約束條件的區別&#xff1b;第2…

MES系統是什么,有哪些特性?

MES系統是一套面向制造企業車間執行層的生產信息化管理系統。它能夠為操作人員和管理人員提供計劃的執行、跟蹤以及所有資源&#xff08;包括人、設備、物料、客戶需求等&#xff09;的當前狀態。通過MES系統可以對從訂單下達到產品完成的整個生產過程進行優化管理。當工廠發生…

Vue2下

六&#xff1a;vue-router &#xff08;重要&#xff09; &#xff08;一&#xff09;. 對路由的理解 1.什么是路由 路由&#xff08;Router&#xff09; 是管理頁面跳轉和 URL 與視圖映射關系的機制&#xff0c;核心作用是&#xff1a;根據不同的 URL 路徑&#xff0c;展示對…

在 Windows 上安裝設置 MongoDB及常見問題

介紹 MongoDB 是一個開源的 NoSQL 數據庫系統&#xff0c;它以一種靈活的類似 JSON 的格式&#xff08;稱為 BSON&#xff08;二進制 JSON&#xff09;&#xff09;存儲數據。它使用動態模式&#xff0c;這意味著與關系型數據庫不同&#xff0c;MongoDB 不需要在向數據庫添加數…