matplotlib設定中英文多種字型混合座標軸名稱
阿新 • • 發佈:2018-12-24
以後有文章都會更新到個人部落格中,個人部落格中的功能可以自己設計,因此會更豐富點,介面也好看一些,且無廣告,建議優先訪問個人部落格
在利用matplotlib繪圖時,常常需要新增圖例與座標軸名稱,而在論文中,對中英文有嚴格的不同的字型要求,但預設的方法中(如下所示),無法分別為中文、英文指定不同字型(如下圖),因此需要藉助其他方法。
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 在python中,字型單位貌似是px,與pt間的換算關係為1pt=4/3px
simsun = FontProperities(fname=r'C:\Windows\Fonts\simsun.ttc', size=10)
plt.xlabel(u'Di距離', fontproperties=simsun)
經過摸索後發現text函式能夠在指定位置按照指定字型與大小顯示文字,因此可以通過調整文字位置來實現xlabel的功能並且能夠按照指定字型分別顯示中英文(如下圖)。程式碼如下:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from pylab import mpl, text
from matplotlib.font_manager import FontProperties
import numpy as np
# windows下matplotlib顯示中文一般有問題,需要專門進行設定才能正常顯示
# 下面是兩種設定的方式,使用時的引數也略有區別,在此不具體介紹
# 但需提前設定好,使得能夠顯示中文,否則中文字元位置顯示為方框
simsun = FontProperties(fname=r'C:\Windows\Fonts\simsun.ttc', size=10) # 宋體
roman = FontProperties(fname=r'C:\Windows\Fonts\times.ttf', size=10) # Times new roman
mpl.rcParams['font.sans-serif'] = ['SimSun']
fontcn = {'family': 'SimSun','size': 10} # 1pt = 4/3px
fonten = {'family':'Times New Roman','size': 10}
plt.figure(1)
ax1 = plt.subplot(121) # 左圖
ax2 = plt.subplot(122) # 右圖
plt.sca(ax1)
plt.xlim(0,150)
plt.ylim(0,0.08)
plt.xticks(range(0,160,10),rotation=0)
# 設定斜體-Times New Roman字型
text(60, -0.01, u'Di', style='italic', fontdict=fonten)
text(70, -0.01, u'距離', fontdict=fontcn)
text(85, -0.01, u'(km)', fontdict=fonten)
plt.ylabel(u"核密度", fontproperties=simsun)
plt.title(u"a.核密度")
plt.sca(ax2)
plt.xlim(0,150)
plt.ylim(0,1)
plt.xticks(range(0,160,10),rotation=0)
plt.yticks(np.linspace(0,1,11))
text(60, -0.13, u'Di', style='italic', fontdict=fonten)
text(70, -0.13, u'距離', fontdict=fontcn)
text(85, -0.13, u'(km)', fontdict=fonten)
plt.ylabel(u"累積概率", fontproperties=simsun)
plt.title(u"b.累積概率")
plt.show()
上述程式碼可直接執行,字型設定無誤即可得到上圖中的結果,但Di距離(km)
可能會重疊或者空隙較大,這是正常情況,需要調整文字位置。text
函式的前兩個引數為其位置引數,都與其x軸、y軸座標刻度有關,以<text(70, -0.01, u'距離', fontdict=fontcn)
為例,70說明其水平方向位置在座標軸70處,-0.01說明其垂直方向位置在-0.01刻度處,按照這個規則即可以多種字型顯示多段文字。
以上,歡迎留言交流~