matplotlib汉字显示问题

复制代码
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 #============================================================
复制代码

 

posted @   chengxuyonghu  阅读(798)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示