如何在Python-matplotlib绘图中使用中文粗体
这里写自定义目录标题
如何在matplotlib中使用中文粗体
我发现,在使用matplotlib画图时,当不设置中文字体(无需显示中文)时,在plt.title
,ptl.xlabel
等函数中,使用fontweight='bold'
参数,可以成功使其加粗,如下图所示。
但当需要使用中文时,需使用如下代码设置中文字体:
config = {
"font.family":'serif',
"font.size": 20,
"font.serif":'KaiTi',
"axes.unicode_minus":False,
}
plt.rcParams.update(config)
此时,无论我们是在config中添加'font.weight':"bold"
,设置全局中文;亦或是如之前所述使用fontweight='bold'
参数,单独设置某个标题加粗,均没有变化(且其中英文也一并使用了中文字体),如下图所示:
1. 仅设置中英混合标题中的英文粗体
在设置中中文字体时,可设置公式字体为"stix",其是一种类似"Times New Roman"的字体),如下所示:
config = {
"font.family":'serif',
"font.size": 20,
"mathtext.fontset":'stix',
"font.serif":'KaiTi',
"axes.unicode_minus":False,
}
plt.rcParams.update(config)
此时,对于标题中的英文,我们可以通过将其表示为公式,将其设置为粗体,并且同时是"Times New Roman"字体,代码与结果如下所示:
# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
# 绘图
plt.plot(x, y)
# 添加标题和标签,使用 serif 字体并设置为粗体
plt.title(r'$\mathbf{Title}$标题',size=20) # 正体加粗
plt.xlabel(r'$\mathrm{X}$坐标轴',size=16) # 正体
plt.ylabel(r'$Y$坐标轴',size=16) # 斜体
# 显示图形
plt.show()
2. 局部设置中文粗体
既然不能设置中文的某种字体为粗体,那就使用邪道方法,直接使用一种粗体中文字体。我选择的是方正粗楷简体,可在该网站下载,即可得到FZCKJW.TTF
字体文件。
此时使用如下代码,即可在需要的位置,将其设置为中文粗体(其他位置仍保持为中文正体或英文New Times Roman)。
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 指定自定义字体文件路径
custom_font_path = r'xxx/FZCKJW.TTF'
# 创建 FontProperties 对象加载自定义字体
custom_font = FontProperties(fname=custom_font_path)
# 设置全局字体参数
config = {
"font.family":'serif',
"font.size": 20,
"mathtext.fontset":'stix',
"font.serif":'KaiTi',
"axes.unicode_minus":False,
}
plt.rcParams.update(config)
# 示例数据
x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]
# 绘图
plt.plot(x, y)
# 添加标题和标签,使用 serif 字体并设置为粗体
plt.title('Title标题', fontproperties=custom_font, fontsize=20) # 中文粗体
plt.xlabel(r'$\mathbf{X}$轴标签', fontproperties=custom_font, fontsize=16) # 英文Times New Roman字体
plt.ylabel(r'$\mathrm{Y}$轴标签', fontsize=16) # 中文正体
# 显示图形
plt.show()
3. 如果不希望每次都在开头导入字体
该方法需要每次在程序开头都设置字体文件路径,并将其导入。如果希望能像其他系统字体那样,直接使用其字体名称来设置字体,如plt.ylabel('Y轴标签',fontname='SimSun')
设置宋体,可将其添加到系统字体中,方法如下所示:
- 将TTF字体文件复制到C:\Windows\Fonts中;
- 打开注册表编辑器(Win+R,输入运行 regedit 命令);
- 导航到以下注册表路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
; - 在右侧窗格,创建一个新的字符串值,名称为字体的显示名称(例如,
方正粗楷简体 (TrueType)
); - 将数据设置为字体文件的文件名(例如,
FZCKJW.TTF
); - 保存并关闭注册表编辑器。
这样,就成功在系统中添加注册了新的字体,可以在Word字体中看到。
但这之后并不能直接在Python中使用该字体,需要重新加载字体缓存,方法如下:
- 删除C:\Users\NAME.matplotlib中最新的
fontlist-v390.json
文件(数字390
可能不同) - 重新加载编译器,运行如下代码,找到新添加的TTF文件,以及其对应名称:
import matplotlib.font_manager
# 获取系统中所有已知的字体列表
font_list = matplotlib.font_manager.findSystemFonts()
# 获取已知的字体名称列表
font_names = [matplotlib.font_manager.FontProperties(fname=f).get_name() for f in font_list]
# 打印所有字体名称
for i,font in enumerate(font_list):
print(font,font_names[i])
本例中为FZCKJW.TTF
与FZCuKaiS-R-GB
。
之后,即可使用以下代码,设置局部中文粗体:
plt.ylabel(r'$\mathrm{Y}$轴标签',fontname='FZCuKaiS-R-GB', fontsize=16)
5. 设置全局中文粗体
进行第4节操作后,即可按照一般全局设置方法,设置全局中文粗体,如下所示:
config = {
"font.family":'serif',
"font.size": 20,
"mathtext.fontset":'stix',
"font.serif":'FZCuKaiS-R-GB',
"axes.unicode_minus":False,
}
plt.rcParams.update(config)
作者:Anderson_312