且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Python编程:解决matplotlib绘图中文乱码问题

更新时间:2022-08-24 18:04:38

测试环境:

  • mac
  • python3

先查看本机支持的字体


# 显示可以用的中文字体
from matplotlib.font_manager import FontManager
import subprocess


def show_can_use_font():
    # all font list get from matplotlib.font_manager:
    mpl_fonts = set(f.name for f in FontManager().ttflist)

    # for python2
    # output = subprocess.check_output('fc-list :lang=zh -f "%{family}\n"', shell=True)
    # for python3
    # Chinese font list get from fc-list
    output = subprocess.check_output('fc-list :lang=zh -f "%{family}\n"', shell=True, encoding="utf8")
    zh_fonts = set(f.split(',', 1)[0] for f in output.split('\n'))

    # the fonts we can use:
    available = set(mpl_fonts) & set(zh_fonts)
    for f in available:
        print('\t', f)


if __name__ == '__main__':
    show_can_use_font()

运行以上脚本,得到可以使用的字体

LiSong Pro
.LastResort
Arial Unicode MS
LiHei Pro
Wawati SC
Wawati TC
STFangsong
STHeiti

将上面的字体设置到rcParams就可以正常显示中文


import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams

# 设置字体
rcParams["font.family"]="STHeiti"
rcParams["font.size"]= 8

path = "data/总人口.txt"

data = pd.read_csv(path, sep=" ")
data = pd.DataFrame(data)

x = data.ix[4].keys()[1:]
y = data.ix[4].values[1:]

print(x)
print(y)
"""
Index(['2016年', '2015年', '2014年', '2013年', '2012年', '2011年', '2010年', '2009年',
       '2008年', '2007年'],
      dtype='object')
[58973 60346 61866 62961 64222 65656 67113 68938 70399 71496]
"""

plt.plot(x, y)
plt.title("乡村人口(万人)")
plt.xlabel("时间(年)")
plt.ylabel("人口(万人)")
plt.show()

Python编程:解决matplotlib绘图中文乱码问题

附件:

data/总人口.txt


  • 指标 2016年 2015年 2014年 2013年 2012年 2011年 2010年 2009年 2008年 2007年
  • 年末总人口(万人) 138271 137462 136782 136072 135404 134735 134091 133450 132802 132129
  • 男性人口(万人) 70815 70414 70079 69728 69395 69068 68748 68647 68357 68048
  • 女性人口(万人) 67456 67048 66703 66344 66009 65667 65343 64803 64445 64081
  • 城镇人口(万人) 79298 77116 74916 73111 71182 69079 66978 64512 62403 60633
  • 乡村人口(万人) 58973 60346 61866 62961 64222 65656 67113 68938 70399 71496

参考

Linux/MacOS下matplotlib能正常显示的中文字体选择