在使用python matplotlib 画图时,由于matplotlib 默认是使用DejaVu Sans这种字体,不支持中文,所以我们在使用matplotlib画图包含中文内容要显示时就会变成方框,并输出警告

那么我们该怎么设置显示中文呢?

下面我来分享一下我的经验:

1.查看matplotlib 字体库中的字体

from matplotlib import pyplot as plt
import matplotlib
print(matplotlib.font_manager.fontManager.ttflist)  # 输出所有的字体名

输出效果:

列表元素为:

<Font 'DejaVu Serif' (DejaVuSerif-BoldItalic.ttf) italic normal 700 normal>
类型为 <class 'matplotlib.font_manager.FontEntry'>

这里包含了 字体名、字体文件名等。

通过dir(matplotlib.font_manager.fontManager.ttflist[0])可以查看FontEntry对象的所有用法:

['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','fname',  # 文件路径名 'name',  # 字体名'size',  'stretch','style','variant','weight']

我们可以通过fname属性查看字体的路径、文件名:

matplotlib.font_manager.fontManager.ttflist[0].fname 得到

'c:\\users\\administrator\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSerif-BoldItalic.ttf'

我们可以通过name属性查看字体名:

matplotlib.font_manager.fontManager.ttflist[0].name 得到 'DejaVu Serif',有了这个字体名,我们就可以设置我们想要的字体了,用for循环遍历matplotlib.font_manager.fontManager.ttflist得到所有字体名了。

font_list = matplotlib.font_manager.fontManager.ttflist
font_set = set()  # 字体路径与字体名匹配的集合
fname_set = set()  # 字体路径的集合
name_set = set()  # 字体名的集合
for font in font_list:font_set.add((font.fname,font.name))fname_set.add(font.fname)name_set.add(font.name)

上面定义了三个集合

font_set = set()  # 字体路径与字体名匹配的集合,用来找到对应的字体。
fname_set = set()  # 字体路径的集合,我们看看matplotlib的字体都来源于哪。
name_set = set()  # 字体名的集合,设置我们想要的字体就从这里拿了。

接下来我们输出看看:

我们先把路径文件夹提取出来,看看是哪几个文件夹:

import os
fload_set = set()
for i in fname_set:fload_set.add(os.path.split(i)[0])  # 用os.path.split提取文件路径中的路径

输出:

这里可以看到,一共有四个路径,我的电脑是win10系统,

'C:\\ProgramData\\kingsoft\\office6\\mtfont' 是wps的字体路径

'C:\\Windows\\Fonts' 是windows系统的字体路径

'D:\\SolidWorks2019\\SOLIDWORKS\\HoopsPublish\\resource\\Font' 是3d绘图软件SOLIDWORKS的字体路径

'c:\\users\\administrator\\appdata\\local\\programs\\python\\python38\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf' 是matplotlib自带的字体路径

所以matplotlib获取到的字体不仅有它自带的字体,还吸取了我们安装的很多字体。

快速输出几种常用中文字体:

from matplotlib import pyplot as plt
import matplotlib
ch_set = set()
for i in matplotlib.font_manager.fontManager.ttflist:  # matplotlib所有的字体名列表if 'Kai' in str(i):  # 包含'Kai'的字体(楷体类)ch_set.add(i.name)elif 'Song' in str(i):  # 包含'Song'的字体(宋体类)ch_set.add(i.name)    elif 'Hei' in str(i):  # 包含'Hei'的字体(黑体类)ch_set.add(i.name)
ch_set  # 输出

输出:

{'Adobe Heiti Std','Adobe Song Std','FZCuHeiSongS-B-GB','FangSong','HYSWLongFangSong','KaiTi','Microsoft JhengHei','Microsoft YaHei','SimHei'}

2.设置我们想要的中文字体

比如我们想用【汉仪长仿宋体】,我们得先知道它的字体名叫什么,才能应用于matplotlib。

桌面右键点【个性化】→【字体】

【可用字体】下方输入框输入框输入【汉仪】关键字搜索字体,然后点击下方搜索到的字体 

弹出对应字体信息界面可以看到字体的路径

接下来我们输出指定字体的字体名:

for i in font_set:  # font_set看上面代码if i[0] == 'C:\\Windows\\Fonts\\hyswlongfangsong.ttf':  # 匹配font_set里的路径print(i[1])break

输出结果:

字体名就是【HYSWLongFangSong】了

这里看到的文件名不一定就是字体名哦,比如【方正粗黑宋简体.ttf】是【FZCuHeiSongS-B-GB】

设置对应字体 的代码就是 plt.rcParams['font.family'] = ['HYSWLongFangSong']

也要注意字体只支持特定的语种 我们要显示中文就必须选择一种支持中文的字体

3.看一下效果:

import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['HYSWLongFangSong']
# 创建三位学生成绩数据
students_grade = pd.DataFrame({'张三': [79, 83, 82, 90, 78, 75],'李四': [93, 91, 93, 95, 95, 97],'王五': [80, 81, 85, 81, 86, 92]})
# 定义画布大小
plt.figure(figsize=(16, 8))
# 设置标题
plt.title('月考分数对比', fontsize = 32, color = 'blue')
# 设置柱体颜色
colors = ['r','g','b']
# 定义X轴标签列表
month = ['2月', '3月', '4月', '5月', '6月', '7月']
# 定义学生姓名列表
name_list = students_grade.columns
# 循环创建三位学生成绩
for i in range(3):# 画柱状图(X轴位置、柱子高度、柱体颜色、柱子宽度、柱体透明度)plt.bar(students_grade.index + 0.2*(i-1), students_grade[name_list[i]].values,color = colors[i] , width = 0.2, alpha = 0.6)# 设置刻度名称plt.xticks(students_grade.index, month, fontsize=20)  # 位置、值、字体大小plt.yticks(fontsize=20)# 设置坐标轴标签plt.xlabel('月份', fontsize=24)# 标签、字体大小、旋转角度(默认90°)plt.ylabel('分  \n数  ', fontsize=24, rotation=0)  # 设置数据标签for a,b in zip(students_grade.index, students_grade[name_list[i]].values):# X轴位置、Y轴位置、值、对齐方式、字体大小plt.text(a + 0.2*(i-1), b, b, ha='center', fontsize = 24)
# 设置图例
plt.legend(name_list)

4.安装新字体

比如我的windows系统,没有【Source Han Sans CN】、【华文彩云】等这种字体,我在字客网下载下来后解压出字体,拖动到C:\Windows\Fonts目录下安装上了。但是这时,matplotlib字体中仍然找不到这个字体,这时需要我们清理下matplotlib的字体缓存。

大家可以使用下面的代码

import matplotlib as plt
plt.get_cachedir()

输出matplotlib字体缓存的目录:C:\Users\Administrator\.matplotlib  我这边缓存就在这个目录了。

把这个目录删掉,退出当前正在使用的编辑器如 jupyter ,在下次启动编辑器导入matplotlib库就会再次生成这个缓存文件夹,再次设置字体就会自动生成这个字体缓存文件了。

来看看新字体华文彩云【STCaiyun】的效果

python matplotlib 画图 不显示中文 中文乱码 设置中文字体相关推荐

  1. 环境搭建:使用python matplotlib画图不显示中文问题解决

    1.背景 python matplotlib.plt 使用 plt.title 写标题时,标题显示为方框,无法正常显示中文,而且基本上在一台新的服务器上配置python开发环境都会遇到这种问题,因此写 ...

  2. python matplotlib画图改变图标题和坐标轴标题的字体大小

    import matplotlib.pyplot as pltplt.title('Input',fontdict={'weight':'normal','size': 20}) #改变图标题字体 p ...

  3. Python matplotlib 画图 显示中文 中文乱码 无法显示负号

    Python matplotlib 画图 显示中文 中文乱码 无法显示负号 import matplotlib.pyplot as pltplt.rcParams["font.sans-se ...

  4. python画图中文显示_解决Linux系统中python matplotlib画图的中文显示问题

    最近想学习一些python数据分析的内容,就弄了个爬虫爬取了一些数据,并打算用Anaconda一套的工具(pandas, numpy, scipy, matplotlib, jupyter)等进行一些 ...

  5. 解决Linux系统中python matplotlib画图的中文显示问题

    解决Linux系统中python matplotlib画图的中文显示问题 参考文章: (1)解决Linux系统中python matplotlib画图的中文显示问题 (2)https://www.cn ...

  6. python画图y轴在右侧_解决python中画图时x,y轴名称出现中文乱码的问题

    如下所示: #-*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt from matplotlib.font_ ...

  7. RuntimeWarning: Glyph 30452 missing from current font. matplotlib画图无法显示中文

    matplotlib画图无法显示中文 RuntimeWarning: Glyph 30452 missing from current font. plt画图的title显示的中文是方括号 错误图: ...

  8. python word保存图_使用python matplotlib 画图导入到word中如何保证分辨率

    在写论文时,如果是菜鸟级别,可能不会花太多时间去学latex,直接用word去写,但是这有一个问题,当我们用其他工具画完实验彩色图时,放到word中会有比较模糊,这有两个原因导致的. 原因一:图片导入 ...

  9. python画图模糊_使用python matplotlib 画图导入到word中如何保证分辨率

    在写论文时,如果是菜鸟级别,可能不会花太多时间去学latex,直接用word去写,但是这有一个问题,当我们用其他工具画完实验彩色图时,放到word中会有比较模糊,这有两个原因导致的. 原因一:图片导入 ...

最新文章

  1. JavaScript复制内容到剪贴板
  2. Java使用javax.mail.jar发送邮件并同意发送附件
  3. 关闭Vue计算属性自带的缓存功能
  4. 深度学习(二十)——Ultra Deep Network, 图像超分辨率算法
  5. Java——设计模式(工厂方法模式)
  6. createPattern() 自定义宽高
  7. ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)
  8. 3.JUC线程高级-同步容器 ConcurrentHashMap
  9. 扩大人类对车辆的控制 新种双轨制自驾车出现
  10. c语言中竖线的作用,竖线符号
  11. Python 微信自动化工具开发系列03_自动向微信好友发送信息和文件(2022年10月可用)
  12. EDA与VHDL题目——七人表决器
  13. 酉矩阵、克罗内克积/和 脑图总结
  14. redis过期策略及持久化机制
  15. 世界知名半导体ST、NXP、Microchip、TI、Renesas公司的MCU和MPU定位、性能及特点
  16. 千山独行-一个人的创业路(连载十二)
  17. Python爬虫(一)——58同城租房信息
  18. 【UML建模】(5) UML建模之活动图
  19. Photoshop Resource(PS网站资源)
  20. 基于单片机的多功能定时器

热门文章

  1. JustAuthPlus(JAP)喜提 Gitee GVP(最有价值项目)称号!
  2. python与物理结合_Python物理学高效计算(完整版高清带目录)_IT教程网
  3. 如何将您的Facebook照片和视频传输到Dropbox
  4. js获取近一周、近一月、近三月、近半年等方法记录
  5. A - Fxx and string (ACM)
  6. matlab 蔡旭晖,科学计算与MATLAB语言
  7. 【汇智学堂】-div+css布局十五(汇智学堂主页-工程项目展示)
  8. 5G破题 成本压力待解
  9. 构建一个Gods Eye Android应用程序:第1部分 – 收集已安装的Android应用程序
  10. python赋值语句不合法的是_Python入门习题1.温度转换