matplotlib快速人門: 繪製各種相對複雜的圖及系統中文字體設置

Matplotlib組合直方圖

當我們一張圖需要多個直方我們改怎麼做呢?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'Arial Unicode MS'  # mac電腦設置中文字體


plt.figure(figsize=(15, 8))  # 設置畫布
x_index = np.arange(6)  # 確定label的位置
x_data = ("北京", "上海", "深圳", "廣州", "杭州", "西安")
y1_data = (11, 22, 33, 44, 55, 66)
y2_data = (22, 33, 44, 55, 66, 77)
y3_data = (77, 66, 33, 22, 11, 44)
bar_with = 0.2  # 定義一個數字代表獨立柱的寬度
rects1 = plt.bar(x_index, y1_data, width=bar_with, alpha=0.4, color="b", label="前端")
rects2 = plt.bar(x_index+bar_with, y2_data, width=bar_with, alpha=0.4, color="r", label="後端")
rects3 = plt.bar(x_index+(bar_with*2), y3_data, width=bar_with, alpha=0.4, color="g", label="AI")
plt.xticks(x_index + bar_width/2, x_data)  # 設定x軸
plt.legend()  # 顯示圖例
plt.title('這是我做測試畫的一張圖')
plt.tight_layout()
# plt.grid(axis="y")
plt.grid(ls='-.')  # 繪製背景線
plt.show()
看看效果吧

在這裏插入圖片描述

  • 注意事項: 其實這種圖不是很難, 我們要實先設置直方的寬度, 然後再使用numpy.arange() 創建一個數組, 這個數組是每個直方的位置 1 ~ n, 當我們每多一個直方時, 我們只需要將數組加上直方的寬度*n 就可以了
rects3 = plt.bar(x_index+(bar_with*2), y3_data, width=bar_with, alpha=0.4, color="g", label="AI")
上面就是一個繪製三條直方的例子, x_index是 1 ~ n 的數組, bar_with 是直方的寬度 x_index + (bar_with * 2) 就是第三條直方圖的位置, 然後我們將數據傳入即可, 繪製出我們想要的效果圖

關於中文顯示

# Windows系統設置中文字體
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# mac電腦設置中文字體
plt.rcParams["font.family"] = 'Arial Unicode MS'

繪製餅圖

import panadas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'Arial Unicode MS'  # mac電腦設置中文字體


labels = ['北京', '深圳', '上海', '杭州', '南京', '廣州', '成都', '濟南', '武漢', '西安']
sizes = [125, 108,  89,  78,  78,  46,  26,  26,  21,  19]
colors = ['lightgreen', 'gold', 'lightskyblue', 'lightcoral']
plt.figure(figsize=(15,8))
plt.pie(sizes, labels=labels,
        colors=colors, autopct='%1.1f%%', shadow=True, startangle=50)  # shadow=True 表示陰影
plt.axis('equal')  # 使圖居中
# plt.title("物聯網職位各城市需求分佈")
plt.show()

在這裏插入圖片描述

  • 具體效果如上圖所示, 許多餅圖都可以按照這個餅圖的模板來繪製

當我一張圖需要多條折線

import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'Arial Unicode MS'  # mac電腦設置中文字體


X = ["{}千米".format(x) for x in range(10)]
y = [11, 5, 6, 8, 12, 9, 7, 11, 20, 17]
z = [17, 20, 11, 7, 9, 12, 8, 6, 5, 11]
plt.figure(figsize=(15, 8))
plt.plot(X, y)
plt.plot(X, z, linestyle="--")
plt.title("這是一張測試使用的圖")
plt.xlabel("路程/km")
plt.ylabel("消耗的能量/千焦")
plt.grid()
plt.show()

在這裏插入圖片描述

一張畫布需要繪製兩張圖該怎麼辦? 參考下面的代碼吧

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'Arial Unicode MS'


X = ["{}千米".format(x) for x in range(1, 11)]
y = [11, 5, 6, 8, 12, 9, 7, 11, 20, 17]
plt.figure(figsize=(15, 8))
plt.subplot(121)  # 將畫板'1'分爲兩塊現在使用第一個塊畫圖
plt.bar(X, y, color="orange")
plt.title("這是測試的第一張圖")
plt.grid()
plt.subplot(122)  # 將畫板 '1' 分爲兩個塊現在使用第二塊畫圖
plt.pie(y, labels=X, colors=colors, autopct='%1.1f%%', shadow=True, startangle=50)
plt.title("這是我測試的第二張圖")
# plt.tight_layout()
plt.show()

在這裏插入圖片描述

看到了吧! 我們可以使用 subplot() 來聲明我們對畫布的操作, subplot 裏面的參數是三個數字, 121 中的 ‘1’ 表示對 ‘1’ 號畫(默認的畫布爲 1 可以使用plt.figure(1) 來指定畫布名) 121 中的 ‘2’ 表示將畫布分爲兩塊 121 中的第二個 ‘1’ 是用來聲明現在給第一塊區域畫圖, 122 則聲明給第二塊畫布畫圖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章