論文插圖字體一般要求Times New Roman或者Helvetica字體,前者不必說,字體也還不錯,應用也比較廣泛,但有個問題是中文顯示是方框,後者是MATLAB默認字體,起初接觸的時候還沒覺得如何,後來隨著對各種字體的摸索,當然也是期刊要求,發現她(Helvetica)真好看!pycharm中使用python包matplotlib進行科研繪圖,這兩款字體中俺心心念念的Helvetica字體卻無法被用到,雖然與其長相相似的Arial字體可以用,但強迫症的我決定抽出時間解決這個問題。因為我從未見過真正的Helvetica長啥樣,請聽我細細道來。
雖然說更喜歡Helvetica(下文以H代之),但是Times New Roman (T) 也不錯,而且最先接觸的正式西文字體是T,但是,不知道咋回事,python繪圖中Times New Roman 字體無法設置粗細,這不致命,致命的是它始終顯示粗體。這咋整?(正經地說,“這應當如何解決呢?”)搜尋了大量方法,真的是大量,然後在組內同學幫助下找到了以下博客文章,解決了該問題,用上了可變化粗細的T字體,至少一字在手科研繪圖不愁。此處不贅述,親測2次(python 3.7和3.8兩次都用了這個方法),鏈接:
這是本文重點。
首先看看plt中字體輸入要求:
要在圖中顯示相應字體,至少要設置family這一項,先選字體家族(綠色箭頭所指),然後設置具體的字體,當然也可直接設置family為具體字體的名字。T字體在serif中,H字體在sans-serif中。
直接放代碼:
import matplotlib.pyplot as plt
plt.rcParams['axes.linewidth'] = 1 # 圖框寬度
plt.rcParams['figure.dpi'] = 300 # plt.show顯示分辨率
font = {
'family': 'serif',
'serif': 'Times New Roman',
'weight': 'normal',
'size': 10}
plt.rc('font', **font)
plt.figure()
x = [1, 2, 3]
y = [k ** 2 for k in x]
plt.plot(x, y)
plt.title('This is Times New Roman Font', fontweight='normal')
plt.savefig(r"C:\Users\Asus\Desktop\times1.jpg", dpi=600, bbox_inches='tight', pad_inches=0.01)
plt.show()
如果這時候要用以下這種設置:
font = {
'family': 'sans-serif',
'sans-serif': 'Helvetica',
'weight': 'normal',
'size': 10}
恭喜你,你將會看到如下錯誤:
UserWarning: findfont: Font family [‘sans-serif‘] not found. Falling back to DejaVu Sans.
然後就使用默認字體來繪圖了。
解決方法來自於該博客:
Python數據可視化第 2 講:matplotlib 繪圖中文字體設置
以及 Font family [‘sans-serif’] not found. Falling back to DejaVu Sans. Solution
==================方法描述:
import matplotlib
print(matplotlib.matplotlib_fname())
F:\python38\lib\site-packages\matplotlib\mpl-data\matplotlibrc
找到F:\python38\lib\site-packages\matplotlib\mpl-data
路徑即可,然後下載字體Helvetica。
有錢人下正版,沒錢人下。。。不下正版就是了,分享一個鏈接:Helvetica字體 免費版 下載之家 ; 正版鏈接:Helvetica 害,幾十美刀吧也就。嗯。
以第一種方法為例,解壓如下(解壓密碼在下載之家網站上有說明):
把該.tff
文件復制到這個路徑下:F:\python38\Lib\site-packages\matplotlib\mpl-data\fonts\ttf
.
當然你可以進一步把它存到電腦的系統字體裡:控制面板\外觀和個性化\字體
,然後可以在adobe等畫圖軟件裡也使用它。
import matplotlib
print(matplotlib.get_cachedir())
C:\Users\Asus.matplotlib
Windows中手動刪除該路徑文件就行。
該文件仍在字體路徑下:
用txt、notepad++、python都可以打開編輯。別問我為啥知道,因為都試過。大概在228-259行。
# 1.去掉下面一行的 # 號
font.family : sans-serif
# 2.去掉下面一行前面的 # 號,並在冒號後面添加 Hevetica,如果有就不需要加了
font.sans-serif : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
# 3.去掉下面一行前面的 # 號,並將True改為False
axes.unicode_minus : False
關了python,重啟。
到了熟悉的實驗驗證環節,證明方法的有效性(effectiveness)。
plt.rcParams['axes.linewidth'] = 1 # 圖框寬度
plt.rcParams['figure.dpi'] = 300 # 圖框寬度
font = {
'family': 'sans-serif',
'sans-serif': 'Helvetica',
'weight': 'normal',
'size': 10}
plt.rc('font', **font) # pass in the font dict as kwargs
plt.figure()
x = [1, 2, 3]
y = [k ** 2 for k in x]
plt.plot(x, y)
plt.title('This is Helvetica Font', fontweight='normal')
plt.savefig(r"C:\Users\Asus\Desktop\helvetica1.jpg", dpi=600, bbox_inches='tight', pad_inches=0.01)
plt.show()
與MATLAB對比一下:
當然,前面說過,Windows上面會把Helvetica字體給你弄成Arial字體,所以你見到的H都是Arial,包括MATLAB和WORD裡面的字體,我一開始想把字體文件直接移植過來… 後來發現word的字體文件裡面根本沒有H字體,那他咋實現Helvetica字體的?問就是Arial。坑。我吐了,想到這感覺被騙了許多年。
好了,到此結束。