首页 > 技术文章 > matplotlib汉字显示问题

chengxuyonghu 2020-10-06 15:52 原文

import random
import os,time,sys
import numpy,pandas
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

#data = pandas.read_csv("ceshi.csv", encoding="utf-8")
data = pandas.read_csv("ceshi.csv", encoding="GBK")
print (data)
data1 = pandas.read_excel("test.xlsx")
print (data1)

#中间要转换一下才能重新写入csv
data2 = pandas.DataFrame(data1)
data2.to_csv('ceshi1.csv',encoding="GBK", index=None)

print (data.describe())
print (data1.describe())
print (data2.describe())

#画图 data3
= pandas.read_csv("ceshi3.csv", encoding="GBK") data3.plot(style = "--",linewidth = 10) plt.xlabel("x轴",fontproperties="SimSun") plt.ylabel("y轴",fontproperties="SimSun") font = FontProperties(fname=r'c:\windows\fonts\STKaiti.ttf', size=12) plt.title('显示sin,cos曲线', fontproperties=font) plt.show()



 

 

数据源如下:根据每一列的数据画图

 

 

Python实现matplotlib显示中文方法详解 中给出了四种显示中文的方法。

 

1.使用fontproperties

在xlabel, ylabel, title后面使用fontproperties来指明所使用的字体的名称。

 

import matplotlib.pyplot as plt
# ...
plt.xlabel("x轴")
plt.ylabel("y轴", fontproperties="SimSun") # 步骤一  (宋体)
plt.title("标题", fontproperties="SimHei") #     (黑体)
plt.show()

下面表格给出了中文字体对应的英文名称。通过测试,并不是每一个英文字体都是可以使用的。

表格1:中文字体与对应的英文名称

 

 

中文字体英文名称英文可用?.ttf可用?
宋体 SimSun 不可以 不可以
黑体 SimHei 可以 可以
微软雅黑 Microsoft YaHei 可以 不可以
微软正黑体 Microsoft JhengHei 可以 不可以
新宋体 NSimSun 不可以 不可以
新细明体 PMingLiU 不可以 不可以
细明体 MingLiU 不可以 不可以
标楷体 DFKai-SB 不可以 不可以
仿宋 FangSong 可以 不可以
楷体 KaiTi 可以 不可以
隶书 LiSu 可以 不可以
幼圆 YouYuan 可以 不可以
华文细黑 STXihei 可以 可以
华文楷体 STKaiti 可以 可以
华文宋体 STSong 可以 可以
华文中宋 STZhongsong 可以 不可以
华文仿宋 STFangsong 可以 不可以
方正舒体 FZShuTi 可以 不可以
方正姚体 FZYaoti 可以 不可以
华文彩云 STCaiyun 可以 可以
华文琥珀 STHupo 可以 可以
华文隶书 STLiti 可以 可以
华文行楷 STXingkai 可以 不可以
华文新魏 STXinwei 可以 不可以

 

2.使用font

使用font设置,可以设置字体的大小。可以使用的ttf文件及其名称参见表格1的信息。

 

font = FontProperties(fname=r'c:\windows\fonts\STKaiti.ttf', size=12)


plt.xlabel("时间(秒)", fontproperties=font)
plt.ylabel("函数值(X)", fontproperties=font)
plt.title('显示sin,cos曲线', fontproperties=font)

#记得要导入库文件

from matplotlib.font_manager import FontProperties

3.使用rcParams参数

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # Solve the minus sign problems

plt.plot(t, sindata, label='sin(x)正弦')
plt.plot(t, cosdata, label='cos(x^2)余弦')

plt.xlabel("时间(秒)")
plt.ylabel("函数值(X)")
plt.title('显示sin,cos曲线')

4.使用rc参数

使用rc参数可以设定更多的font的参数。比如下面测示例,可以设定字体(font)、加黑(weight), 尺寸(size)。

ont = {'family':'SimHei',
        'weight':'bold',
        'size':'12'}
plt.rc('font', **font)
plt.rc('axes', unicode_minus=False)

plt.plot(t, sindata, label='sin(x)正弦')
plt.plot(t, cosdata, label='cos(x^2)余弦')

plt.xlabel("时间(秒)")
plt.ylabel("函数值(X)")
plt.title('显示sin,cos曲线')
  • 方式二用时才设置,且不会污染全局字体设置,更灵活
  • 方式三、方式四不需要对字体路径硬编码,而且一次设置,多次使用,更方便。

 

#!/usr/local/bin/python
# -*- coding: gbk -*-
from headm import *
from matplotlib.font_manager import FontProperties
t = linspace(0, 10, 400)
sindata = sin(t)
cosdata = cos(t**2)
#font = FontProperties(fname=r'c:\windows\fonts\STSong.ttf', size=16) #plt.rcParams['font.sans-serif'] = ['SimHei'] #plt.rcParams['axes.unicode_minus'] = False # Solve the minus sign problems


font = {'family':'SimHei', 'weight':'bold', 'size':'12'}
plt.rc(
'font', **font) plt.rc('axes', unicode_minus=False) plt.plot(t, sindata, label='sin(x)正弦') plt.plot(t, cosdata, label='cos(x^2)余弦') plt.xlabel("时间(秒)") plt.ylabel("函数值(X)") plt.title('显示sin,cos曲线')

#plt.xlabel("时间(秒)", fontproperties=font) #plt.ylabel("函数值(X)", fontproperties=font) #plt.title('显示sin,cos曲线', fontproperties=font)

plt.grid(True) plt.tight_layout() plt.legend(loc='upper right') plt.show() #------------------------------------------------------------ # END OF FILE : TEST1.PY #============================================================

 

推荐阅读