matplotlib 是 Python 中廣泛使用的繪圖庫,特別適合生成靜態、動態和交互式的圖表。它提供了多種圖形類型,可以輕松創建高質量的圖形和可視化數據。以下是 matplotlib 的一些關鍵特點和基本使用示例。
在使用 matplotlib 顯示中文時,可能會遇到一些問題,例如字體顯示不正確或亂碼。這些問題通常是由于默認字體不支持中文字符導致的。
1、設置全局中文的字體
您可以使用 matplotlib 的 rcParams 來設置全局字體,或者在特定圖形中設置字體。
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 設置全局字體
plt.rcParams['font.sans-serif']=['SimHei'] # 使用黑體
plt.rcParams['axes.unicode_minus']=False # 解決坐標軸負號顯示問題
# 示例:繪制包含中文字符的圖形
plt.title('中文標題')
plt.xlabel('X軸 - 時間')
plt.ylabel('Y軸 - 值')
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
代碼運行后中文顯示效果如下:
圖1:rcParams 設置全局字體
2. 指定字體文件
如果您的系統中沒有安裝所需的中文字體,您可以使用已經下載的中文字體。
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 指定字體文件路徑
font_path="D:/Baiduclouddisk/source/python/Python-3.9/Python-3.9.18/simfang.ttf"
font_prop=FontProperties(fname=font_path)
# 示例:繪制包含中文字符的圖形
plt.title('中文標題', fontproperties=font_prop)
plt.xlabel('時間', fontproperties=font_prop)
plt.ylabel('值', fontproperties=font_prop)
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
代碼運行后中文顯示效果如下:
圖2:顯示下載中文字體
更改字體設置后,如果仍然無法正確顯示中文,可能需要清理 matplotlib 的字體緩存。代碼片段如下:
# 清理字體緩存
mpl.font_manager._rebuild()
3、檢查字體文件是否存在
確保字體文件路徑正確且文件存在。如果文件不存在,可以通過以下代碼檢查目錄中有多少字體文件:
import os
from fontTools.ttLib import TTFont
# 檢查字體文件是否包含中文字符
def contains_chinese_chars(font_path):
try:
font=TTFont(font_path)
cmap=font['cmap'].getBestCmap()
for codepoint in cmap:
if 0x4e00 <=codepoint <=0x9fff: # 中文字符范圍
return True
except Exception as e:
print(f"Error processing {font_path}: {e}")
return False
# 列出指定目錄中的字體文件
def list_font_files(directory):
font_files=[]
if not os.path.isdir(directory):
print(f"Directory {directory} does not exist.")
return font_files
for root, _, files in os.walk(directory):
for file in files:
if file.lower().endswith(('.ttf', '.otf')):
font_path=os.path.join(root, file)
if contains_chinese_chars(font_path):
font_files.append(font_path)
return font_files
# 限制搜索范圍到已知可能包含字體的目錄
font_dirs=[
"C:/Windows/Fonts/",
"D:/***/***/python/Python-3.9/"
]
all_font_files=[]
for font_dir in font_dirs:
found_fonts=list_font_files(font_dir)
if found_fonts: # 確保 found_fonts 不是 None
all_font_files.extend(found_fonts)
# 輸出找到的包含中文字符的字體文件,并添加換行符
print("Available Chinese font files:\n" + "\n".join(all_font_files))
注:實際運行代碼時將"D:/***/***/python/Python-3.9/"改為自己的Python安裝路徑
運行代碼,輸出中文字體路徑和文件名:
#可用中文字體名稱和路徑
C:/Windows/Fonts/ARIALUNI.TTF
C:/Windows/Fonts/FZLTCXHJW.TTF
C:/Windows/Fonts/FZLTHJW.TTF
C:/Windows/Fonts/FZSTK.TTF
C:/Windows/Fonts/FZYTK.TTF
C:/Windows/Fonts/kaiu.ttf
C:/Windows/Fonts/msjh.ttf
C:/Windows/Fonts/msjhbd.ttf
C:/Windows/Fonts/msyh.ttf
C:/Windows/Fonts/msyhbd.ttf
C:/Windows/Fonts/phagspa.ttf
C:/Windows/Fonts/phagspab.ttf
C:/Windows/Fonts/REFSAN.TTF
C:/Windows/Fonts/simfang.ttf
C:/Windows/Fonts/simhei.ttf
C:/Windows/Fonts/simkai.ttf
C:/Windows/Fonts/SIMLI.TTF
C:/Windows/Fonts/SIMYOU.TTF
C:/Windows/Fonts/STCAIYUN.TTF
C:/Windows/Fonts/STFANGSO.TTF
C:/Windows/Fonts/STHUPO.TTF
C:/Windows/Fonts/STKAITI.TTF
C:/Windows/Fonts/STLITI.TTF
C:/Windows/Fonts/STSONG.TTF
C:/Windows/Fonts/STXIHEI.TTF
C:/Windows/Fonts/STXINGKA.TTF
C:/Windows/Fonts/STXINWEI.TTF
C:/Windows/Fonts/STZHONGS.TTF
C:/Windows/Fonts/方正粗黑宋簡體.ttf
D:/Baiduclouddisk/source/python/Python-3.9/Python-3.9.18/simfang.ttf
D:/Baiduclouddisk/source/python/Python-3.9/Python-3.9.18/SourceHanSansSC-Bold.otf
D:/Baiduclouddisk/source/python/Python-3.9/Python-3.9.18/STKAITI.TTF
注:擴大搜索范圍(如到整個C:或D:盤)搜索時間會很長。通常除了搜索"C:/Windows/Fonts/"外,Python安裝路徑和其它有可能有中文字體的軟件所在路徑都可以設置為搜索路徑
1、設置中文字體
如果是WINDOWS操作系統,字體目錄通常在"C:/Windows/Fonts/"。在文件管理器中打開"C:/Windows/Fonts/"文件夾,大圖標顯示模式如圖:
圖3:大圖標顯示的中文字體樣式
選中字體,按鼠標右鍵:
圖4:鼠標選中“隸書”字體
鼠標點擊【屬性】按鈕查看字體文件名:
圖5:在字體屬性窗口中查看字體文件名
在字體屬性窗口中查到所選字體文件名為“SIMLI.TTF”,完整路徑為“C:/Windows/Fonts/SIMLI.TTF”。下面代碼塊按路徑設置所選中文字體:
# 設置下載的字體庫路徑
oPath1="D:/Baiduclouddisk/source/python/Python-3.9/Python-3.9.18/SourceHanSansSC-Bold.otf"
zhfont1=matplotlib.font_manager.FontProperties(fname=oPath1)
oPath2="C:/Windows/Fonts/SIMLI.TTF"
zhfont2=matplotlib.font_manager.FontProperties(fname=oPath2)
2、運用中文字體
matplotlib繪圖時需要顯示中文的位置:圖片標題、圖例標題、坐標軸標題和坐標點提示文字。文本屬性涉及:字體、顏色和字號大小三個屬性。實例代碼如下:
import numpy as np
from matplotlib import pyplot as plt
import matplotlib
# 設置下載的字體庫路徑
oPath1="D:/Baiduclouddisk/source/python/Python-3.9/Python-3.9.18/SourceHanSansSC-Bold.otf"
zhfont1=matplotlib.font_manager.FontProperties(fname=oPath1)
oPath2="C:/Windows/Fonts/SIMLI.TTF"
zhfont2=matplotlib.font_manager.FontProperties(fname=oPath2)
#繪圖數據
x=np.arange(1,11)
y=2 * x + 5
y1=x**2 - 3*x +1
# 繪制曲線并添加圖例
plt.plot(x, y, label='圖例I:y=2x + 5')
plt.plot(x, y1, label='圖例II:y=x^2 - 3x + 1')
# 設置圖例字體
legend=plt.legend(prop=zhfont1)
# 設置圖例文本顏色和字體大小
plt.setp(legend.get_texts(), color='red', size=10)
# fontproperties 設置中文字體,文本顏色和字體大小
plt.title("菜鳥教程 - 測試", fontproperties=zhfont1, loc="left", color='blue', size=20)
plt.xlabel("x 軸標題", fontproperties=zhfont2, loc="center", color='green', size=24)
plt.ylabel("y 軸標題", fontproperties=zhfont1, loc="top", color='purple', size=14)
# 在指定坐標位置添加中文文本
plt.text(4.8, 17, "交點", fontproperties=zhfont2, color='black', size=16)
plt.show()
代碼運行效果如下圖:
圖6:matplotlib繪圖時不同總體、顏色和字號中文效果圖
matplotlib繪圖時,中文顯示主要由三個部分構成:
希望通過本文可以完美解決Python matplotlib繪圖過程中的中文顯示問題。
夜幕低垂,小鎮的街燈一盞接一盞亮起,照亮了歸家人的路。在一家不起眼的小書店里,老李正埋頭于一堆稿紙中,眉頭緊鎖,偶爾抬頭望向窗外,眼中閃爍著復雜的情緒。這時,門鈴輕響,打破了室內的寧靜。
“老李啊,聽說你又在搗鼓什么大作呢?”來者是鎮上出了名的文化人老張,手里還拿著一本封面略顯陳舊的雜志,封面上的標題格外醒目——“今年最佳短文,就一個字:《裝》!”
老李苦笑,指了指桌上散亂的紙張,“這不,正為這個字頭疼呢。你說,這‘裝’字,到底是褒是貶?生活中,誰又能說自己不曾在某個時刻‘裝’過呢?”
老張聞言,拉過一把椅子坐下,兩人之間的對話,仿佛成了這個夜晚最溫馨的注腳。
“記得那年春節,家家戶戶都張燈結彩,我也是拼了老命,硬是把家里布置得跟宮殿似的,生怕鄰居們看了笑話,說咱家日子過得不如人?,F在想想,那不就是典型的‘裝門面’嘛??赡菚?,心里頭那份滿足感,是真真切切的?!崩蠌埖脑捳Z里,帶著幾分自嘲,也有幾分懷念。
老李點頭,接過話茬:“是啊,誰還沒點虛榮心呢?我年輕時,為了追心儀的姑娘,愣是裝出一副博學多才的樣子,每天抱本書啃,其實心里慌得一批??赡阒绬幔空悄欠荨b’,讓我真的愛上了閱讀,現在回想起來,還得感謝當年的自己呢?!?
兩人的對話,漸漸引來了書店里其他顧客的注意,大家圍坐一圈,紛紛分享起自己關于“裝”的故事。有人講起為了職場晉升,不得不裝出一副雷厲風行的樣子;有人提及在朋友聚會上,為了融入圈子,假裝對某些話題了如指掌……每一個故事背后,都藏著人性的復雜與真實。
“其實,‘裝’這個字,說到底,是人性的一種自我保護機制?!崩侠羁偨Y道,“它讓我們在面對不確定和挑戰時,能夠暫時披上一層盔甲,勇敢地邁出步伐。但更重要的是,我們要在‘裝’的過程中,找到真實的自我,學會適時地放下那層偽裝,擁抱真實的自己?!?
夜深了,書店里的燈光依舊溫暖,人們陸續離開,但那份關于“裝”的討論,卻像一股暖流,在每個人心中流淌。老李望著空蕩蕩的店鋪,心中涌動著前所未有的明悟。他拿起筆,在稿紙上緩緩寫下:“《裝》,不僅是生活的調味劑,更是成長的催化劑。它讓我們在偽裝與真實之間,學會了平衡,學會了成長。”
窗外,月光皎潔,仿佛也在默默見證著這一份對生活的深刻洞察。而這篇短文,最終不僅成為了老李筆下的佳作,更在小鎮上引起了廣泛的共鳴,讓人們開始重新審視自己,以及那些曾經或正在經歷的“裝”。在這個充滿故事的小鎮上,每個人都在用自己的方式,詮釋著“裝”的另一種含義——在偽裝中尋找真我,在挑戰中擁抱成長。