首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将中英文与MatPlotLib融为一体

如何将中英文与MatPlotLib融为一体
EN

Stack Overflow用户
提问于 2017-05-16 17:32:16
回答 2查看 2.4K关注 1票数 5

背景

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

用MatPlotLib表示非英语字体有两种方法.

方法1

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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.)

代码语言:javascript
复制
质量 == Mass
as.set_xlabel(u'质量' + '(kg)') ==> Want to define their font sepearetly.

那么,我想把字符串和中、英文字体混为一谈吗?

是否有可能做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2018-12-16 06:23:33

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

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

代码语言:javascript
复制
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')

示例

票数 2
EN

Stack Overflow用户

发布于 2020-07-11 06:55:39

通常,我们需要“时代新罗马”的英文字体和"SimSun“的中文字体。"font.family“定义了全局字体。对于单位,我们可以使用数学公式。然而,没有“时代新罗马”字体的公式。所以我用"stix“来代替”时代新罗马人“。

代码语言:javascript
复制
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()

希望它能帮到你!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44008032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档