Linux 下解决 matplotlib 中文字体显示的问题

本文以 Ubuntu 系统为例,介绍如何解决使用 matplotlib 画图时中文显示出错的问题。

查看系统中的字体

1
fc-list :lang=zh
...
/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc: Noto Serif CJK SC:style=Regular
...

示例

wechat_map.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties

zh_font = FontProperties(fname='/usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc')

province = ['', '北京', '', '陕西', '山东', '', '', '', '河南', '山东', '西藏', '',
'北京', '北京', '北京', '', '北京', '', '河南', '山东', '山东', '北京',
'河南', '北京', '', '河南', '北京', '北京', '广东', '四川', '湖南', '',
'山东', '山东', '北京', '北京', '山东', '浙江', '', '', '河南', '广东',
'北京', '湖北', '山东', '', 'Wales', '河南', '', '福建', '山东', '江苏',
'', '河南', '', '天津', '河南', '河南', '山东', '上海', '上海', '辽宁', '',
'北京', '天津', '北京', '北京', '', '北京', '', '山东', '', '', '河南',
'四川', '北京', '辽宁', '河南', '北京', '河南', '天津', '', '北京', '北京',
'江苏', '浙江', '', '', '北京', '河南', '河南', '', '山东', '北京', '', '',
'广东', '北京', '河北', '浙江', '北京', '浙江', '北京', '北京', '', 'Dubayy',
'Adiyaman', '', '', 'Munich', '北京', '', '山东', '河南', '北京', '陕西',
'', '江西', 'Canberra', 'Pennsylvania', '山东', '辽宁', '北京', '甘肃',
'', '上海', '北京', '北京', '', '', '山东', '山东', '吉林', '', 'California',
'North Carolina', '北京', '四川', '河南', 'Zurich', '山东', '', '河南', '',
'山东', '', '', '', '北京', '', '北京', 'Berlin', '北京', '北京', '山东',
'山东', '', '北京', '', '河南', '', '辽宁', '北京', '北京', '北京', '北京',
'北京', '天津', '河北', '湖南', '山东', '福建', '北京', '北京', 'Victoria',
'吉林', '内蒙古', '北京', '河南', '北京', 'England', '北京', '', '湖北',
'浙江', '', '北京', '', '北京', '山东', '北京', '', '山东', '', '', '',
'Marseille', '', '河北', '河南', '', '河南', '', '浙江', '', '吉林', '江西',
'', '湖南', '山东', '山东', '北京', '山东', '', '', '河南', '', '山东', 'Taipei',
'山东', 'Offaly', '山东', 'Santa Rosa', '北京', '', '河南', '广东', '上海',
'山东', '湖南', '北京', '北京', '北京', '', '', '河南', '', '', '', '山东',
'北京', '北京', '北京', '北京', '', '福建', 'Saskatchewan', '河南', 'England',
'北京', 'Sha Tin', 'Ash Shariqah', '四川', '', '河南', '江苏', '山东',
'Rio de Janeiro', '上海', '广东', 'Buenos Aires', '重庆', '山东', '', '北京',
'', 'Dubai', '上海', '山东', '', '北京', '', '', 'Stockholms', '北京', '山东',
'福建', 'Illinois', '湖南', '湖北', '北京', '河北', '湖南', '山东', '', '上海',
'北京', '', '北京', '河北', '江苏', '河南', '山东', '', '北京', '', 'Kerry',
'北京', '', '山东', '山东', '', '内蒙古', 'Busan', '', '', '', '上海', '北京',
'北京', '山东', '北京', '北京', 'Scotland', '河南', '', '广东', '北京', '安徽',
'', 'Dubayy', '黑龙江', 'Milano', '安徽', '', '', '', '北京', '北京', '',
'北京', '河南', '北京', '']

data = {'province': province}
data = pd.DataFrame(data, columns=['province'])
sns.set_style("white")
data['province'] = data['province'].apply(lambda x: 'unknown' if x == '' else x)
pro = data['province'].value_counts()

plt.figure(figsize=(15, 5))
ax = sns.barplot(x=pro.index, y=pro.values)
ax.set_xticklabels(pro.index, rotation=90, fontproperties=zh_font)
plt.tight_layout()
plt.show()

效果

中文字体显示效果

Mastodon