matplotlib设置中英文多种字体混合坐标轴名称

在利用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)

图1
经过摸索后发现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()

图2

上述代码可直接运行,字体设置无误即可得到上图中的结果,但Di距离(km)可能会重叠或者空隙较大,这是正常情况,需要调整文字位置。text函数的前两个参数为其位置参数,都与其x轴、y轴坐标刻度有关,以<text(70, -0.01, u’距离’, fontdict=fontcn)为例,70说明其水平方向位置在坐标轴70处,-0.01说明其垂直方向位置在-0.01刻度处,按照这个规则即可以多种字体显示多段文字。


以上,欢迎留言交流~

  • 13
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值