1. 程式人生 > >python中呼叫matplotlib畫圖,各種中文標註亂碼強力解決辦法

python中呼叫matplotlib畫圖,各種中文標註亂碼強力解決辦法

關於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()

效果展示:
在這裡插入圖片描述