如何用MatPlotLib混合中英文

Han*_*gzu 5 python fonts matplotlib

背景

\n\n

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

\n\n

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

\n\n

方法一

\n\n
import matplotlib as mpl\nmpl.rcParams[\'font.sans-serif\'] = [\'Microsoft YaHei\'] # YaHei is one common Chinese font\nmpl.rcParams[\'axes.unicode_minus\'] = False # Repair the bug of representing \'-\'as "square"\n
Run Code Online (Sandbox Code Playgroud)\n\n

采用这种方法,图中显示的所有文字和数字都是中文字体。

\n\n

方法2

\n\n

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

\n\n
from matplotlib.font_manager import FontProperties \nchinese = FontProperties(fname=r\'/Library/Fonts/Microsoft/SimHei.ttf\', size=20) \nax = plt.gca() \nax.set_title(u\'\xe8\x83\xbd\xe9\x87\x8f\xe9\x9a\x8f\xe6\x97\xb6\xe9\x97\xb4\xe7\x9a\x84\xe5\x8f\x98\xe5\x8c\x96\', fontproperties=chinese) \n
Run Code Online (Sandbox Code Playgroud)\n\n

我的问题

\n\n

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

\n\n
\xe8\xb4\xa8\xe9\x87\x8f == Mass\nas.set_xlabel(u\'\xe8\xb4\xa8\xe9\x87\x8f\' + \'(kg)\') ==> Want to define their font sepearetly.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

有可能实现吗?

\n

lil*_*894 2

    \n
  1. 我认为Latex是潜在的解决方案。在LaTex包中,xeCJK是一个\n提供中文、日文和韩文支持的包。您可以阅读有关 Tex 的 matplotlib 文档。Matplotlib 可以使用 Tex 渲染文本和方程。事实上,这也是我的困境。上面的方法只是我的猜测。当然我还没有证明这一点。
  2. \n
  3. 解决该问题的另一种方法是使用一些支持中文和英文的字体。例如,SimHei 就是合适的字体。我知道这是中国纸质出版业的妥协。
  4. \n
  5. 最后是博客中的一个例子,使用text()在xlabel中指定中文和英文。
  6. \n
\n\n
\n\n

好的,我对方法一进行了一些尝试,结果证实了我的猜测。这是我的代码。

\n\n
import matplotlib\nmpl.use(\'pgf\') # stwich backend to pgf\nimport matplotlib.pyplot as plt\n    plt.rcParams.update({\n    "text.usetex": True,# use default xelatex\n    "pgf.rcfonts": False,# turn off default matplotlib fonts properties\n    "pgf.preamble": [\n         r\'\\usepackage{fontspec}\',\n         r\'\\setmainfont{Times New Roman}\',# EN fonts Romans\n         r\'\\usepackage{xeCJK}\',# import xeCJK\n         r\'\\setCJKmainfont{SimSun}\',# set CJK fonts as SimSun\n         r\'\\xeCJKsetup{CJKecglue=}\',# turn off one space between CJK and EN fonts\n         ]\n})\nplt.rcParams[\'savefig.dpi\']=300\nplt.figure(figsize=(4.5, 2.5))\nplt.plot(range(5))\nplt.text(2.5, 2., "\\CJKfontspec{SimHei}{\xe9\xbb\x91\xe4\xbd\x93\xe6\xa0\x87\xe6\xb3\xa8}")# Annotation by SimHei\nplt.xlabel("\xe5\xae\x8b\xe4\xbd\x93\xe5\x9d\x90\xe6\xa0\x87\xe6\xa0\x87\xe7\xad\xbe(units)")# CJK&EN fonts mixed\nplt.tight_layout(.5)\nplt.savefig(\'examples.png\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

例子

\n