前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在AI Studio数据可视化图像中显示汉字

如何在AI Studio数据可视化图像中显示汉字

作者头像
老齐
发布2020-05-15 17:04:04
3.2K0
发布2020-05-15 17:04:04
举报
文章被收录于专栏:老齐教室

作者:燕清,老齐

与本文相关的图书推荐:《跟老齐学Python:数据分析》


AI Studio是一个非常好用的数据科学在线实验平台,不论是教学、学习还是开发,都可以使用。但是,下面的缺憾未免成为了珍珠上的一点瑕疵。

代码语言:javascript
复制
%matplotlib inline
import matplotlib.pyplot as plt

labels = ['娱乐','育儿','饮食','房贷','交通','其它']
sizes = [2,5,12,70,2,9]
explode = (0,0,0,0.1,0,0)
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=150)
plt.title("饼图示例-8月份家庭支出")

输出结果:

在绘制这个饼图的时候,我们在标题以及饼图不同区域的标签设置了中文,但是现实效果不能令人满意,没有显示相应的汉字。很多人遇到过这种问题,一种常见解决之道就是“绕着走”,将中文换成英文,乃至于在某些官方的案例中也是如此。

专业的开发者天生就是“以解决难题为荣”的,这个难题必须要破解。

如果在网上搜索Matplotlib显示汉字的问题,会有好多种方法,但是那些方法都是针对本地操作系统的,而非针对Ai Studio这样的远程系统——虽然也是Ubuntu操作系统,但是由于每个人使用的是一个虚拟环境,在权限、路径等方面与本地操作系统还是有所差别的。

查看已有字体

在开始解决问题之前,先对当前我们使用的虚拟操作系统以及它已有字体有所了解。

  1. 当前的操作系统
