python中调用matplotlib画图,各种中文标注乱码强力解决办法

版权声明:未经本人同意不得转载! https://blog.csdn.net/yanpenggong/article/details/83652794

关于python中调用matplotlib画图,中文标注乱码
如下:

1、 常规情况

在这里插入图片描述

2、 特殊情况

  • 图形注释(plt.legend())
    在这里插入图片描述
  • 饼状图(plt.pie())
    在这里插入图片描述

解决办法:

  1. 针对常规情况
# 通用字体设置
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="本机字体路径")
# my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")
...
# 使用方法
plt.xlabel("内容描述",fontproperties=my_font)
  1. 针对特殊情况(图形注释(plt.legend())、饼状图(plt.pie()))下解决办法
    • 遇到图形注释(plt.legend())解决办法
      # 通用字体设置
      from matplotlib import font_manager
      my_font = font_manager.FontProperties(fname="本机字体路径")
      # my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")
      ...
      # 使用方法
      plt.legend(prop=my_font)
      
    • 遇到饼状图(plt.pie())解决办法
      # 通用字体设置
      from matplotlib import font_manager
      my_font = font_manager.FontProperties(fname="本机字体路径")
      # my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")
      ...
      # 使用方法
      patches,l_text,p_text = plt.pie(place_count, labels=movie_name, autopct="%1.2f%%")
      for t in l_text: 
      	t.set_fontproperties(my_font) # 把每个文本设成中文字体
      

实例1: matplotlib折线图及中文标注显示

from matplotlib import pyplot as plt
import random


# windows 和linux设置字体的方法
# import matplotlib

# font = {'family' : 'MicroSoft YaHei',
#         'weight' : 'bold',
#         'size'   : 10}
# matplotlib.rc("font", **font)

# 通用字体设置
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")


x = range(0,120)
y = [random.randint(20,35) for i in range(120)]

plt.figure(figsize=(20,8), dpi=80)

plt.plot(x,y)

x_label =list(x)
x_label_show = ["10点{}分".format(i) for i in range(60)]
x_label_show += ["11点{}分".format(i-60) for i in range(60,120)]
plt.xticks(x_label[::3],x_label_show[::3],rotation=45, fontproperties=my_font)  # rotation旋转的度数

# 添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 单位(°C)",fontproperties=my_font)
plt.title("10点到12点每分钟点气温变化情况",fontproperties=my_font)

plt.show()

效果展示:
在这里插入图片描述

实例2: matplotlib图形注释及中文标注显示

import matplotlib.pyplot as plt
from matplotlib import font_manager

# 中文字体准备
my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")

# 生成fig
plt.figure(figsize=(20, 8), dpi=80)

# 电影名字,每部电影对应的票房
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
movie_BoxOffice = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
first_day = [10587.6,10062.5,1275.7,2661,2406,1454,1452,1386,1319,1127,8886]
first_weekend=[36224.9,34479.6,11830,7985,7419,4362,4358,4159,3958,3382,26660]
x = range(len(movie_name))

# 使用 plt.bar 显示柱状图
# plt.bar: 填入的x坐标必须全是数字
# plt.bar(x, movie_BoxOffice, width=0.2, color=['b','r','g','y','c','m','y','k','c','g','g'])
width = 0.3
plt.bar(x, movie_BoxOffice, width, label="总票房")
plt.bar([i+width for i in x], first_day, width, label="第一天票房")
plt.bar([i+width*2 for i in x], first_weekend, width, label="第一周票房")

# 修改刻度,以电影名字显示
plt.xticks([i+width for i in x],movie_name, fontproperties=my_font)

# 增加标题,坐标描述
plt.xlabel("电影名", fontproperties=my_font)
plt.ylabel("数量(个)", fontproperties=my_font)

# 图形注释
plt.legend(prop=my_font, loc="upper right")

# 图形保存到该文件路径下
plt.savefig("bar.png")

plt.show()

效果展示:
在这里插入图片描述

实例3: matplotlib饼状图及中文标注显示

import matplotlib.pyplot as plt
from matplotlib import font_manager

# 中文字体准备
my_font = font_manager.FontProperties(fname="/Library/Fonts/Songti.ttc")

# 数据准备
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]

# 显示饼图
# patches:为了得到饼图的返回值
# l_texts:饼图外标签的文本
# p_texts:饼图内部文本的
patches,l_text,p_text = plt.pie(place_count, labels=movie_name, autopct="%1.2f%%",  colors=['b', 'r', 'g', 'y', 'c', 'm', 'y', 'm', 'c', 'g', 'g'], shadow=True, startangle=90, labeldistance = 1.1, pctdistance = 0.8)
# labeldistance:文本的位置离远点有多远,1.1指1.1倍半径的位置
# autopct:圆里面的文本格式,%1.2f %%表示小数有2位,整数有1位的浮点数
# shadow:饼是否有阴影
# startAngle:起始角度为0,从0开始逆时针转,为第一块。一般选择从90度开始比较好看
# pctdistance:百分比的文本离圆心的距离

for t in l_text: 
    t.set_fontproperties(my_font) # 把每个文本设成中文字体
    
# 图形保存到该文件路径下
plt.savefig("pie.png")

# 保持饼形图圆形,保证长宽一样
plt.axis("equal")

plt.show()

效果展示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yanpenggong/article/details/83652794