惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

jdhao's digital space

Manage uv.lock file with Renovate Set up Python Provider for Neovim Ripgrep Config to Search Hidden Files Pre-commit Setup for Your Project I read the nvim v0.12 release note so you don't have to Return Different Values for Each Call of A Mock Migrate Python Project from Pip to Uv 德语常用不规则动词 葱油鸡腿制作 Check Trailing White Spaces in Your Project 菜谱:茄子肉丁 object vs nested type in data mapping in Elasticsearch Node, Index, Shard in Elasticsearch Logging setup for Pytest Select fields in Elasticsearch: _source, fields and stored_fields 中式葱花饼制作 菜谱: 凉拌苤蓝(卜留克/kohlrabi) 我也有高考 PTSD Garmin Course Syncing Not Working? Prevent Accidental Index Delete in Elasticsearch How to Import GPX File into Garmin Watch Python system PATH issues When We Use Pytest 菜谱:泰式打抛牛肉 菜谱:烤箱羊肉串 How to Filter Warnings in Python/pytest 家常烤箱烤鸡腿 Comparison between Several Desktop Speakers How to Use LuaRocks Package in Neovim Macbook 外接显示器 家常萝卜炖羊排 Run the Job Immediately after Starting Scheduler in Python APScheduler Retry for Google Cloud Client 菜谱:土豆金枪鱼沙拉 菜谱:椰香咖喱鸡 凉拌绿豆宽粉制作 Make Python logging Work in GCP Liveness and Readiness Check in Kubernetes Notes on Using GCP Logging 西班牙土豆饼制作 Elasticsearch Version Conflict Error How to Use the Elasticsearch task API Speed up document indexing in Elasticsearch via bulk indexing Index refresh issue in Elasticsearch Google Cloud Storage Usage 家常煎羊排制作 凉拌茄子制作 Configure Python logging with dictConfig Debugging Wezterm Issues Black Formatter Setup for Python Project Git line ending config Garmin Forerunner 965 Essential Tips and Setups How to Download Files from Google Cloud Storage in the Databricks Workspace Notebook Databricks Cli Usage Working with Databricks Workspace Files 手抓羊肉饭制作 Databricks Init Scripts Using Virutal Environment in Python with venv File Systems in Databricks LATERAL VIEW EXPLODE in Spark 菜谱:麻婆豆腐 在德国做台湾卤肉饭 FastAPI testing and OpenAPI doc generation Change Timezone in Databricks Spark How to Profile Your Python Script/Module 菜谱:茄子肉沫 Migrating from Packer.nvim to Lazy.nvim How to Extract PDF file on macOS How to Deploy Fastapi Application with Docker Nerdfont Icon Missing after Wezterm Upgrade Pylsp setup for Neovim in 2023 How to Parse Query Param With Multiple Values in FastAPI 菜谱:土豆胡萝卜烧牛肉 Zsh Startup Files in macOS PATH Variable Changed inside Tmux on macOS? Work with JSON File in Neovim Running/importing Python code/module in Databricks Agile and Scrum 菜谱:凉拌牛肉 Awesome Command Line Tools Written in Rust How to get or set Databricks spark configuration Set Up German Version macOS Add A Custom Search Engine for Vimium 中国大陆小米手机如何使用 Google Pay 春节回乡记 滇西之行 2023 贵阳行 2023 程序员海外工作---语言篇 2023 长沙行 2023 西安行 德国工签申请指南 2022 年博客回顾 感染 omicron 记录 How to Override Default Options in Neovim Variadic Arguments in Lua How to Enable Method Autocompletion for OpenCV How to Read Local CSV File to Table in MySQL I read the nvim v0.8 release note so you do not have to Creating A Trigger in PostgreSQL Cost of Living in Shenzhen You Do Not Need a Plugin for This Feature
解决 Matplotlib 使用中文乱码问题
2020-02-22 · via jdhao's digital space

注:这是一篇旧文的中文翻译版本。

