如何将中英文与MatPlotLib混合使用

时间:2017-05-16 17:32:17

标签: python matplotlib fonts

背景

MatPlotLib是一个很棒的图形包。但是当我有时需要用中文绘制数据集时。我发现了一些问题。

使用MatPlotLib表示非英文字体有两种方法。

方法1

import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # YaHei is one common Chinese font
mpl.rcParams['axes.unicode_minus'] = False # Repair the bug of representing '-'as "square"

使用此方法,图中显示的所有文本和数字都在中文字体中。

方法2

不同的是,我预定义了一些中文字体的路径,并在我需要使用时调用它。

from matplotlib.font_manager import FontProperties 
chinese = FontProperties(fname=r'/Library/Fonts/Microsoft/SimHei.ttf', size=20) 
ax = plt.gca() 
ax.set_title(u'能量随时间的变化', fontproperties=chinese) 

我的问题

当一个字符串包含中文文本和英文文本时(例如,中文作为变量,它应该带有一些单位:kg,m / s。)

质量 == Mass
as.set_xlabel(u'质量' + '(kg)') ==> Want to define their font sepearetly.

那么,我希望字符串可以与中文和英文字体混合在一起作为一个整体?

有可能实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

通常,我们希望英文字体为“ Times New Roman”,中文字体为“ SimSun”。 “ font.family”定义全局字体。对于单位,我们可以使用数学公式。但是,该公式没有“ Times New Roman”字体。所以我用“ stix”代替了“ Times New Roman”。

import matplotlib.pyplot as plt
rc = {"font.family" : "Times New Roman",
      "mathtext.fontset" : "stix",
      }
plt.rcParams.update(rc)enter image description here
fig,ax = plt.subplots(dpi = 300)
ax.set_xlabel(r'密度$\mathrm{kg/m}^3$',fontname = 'SimSun',fontsize = 20)
ax.text(0.2,0.8,r'宋体 $\mathrm{Times New Roman}$(正体)',fontname = 'SimSun',fontsize = 20)
ax.text(0.2,0.6,r'宋体 $Times New Roman$(斜体)',fontname = 'SimSun',fontsize = 20)
ax.text(0.2,0.4,r'$\mathrm{m^3}\ m^3$',fontsize = 30)
fig.tight_layout()
plt.show()

希望它可以为您提供帮助!

答案 1 :(得分:0)

  1. 我认为Latex是潜在的解决方案。在LaTex软件包中,xeCJK是一个 提供中文,日文和韩文支持的软件包。您可以 阅读有关Tex的matplotlib文档Matplotlib可以使用Tex渲染 文字和方程式。实际上,这也是我的难题。和 上面的方法只是我的猜测。当然我还没有证明。
  2. 解决该问题的另一种方法是使用一些字体支持中文和 英语。例如,SimHei是合适的字体。我知道是 中国论文出版方面的妥协。
  3. 最后是一个来自blog的示例,该示例使用 text() xlabel 中指定中文和英文。

好的,我已经对方法1进行了一些试验。结果支持了我的猜测。这是我的代码。

import matplotlib
mpl.use('pgf') # stwich backend to pgf
import matplotlib.pyplot as plt
    plt.rcParams.update({
    "text.usetex": True,# use default xelatex
    "pgf.rcfonts": False,# turn off default matplotlib fonts properties
    "pgf.preamble": [
         r'\usepackage{fontspec}',
         r'\setmainfont{Times New Roman}',# EN fonts Romans
         r'\usepackage{xeCJK}',# import xeCJK
         r'\setCJKmainfont{SimSun}',# set CJK fonts as SimSun
         r'\xeCJKsetup{CJKecglue=}',# turn off one space between CJK and EN fonts
         ]
})
plt.rcParams['savefig.dpi']=300
plt.figure(figsize=(4.5, 2.5))
plt.plot(range(5))
plt.text(2.5, 2., "\CJKfontspec{SimHei}{黑体标注}")# Annotation by SimHei
plt.xlabel("宋体坐标标签(units)")# CJK&EN fonts mixed
plt.tight_layout(.5)
plt.savefig('examples.png')

examples