Matplotlib組合直方圖
當我們一張圖需要多個直方我們改怎麼做呢?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'Arial Unicode MS'
plt.figure(figsize=(15, 8))
x_index = np.arange(6)
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)
plt.legend()
plt.title('這是我做測試畫的一張圖')
plt.tight_layout()
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) 就是第三條直方圖的位置, 然後我們將數據傳入即可, 繪製出我們想要的效果圖
關於中文顯示
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams["font.family"] = 'Arial Unicode MS'
繪製餅圖
import panadas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'Arial Unicode MS'
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)
plt.axis('equal')
plt.show()
- 具體效果如上圖所示, 許多餅圖都可以按照這個餅圖的模板來繪製
當我一張圖需要多條折線
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = 'Arial Unicode MS'
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)
plt.bar(X, y, color="orange")
plt.title("這是測試的第一張圖")
plt.grid()
plt.subplot(122)
plt.pie(y, labels=X, colors=colors, autopct='%1.1f%%', shadow=True, startangle=50)
plt.title("這是我測試的第二張圖")
plt.show()
看到了吧! 我們可以使用 subplot() 來聲明我們對畫布的操作, subplot 裏面的參數是三個數字, 121 中的 ‘1’ 表示對 ‘1’ 號畫(默認的畫布爲 1 可以使用plt.figure(1) 來指定畫布名) 121 中的 ‘2’ 表示將畫布分爲兩塊 121 中的第二個 ‘1’ 是用來聲明現在給第一塊區域畫圖, 122 則聲明給第二塊畫布畫圖