python中呼叫matplotlib畫圖,各種中文標註亂碼強力解決辦法
阿新 • • 發佈:2018-12-20
關於python中呼叫matplotlib畫圖,中文標註亂碼
如下:
1、 常規情況
2、 特殊情況
- 圖形註釋(
plt.legend()
)
- 餅狀圖(
plt.pie()
)
解決辦法:
- 針對常規情況
# 通用字型設定 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)
- 針對特殊情況(圖形註釋(
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()
效果展示: