Python 圖表教學:自動載入中文字體 + Matplotlib 畫折線圖完整範例

更新 發佈閱讀 7 分鐘

在 Python 使用 Matplotlib 畫圖時,最常遇到的問題就是:

中文無法顯示,變成方框或亂碼。

尤其當你要畫圖表並添加標題、座標軸名稱等中文時,常會看到:

□ □ □ □ 或 � � � → 非常影響閱讀。

raw-image

本篇教學帶你:

  1. 自動尋找系統中可用的中文字體(Windows / Mac / Linux 都適用)
  2. 設定 Matplotlib 使用該字體
  3. 畫出一張標題、標籤都完整顯示中文的折線圖

無論你在公司環境、伺服器(Linux)或自己電腦上,都能直接使用。


🔧 一、為什麼 Matplotlib 常無法顯示中文?

原因很簡單:

Matplotlib 預設只使用西文字體(如 DejaVu Sans)

這些字體並沒有中文字元 → 所以顯示不出中文。

解決方式分兩步:

  1. 找到一個支援中文字的字體檔(如微軟正黑體 msjh.ttc)
  2. 告訴 Matplotlib 使用該字體

但不同系統的字體路徑不同,因此我們寫了一段程式碼可以:

自動偵測系統中常用的中文字體 → 自動載入

省去你手動輸入字體路徑的麻煩。



🔍 二、程式範例:自動尋找可用中文字體

以下這段程式會依序檢查 Windows / Mac / Linux 常見的中文字體。

import matplotlib.pyplot as plt
import os
from matplotlib import font_manager as fm

# ===========================================
# 0. 自動尋找可用中文字體
# ===========================================
def find_font():
"""自動尋找系統中文字體"""
possible_fonts = [
# Windows
r"C:\Windows\Fonts\msjh.ttc",
r"C:\Windows\Fonts\msjh.ttf",
r"C:\Windows\Fonts\mingliu.ttc",
r"C:\Windows\Fonts\simhei.ttf",
# Mac
"/System/Library/Fonts/STHeiti Medium.ttc",
"/System/Library/Fonts/PingFang.ttc",
"/Library/Fonts/Arial Unicode.ttf",
# Linux (Noto 字體)
"/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc",
"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.otf",
"/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc",
]

for font in possible_fonts:
if os.path.exists(font):
print("✔ 使用中文字體:", font)
return font

raise FileNotFoundError("❌ 找不到可用中文字體,請安裝 Noto Sans CJK 或確認系統字體。")

✔ 這段程式的作用:

  • 列出各系統常用的中文字體
  • 依序檢查「檔案是否存在」
  • 找到字體 → 回傳字體路徑
  • 找不到 → 提醒安裝字體

對於開發者來說非常方便,不用再一台電腦一台電腦調整字體路徑。


🧩 三、設定 Matplotlib 使用這個字體

當我們找到中文字體後,就需要設定 Matplotlib 全域使用它:

# 使用找到的字體
font_path = find_font()
font_prop = fm.FontProperties(fname=font_path)
plt.rcParams["font.family"] = font_prop.get_name()
plt.rcParams["axes.unicode_minus"] = False # 避免負號顯示錯誤

✔ 這段程式做了什麼?

設定項目說明font.family設定 Matplotlib 使用你的中文字體axes.unicode_minus=False避免負號「-」顯示成方框

配置完成之後,圖表中的所有中文就能正常呈現!


📈 四、開始畫圖:基本折線圖示範

接下來,我們以最常見的案例——年度銷售額折線圖——做示範。

# ===========================================
# 1. 基本折線圖
# ===========================================
years = [2018, 2019, 2020, 2021, 2022]
sales = [120, 135, 160, 150, 180]

plt.figure(figsize=(6, 4))
plt.plot(years, sales)
plt.title("基本折線圖:年度銷售額")
plt.xlabel("年份")
plt.ylabel("銷售額")
plt.tight_layout()
plt.show()

🖼️ 五、執行後你會看到:

  • 標題(含中文)
  • X / Y 軸標籤(含中文)
  • 折線圖內容

全部都會正確顯示,不再出現亂碼或方框。