前不久,我在使用 Matplotlib 画图的时候,发现一些 Unicode 字符(例如,汉字) 无法正常显示:在生成的图片中,汉字是乱码的,显示为一个方框。经过大量的查找和阅读,我终于明白了如何在使用 Matplotlib 时,正确渲染 Unicode 字符1

简单来说,之所以中文字符被显示为方框,是因为 Matplotlib 默认使用的字体并不支持中文字符,并不是 Matplotlib 本身的原因。为了能够在图片上正确显示中文字符,我们需要指示 Matplotlib 使用一种支持中文的字体即可。或者,更直接地,我们在画图时可以直接给 Matplotlib 提供一个中文字体的路径。

本文假设 fc-list 命令安装在你的电脑上。如果你的电脑上没有这个命令,你应该先安装 fontconfig。在 Linux 系统上,这个程序通常是自带的,无需安装;在 Windows 系统上,可以安装 MiKTeXTeX Live 来使用 fc-list 命令。

以下介绍几种在 Matplotlib 中使用中文字符的不同方式。

指定中文字体名称#

第一种使用中文的方式是给 Matplotlib 提供一个有效的中文字体名。再开始下面步骤之前,确保你的系统上已经安装了中文字体,如果你使用的是中文系统,这应该不是问题;或者如果你想使用一种新的中文字体,可以尝试 Google 和 Adobe 发布的 Source Han Serif。首先,你需要在系统上安装中文字体2

找到有效的中文字体名#

Matplotlib 提供了FontManager 类来处理字体相关的操作。这个类有一个 ttflist 属性,该属性提供了 Matplotlib 所能够发现到的字体列表。从这个字体列表,我们也可以很容易得到这些字体的名称。问题是,我们不清楚这些字体中有哪些字体是支持中文的。

这时候,我们就需要 fc-list 帮助了。这个命令行工具可以帮助我们找到系统上安装的中文字体:使用 fc-list :lang=zh 可以列出系统上可用的中文字体。值得注意的是,这些中文字体并非都可以被 Matplotlib 使用:Matplotlib 无法使用其中的 ttc 格式的字体(参见这里)。所以我们需要得到 Matplotlib 索引的字体和系统提供的中文字体两个集合的交集。

使用字体#

找到了 Matplotlib 索引的中文字体以后,我们可以通过更改 Matplotlib rc 指示 Matplotlib 使用中文字体。这样设置以后,后续脚本中的画图语句都会使用新指定的中文字体。加入我们在系统中安装了 STKaiti 这个字体,下面的脚本将会使用这个字体来渲染图片中的中文:

import matplotlib as mpl
font_name = "STKaiti"
mpl.rcParams['font.family']=font_name
mpl.rcParams['axes.unicode_minus']=False # in case minus sign is shown as box

plt.text(0.5, 0.5, s=u'测试')
plt.show()

在上面的代码中,font_name 可以任意一个有效的中文字体名。另外,如果你仅仅想在某个画图命令中使用中文字体,可以在画图命令中指定使用的字体名称,如下所示:

plt.text(0.5, 0.5, s=u'测试', fontname=font_name)

这种方式是我认为比较好的在 Matplotlib 中使用中文的方式。

指定中文字体的具体路径#

为了使用系统中的任何字体,我们也可以使用第二种方式:直接给 Matplotlib 提供一个字体的路径。代码如下:

import matplotlib.font_manager as mfm
import matplotlib.pyplot as plt

font_path = "/usr/share/fonts/custom/simhei.ttf"
prop = mfm.FontProperties(fname=font_path)
plt.text(0.5, 0.5, s=u'测试', fontproperties=prop)
plt.show()

上述代码中,变量 font_path 是系统上某个中文字体的绝对路径。

结论#

以上提供的两种方式都比较方便实用,我们可以根据自己的实际需要选取使用。要获取完整的代码,可以参考 这里

参考链接#


  1. 尽管这篇文章是以中文为例,但是对于其他语言也是同样的道理,只需要相应设置即可。 ↩︎

  2. 如果不清楚如何在不同系统上安装新字体,可以查看 这里这里的指导。 ↩︎