0
点赞
收藏
分享

微信扫一扫

Python学习过程问题记录(二):Matplotlib中文显示问题

Sikj_6590 2022-03-11 阅读 51

环境:macOS Monterey 12.2.1、Python3.10.2、Matplotlib 3.5.1

目录

方法一:修改配置文件,全局字体修改

例外情况

方法二:rcParams设置,全局字体修改

方法三:fontproperties设置,非全局字体修改

方法四:FontProperties设置,非全局字体修改


方法一:修改配置文件,全局字体修改

搜索网络的解决方式,通过copy字体和修改matplotlibrc的三处文本解决问题,大部分情况下代码能正常显示中文。

1. 终端输入命令:python,进入Python界面输入代码,获取matplotlib包所在的配置文件的路径。比如我的为: /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc

import matplotlib
matplotlib.matplotlib_fname()     #输出matplotlib包所在的配置文件的路径

在这里插入图片描述
获取matplotlib包配置文件的路径

2. 根据第一步获取路径打开文件夹。比如我的路径为:/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf

3. 网络下载中文字体放进去,比如SimHei.ttf(黑体)、SimSun.ttf(宋体),YaHei.ttf(微软雅黑)。要ttf格式的,并安装字体

4. 使用文本编辑或sublime Text软件打开matplotlibrc文件。(位置:/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
(1)找到font.family: sans-serif,去掉最前面的#
(2)找到font.sans-serif:,去掉前面的#,并将刚才的SimHei、SimSun、Microsoft YaHei添加进去。

在这里插入图片描述
修改matplotlibrc文件的font设置


(3)找到axes.unicode_minus: True,去掉最前面的#,并将True改为False

在这里插入图片描述
修改matplotlibrc文件的axes设置

4. 保存、关闭matplotlibrc文件。

5. 打开/Users/用户名/.matplotlib文件夹,把里面的文件删掉。我的里面只有一个fontlist-v330.json

6. 以后的大部分代码不用任何设置可以正常显示中文了。

如以下代码绘制的图形中文标题正常显示。

import matplotlib.pyplot as plt

input_values = [1, 2, 3, 4, 5, 6]
squares = [1, 4, 9, 16, 25, 36]
fig, ax = plt.subplots()
ax.plot(input_values, squares, linewidth=3)
ax.set_title("平方值", fontsize=20)
ax.set_xlabel("值", fontsize=14)
ax.set_ylabel("平方-值", fontsize=14)
ax.tick_params(axis='both', labelsize=14)
plt.show()

中文正常显示

例外情况

虽然方法一通过修改配置文件修改了全局的字体设置,但以下场景绘制的图像还是不能正常显示中文:代码中图形使用plt.style.use('seaborn')设置时。

可以用方法二来解决。

import matplotlib.pyplot as plt
...
plt.style.use('seaborn')    # 上述代码加入此句代码
fig, ax = plt.subplots()
...    

中文不能正常显示

方法二:rcParams设置,全局字体修改

1. 在plt.style.use('seaborn') 后面加上字体设置代码,即可显示中文。字体设置代码必须在seaborn代码后面才能生效。

2. 字体设置只针对该py文件plt.style.use('seaborn') 后面的代码有效,如果后面的图像又使用类似plt.style.use('seaborn') 语句,还需要再次设置字体代码。

import matplotlib.pyplot as plt # 最前面如果已经import,此句可以不要       
...
plt.style.use('seaborn')
# 字体设置代码
plt.rcParams['font.sans-serif'] = 'Microsoft Yahei' # 显示汉字:SimHei黑体,simsum宋体,Microsoft YaHei雅黑。根据系统安装的字体,有的能用有的不能用,我的是这三个可以。
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号

中文又能正常显示

方法三:fontproperties设置,全局字体修改

1. 在plt.title()、plt.xlabel(),plt.ylabel()参数设置中,使用fontproperties指定字体。

2. 可以指定不同的字体,但字体必须在ttf里,并已安装。

import matplotlib.pyplot as plt

input_values = [1, 2, 3, 4, 5, 6]
squares = [1, 4, 9, 16, 25, 36]
plt.style.use('seaborn')
plt.plot(input_values, squares, linewidth=3)
plt.figure("Hello测试中文!",facecolor='lightgray')
plt.title("测试中文",fontsize=20,fontproperties="Microsoft Yahei")
plt.xlabel("X值", fontsize=14,fontproperties="SimHei")
plt.ylabel("Y值", fontsize=14,fontproperties="SimHei")
plt.show()

中文正常显示(可以不同字体)

方法四:FontProperties设置,全局字体修改

此方法需要导入FontProperties模块、设置myfont变量,并指定fontproperties参数三个步骤,虽繁琐,但可以指定ttc格式的字体文件

1. 导入FontProperties模块:from matplotlib.font_manager import FontProperties

2. 设置变量myfont = FontProperties(fname=r"/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/PingFang.ttc", size=14) 

3. plt.title()、plt.xlabel(),plt.ylabel()参数设置中,使用fontproperties指定字体为变量myfont。 

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties    # 步骤一

input_values = [1, 2, 3, 4, 5, 6]
squares = [1, 4, 9, 16, 25, 36]
# 步骤二
myfont = FontProperties(fname=r"/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/matplotlib/mpl-data/fonts/ttf/PingFang.ttc", size=14)

plt.style.use('seaborn')
fig, ax = plt.subplots()
ax.plot(input_values, squares, linewidth=3)
ax.set_title("平方值", fontproperties=myfont)      # 步骤三
ax.set_xlabel("值", fontproperties=myfont)        # 步骤三
ax.set_ylabel("平方-值", fontproperties=myfont)    # 步骤三
ax.tick_params(axis='both', labelsize=14)

plt.show()

中文正常显示指定字体


还有一种通过rc设置的全局字体修改方法,和方法二有些类似。但试了一下不太好用,就不写了。

举报

相关推荐

0 条评论