raw-image
留言
avatar-img
螃蟹_crab的沙龍
161會員
316內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2025/07/29
在資料視覺化專案中,如果你需要在網頁上呈現大量項目,例如圖片、紀錄、分析結果,一次性載入所有內容可能會讓使用者介面卡頓或混亂。 本篇教學會引導你如何使用 Python 的 Dash 框架,製作一個具有「分頁功能」的網頁應用,讓使用者可以滑動頁面選擇器 (Slider) 分頁檢視資料。 🧩 功
Thumbnail
2025/07/29
在資料視覺化專案中,如果你需要在網頁上呈現大量項目,例如圖片、紀錄、分析結果,一次性載入所有內容可能會讓使用者介面卡頓或混亂。 本篇教學會引導你如何使用 Python 的 Dash 框架,製作一個具有「分頁功能」的網頁應用,讓使用者可以滑動頁面選擇器 (Slider) 分頁檢視資料。 🧩 功
Thumbnail
2025/07/17
Dash 是由 Plotly 所開發的 Python Web 應用框架,用來快速建構互動式資料視覺化應用。dcc.Graph 是 Dash 中的核心元件之一,用來顯示圖表(基於 Plotly 的視覺化功能),支援互動操作如滑鼠移動、點擊、縮放等。 📌 什麼是 dcc.Graph? dcc.G
Thumbnail
2025/07/17
Dash 是由 Plotly 所開發的 Python Web 應用框架,用來快速建構互動式資料視覺化應用。dcc.Graph 是 Dash 中的核心元件之一,用來顯示圖表(基於 Plotly 的視覺化功能),支援互動操作如滑鼠移動、點擊、縮放等。 📌 什麼是 dcc.Graph? dcc.G
Thumbnail
2025/05/10
📌 你將學會: Input, Output, State 差異與用途 多個輸入的 callback 使用方法 使用者動作判斷(例如:只在按下按鈕時觸發) 利用 dash.callback_context 控制觸發條件 實作:多條國家生命線圖 + 自訂年份區間 + 按鈕觸發圖表更新 ✳
Thumbnail
2025/05/10
📌 你將學會: Input, Output, State 差異與用途 多個輸入的 callback 使用方法 使用者動作判斷(例如:只在按下按鈕時觸發) 利用 dash.callback_context 控制觸發條件 實作:多條國家生命線圖 + 自訂年份區間 + 按鈕觸發圖表更新 ✳
Thumbnail
看更多
你可能也想看
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
你是不是跟我一樣:文章都寫在 Notion,結果每次要貼到方格子還要手動複製貼上、重新排版、上傳圖片……每次都貼到懷疑人生? 好消息來了!我們可以用 Python 一鍵把 Notion 文章自動貼到方格子草稿區,還能保留格式,貼完直接編輯、發佈,不再重複勞動, 讓我們專注在撰寫精選文章上, 發
Thumbnail
你是不是跟我一樣:文章都寫在 Notion,結果每次要貼到方格子還要手動複製貼上、重新排版、上傳圖片……每次都貼到懷疑人生? 好消息來了!我們可以用 Python 一鍵把 Notion 文章自動貼到方格子草稿區,還能保留格式,貼完直接編輯、發佈,不再重複勞動, 讓我們專注在撰寫精選文章上, 發
Thumbnail
本篇文章介紹如何使用 HeidiSQL 備份 MySQL 資料庫,除了說明透過圖形介面手動匯出資料之外,也實作了利用 Python 腳本結合 mysqldump 指令,實現每日自動備份的流程,包含參數設定、錯誤處理與檔案命名範例。文章適合希望將備份自動化的開發者參考使用。
Thumbnail
本篇文章介紹如何使用 HeidiSQL 備份 MySQL 資料庫,除了說明透過圖形介面手動匯出資料之外,也實作了利用 Python 腳本結合 mysqldump 指令,實現每日自動備份的流程,包含參數設定、錯誤處理與檔案命名範例。文章適合希望將備份自動化的開發者參考使用。
Thumbnail
在日常生活和工作中,我們經常需要發送電子郵件來進行溝通和分享資訊。本文將介紹如何使用Python的pywin32模組連接到Outlook,並通過程式來自動發送郵件。
Thumbnail
在日常生活和工作中,我們經常需要發送電子郵件來進行溝通和分享資訊。本文將介紹如何使用Python的pywin32模組連接到Outlook,並通過程式來自動發送郵件。
Thumbnail
"求和"應該是我們最常用到的基本數學運算了,利用迴圈和切片的技巧,以下的程式碼能分別印出每個人的總分和各科的總分。
Thumbnail
"求和"應該是我們最常用到的基本數學運算了,利用迴圈和切片的技巧,以下的程式碼能分別印出每個人的總分和各科的總分。
Thumbnail
實務工作上,我們很可能會遇到需要對每張工作表的某一固定位置儲存格求和的情況。比如說,E5儲存格存放每個月的業績總額,以下的程式碼可以求得一整年的總營業額。 以下的程式碼則是用更具Python風格、更精簡且更漂亮的列表推導式(List Comprehension)來輕鬆達成同樣的功能。
Thumbnail
實務工作上,我們很可能會遇到需要對每張工作表的某一固定位置儲存格求和的情況。比如說,E5儲存格存放每個月的業績總額,以下的程式碼可以求得一整年的總營業額。 以下的程式碼則是用更具Python風格、更精簡且更漂亮的列表推導式(List Comprehension)來輕鬆達成同樣的功能。
Thumbnail
我們利用工作表的move_range()方法,可以輕鬆地移動儲存格。其中,rows參數的值表示向下移幾列,cols參數的值表示向右移幾行;當rows參數的值是負數時,則表示向上移幾列;cols參數的值負數時,則表示向上移幾行, 也可以一次移動一整個區塊範圍的儲存格。 利用工作表的freeze_pan
Thumbnail
我們利用工作表的move_range()方法,可以輕鬆地移動儲存格。其中,rows參數的值表示向下移幾列,cols參數的值表示向右移幾行;當rows參數的值是負數時,則表示向上移幾列;cols參數的值負數時,則表示向上移幾行, 也可以一次移動一整個區塊範圍的儲存格。 利用工作表的freeze_pan
Thumbnail
我們可以利用工作表的append()方法,在工作表的列尾添加資料列。 利用迴圈的技巧,我們可以批次賦予區塊內所有儲存格相同的值。 我們也可以在指定的列(行)之前插入指定數量的空白列(行),從指定的列(行)開始向下(右)刪除指定數量的列(行)。
Thumbnail
我們可以利用工作表的append()方法,在工作表的列尾添加資料列。 利用迴圈的技巧,我們可以批次賦予區塊內所有儲存格相同的值。 我們也可以在指定的列(行)之前插入指定數量的空白列(行),從指定的列(行)開始向下(右)刪除指定數量的列(行)。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News