代码语言:javascript
复制
!cat /etc/*-release

输出:

代码语言:javascript
复制
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=16.04
    DISTRIB_CODENAME=xenial
    DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"
    NAME="Ubuntu"
    VERSION="16.04.3 LTS (Xenial Xerus)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 16.04.3 LTS"
    VERSION_ID="16.04"
    HOME_URL="http://www.ubuntu.com/"
    SUPPORT_URL="http://help.ubuntu.com/"
    BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
    VERSION_CODENAME=xenial
    UBUNTU_CODENAME=xenial

从上述结果,我们了解到,现在所使用的Ai Studio是Ubuntu操作系统。因此,各种Linux命令就可以放心使用了。

  1. 查看已有字体

首先看一看系统自带的字体。

代码语言:javascript
复制
# Linux系统默认字体文件路径
!ls /usr/share/fonts/

输出:

代码语言:javascript
复制
cmap  truetype	type1  X11

显然操作系统默认有一些字体,但这些字体中有多少是支持显示汉字的呢?还要继续查看:

代码语言:javascript
复制
# 查看系统可用的ttf格式中文字体
!fc-list :lang=zh | grep ".ttf"

没有任何查询结果,说明系统默认字体中没有支持汉字的ttf格式字体。

熟悉Matplotlib的朋友可能会想到,也应该看看Matplotlib库的字体目录,或者将支持汉字的字体放到该目录中。

Ai Studio虽然是Ubuntu操作系统,但又不完全等同于本地的Ubuntu系统,Python第三方库的安装位置与本地计算机中的位置不同。

代码语言:javascript
复制
import matplotlib
matplotlib.__path__

输出:

代码语言:javascript
复制
['/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib']

以上的输出结果:/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib,就是matplotlib的存储路径,或者说,所有第三方包都会被安装到/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/里面。

那么,Matplotlib保存字体的路径就应该是/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf,可以查看其中的字体:

代码语言:javascript
复制
# matplotlib字体路径(aistudio)
!ls /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf

输出:

代码语言:javascript
复制
    cmb10.ttf			DejaVuSerif.ttf
    cmex10.ttf			LICENSE_STIX
    cmmi10.ttf			STIXGeneralBolIta.ttf
    cmr10.ttf			STIXGeneralBol.ttf
    cmss10.ttf			STIXGeneralItalic.ttf
    cmsy10.ttf			STIXGeneral.ttf
    cmtt10.ttf			STIXNonUniBolIta.ttf
    DejaVuSans-BoldOblique.ttf	STIXNonUniBol.ttf
    DejaVuSans-Bold.ttf		STIXNonUniIta.ttf
    DejaVuSansDisplay.ttf		STIXNonUni.ttf
    DejaVuSansMono-BoldOblique.ttf	STIXSizFiveSymReg.ttf
    DejaVuSansMono-Bold.ttf		STIXSizFourSymBol.ttf
    DejaVuSansMono-Oblique.ttf	STIXSizFourSymReg.ttf
    DejaVuSansMono.ttf		STIXSizOneSymBol.ttf
    DejaVuSans-Oblique.ttf		STIXSizOneSymReg.ttf
    DejaVuSans.ttf			STIXSizThreeSymBol.ttf
    DejaVuSerif-BoldItalic.ttf	STIXSizThreeSymReg.ttf
    DejaVuSerif-Bold.ttf		STIXSizTwoSymBol.ttf
    DejaVuSerifDisplay.ttf		STIXSizTwoSymReg.ttf
    DejaVuSerif-Italic.ttf

查看上面的显示结果,会发现,的确没有支持汉字显示的字体,所以,前面可视化结果中不能显示汉字是很正常的。

按照在本地计算机上设置汉字显示的思维方法,将支持汉字显示的字体放到上述目录中,并修改相应的配置文件matplotlibrc,是否可以?如果读者有兴趣,可以尝试。这里只说明结果:无法解决本文的问题。

下载字体

既然系统默认没有支持汉字的字体,就不得不下载了。注意,不是下载到你所使用的本地计算机,而是下载到当前Ai Studio给我们提供的虚拟操作系统上。

代码语言:javascript
复制
# 下载中文字体
!wget https://mydueros.cdn.bcebos.com/font/simhei.ttf

输出:

代码语言:javascript
复制
    --2020-04-10 15:44:35--  https://mydueros.cdn.bcebos.com/font/simhei.ttf
    Resolving mydueros.cdn.bcebos.com (mydueros.cdn.bcebos.com)... 182.61.128.198
    Connecting to mydueros.cdn.bcebos.com (mydueros.cdn.bcebos.com)|182.61.128.198|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 9753388 (9.3M) [application/octet-stream]
    Saving to: ‘simhei.ttf.1’
    
    simhei.ttf.1        100%[===================>]   9.30M  54.7MB/s    in 0.2s
    
    2020-04-10 15:44:35 (54.7 MB/s) - ‘simhei.ttf.1’ saved [9753388/9753388]

字体下载之后,会保存到当前项目的永久文件夹中。点击界面左侧的“文件夹”,可以看到刚刚下载的字体文件simhei.ttf,再用下面的方式得到这个字体的名称。

代码语言:javascript
复制
# 查看字体的引用名
import matplotlib.font_manager as font_manager
fontpath = 'simhei.ttf'
prop = font_manager.FontProperties(fname=fontpath)
print(prop.get_name())

输出:

代码语言:javascript
复制
    SimHei

从上述返回结果可知,下载的字体文件simhei.ttf,在Matplotlib中,所引用的字体名称是SimHei。

第一种方法

这是一种非常灵活的方法,可以根据需要对所绘制图像设置不同的字体。

代码语言:javascript
复制
%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

font = FontProperties(fname='simhei.ttf', size=16)    # 创建字体对象

labels = ['娱乐','育儿','饮食','房贷','交通','其它']
sizes = [2,5,12,70,2,9]
explode = (0,0,0,0.1,0,0)

plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=150, textprops={'fontproperties':font})

plt.title("饼图示例-8月份家庭支出", fontproperties=font)

输出:

观察上述图示,标题和饼图的各个分区的标示都显示中文了。

在plt.pie和plt.title中,都是用了参数'fontproperties',这个参数是matplotlib的文本参数之一(查看:Text properties and layout:https://matplotlib.org/3.1.1/tutorials/text/text_props.html),其值是FontProperties类的实例,即前面所创建的字体对象。

如此解决了当前图示中汉字显示问题。

第二种方法

第一种方法定制性比较强,在一个项目中,可以给不同图示配置不同的字体。如果不需要如此,也可以用这里介绍的第二种方法,一个项目中所有可视化的图示都用同一种汉字字体。

在创建共本项目应用的字体目录fonts,并把所下载的字体放到该目录中。

代码语言:javascript
复制
#创建字体目录fonts
!mkdir .fonts

# 复制字体文件到该路径
!cp simhei.ttf .fonts/

上面的操作完成之后,一定要执行下面的操作:

重启环境,即用鼠标点击本项目浏览器中的下图所示图标:

这步完成之后,执行下面的代码,就实现了汉字的显示。

代码语言:javascript
复制
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager

# 设置显示中文
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
matplotlib.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题

labels = ['娱乐','育儿','饮食','房贷','交通','其它']
sizes = [2,5,12,70,2,9]
explode = (0,0,0,0.1,0,0)
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
plt.title("饼图示例-8月份家庭支出")

输出:

以上技巧,发布出来,供大家参考。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查看已有字体
  • 下载字体
  • 第一种方法
  • 第二种方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档