一、繪制散點圖
1家凯、實例一
需求:
- 王女士和張女士約定好一起減肥,并每個禮拜一記錄體重和腰圍如失。
- 請用圖像展現(xiàn)王女士和張女士內(nèi)腰圍和體重的變化情況绊诲。
# 思路:展現(xiàn)腰圍和體重的變化規(guī)律情況,選擇散點圖;畫圖三步曲:創(chuàng)建畫布岖常、繪制圖像驯镊、展示圖像
import numpy as np
import matplotlib.pyplot as plt
# 1. 創(chuàng)建畫布
plt.figure(figsize=(20, 8), dpi=80)
# 2. 根據(jù)需求繪制圖像
x_wang_weight = [47.2, 46.6, 46.6, 46.2, 46.7, 46.5, 46.5, 46.3, 46.6, 46.3, 46.4]
y_wang_waist = [79.6, 78.6, 78.0, 77.5, 78.0, 78.0, 78.0, 78.0, 78.0, 78.6, 79.0]
x_zhang_weight = [51.5, 50.8, 51.2, 51.6, 50.9, 50.4, 50.5, 51.5, 51.8, 52.9]
y_zhang_waist = [73.0, 73.0, 75.0, 75.6, 74.0, 72.0, 73.0, 73.0, 74.0, 73.0]
plt.scatter(x_wang_weight, y_wang_waist)
plt.scatter(x_zhang_weight, y_zhang_waist)
# ① 修改x和y軸顯示
x_label = ["{:.1f}kg".format(i) for i in np.arange(45, 55, 0.5)]
plt.xticks(np.arange(45, 55, 0.5), x_label, fontsize=13)
y_label = ["{:.1f}cm".format(i) for i in np.arange(70, 80, 0.5)]
plt.yticks(np.arange(70, 80, 0.5), y_label, fontsize=13)
# ② 增加描述信息
plt.xlabel("體重/KG", fontsize=16)
plt.ylabel("腰圍/CM", fontsize=16)
plt.title("王女士&張女士體重和腰圍的變化情況", fontsize=16)
# 3. 展現(xiàn)圖像
plt.show()
output_09.png
2、完善實例一
- 對比顯示王女士和張女士的體重竭鞍、腰圍隨著時間變化情況
import numpy as np
import matplotlib.pyplot as plt
# 1. 創(chuàng)建畫布
#plt.figure(figsize=(20, 8), dpi=80)
figrue,axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=60)
# 2. 根據(jù)需求繪制圖像
x = ["第{}周".format(i) for i in range(1, 12)]
y_wang_waist = [79.6, 78.6, 78.0, 77.5, 78.0, 78.0, 78.0, 78.0, 78.0, 78.6, 79.0]
y_wang_weight = [47.2, 46.6, 46.6, 46.2, 46.7, 46.5, 46.5, 46.3, 46.6, 46.3, 46.4]
y_zhang_waist = [73.0, 73.0, 75.0, 75.6, 74.0, 72.0, 73.0, 73.0, 74.0, 73.0, 73.3]
y_zhang_weight = [51.5, 50.8, 51.2, 51.6, 50.9, 50.4, 50.5, 51.5, 51.8, 52.9, 53.0]
axes[0].plot(x, y_wang_weight, label="王小姐")
axes[0].plot(x, y_zhang_weight, label="張小姐")
axes[1].plot(x, y_wang_waist, label="王小姐")
axes[1].plot(x, y_zhang_waist, label="張小姐")
axes[0].scatter(x, y_wang_weight)
axes[0].scatter(x, y_zhang_weight)
axes[1].scatter(x, y_wang_waist)
axes[1].scatter(x, y_zhang_waist)
# ① 修改y軸分別顯示體重和腰圍
weight_label = ["{:.1f}kg".format(i) for i in np.arange(45, 60)]
axes[0].set_yticks(np.arange(45, 60))
axes[0].set_yticklabels(weight_label)
waist_label = ["{:.1f}cm".format(i) for i in np.arange(70, 80)]
axes[1].set_yticks(np.arange(70, 80))
axes[1].set_yticklabels(waist_label)
# ② 增加描述信息
axes[0].set_ylabel("體重/KG",fontsize=16)
axes[0].set_xlabel("時間/周",fontsize=16)
axes[0].set_title("王女士&張女士體重變化情況",fontsize=16)
axes[1].set_ylabel("腰圍/KG",fontsize=16)
axes[1].set_xlabel("時間/周",fontsize=16)
axes[1].set_title("王女士&張女士腰圍變化情況",fontsize=16)
# ③ 增加圖例
axes[0].legend(loc="upper center")
axes[1].legend(loc="upper center")
# ④ 增加背景網(wǎng)格
axes[0].grid(linestyle="--",alpha=0.5)
axes[1].grid(linestyle="--",alpha=0.5)
# 3. 展現(xiàn)圖像
plt.show()
output_10.png
二板惑、繪制柱狀圖
1、實例二
- 對比統(tǒng)計2019年度內(nèi)地電影票房收入前10的電影
import matplotlib.pyplot as plt
# 創(chuàng)建畫布
plt.figure(figsize=(20, 8),dpi = 80)
# 準(zhǔn)備數(shù)據(jù)
movie_name = ["哪吒之魔童降世","流浪地球","復(fù)仇者聯(lián)盟4:終局之戰(zhàn)","我和我的祖國","中國機長","瘋狂的外星人","飛馳人生","烈火·英雄",
"少年的你","速度與激情:特別行動"]
movie_total_BoxOffice = [49.19,46.40,41.91,30.24,28.52,21.92,17.09,16.76,15.42,14.07]
# 繪制圖像
plt.bar(movie_name, movie_total_BoxOffice, width=0.5, color=["b","y","g","r","m","b", "c"])
# ① 修改x和y刻度
plt.xticks(rotation=45,fontsize=12)
plt.yticks(range(51)[::5], fontsize=12)
# ② 增加網(wǎng)格背景
plt.grid(linestyle="--", alpha=0.5)
# ③ 增加描述信息
plt.ylabel("總票房,單位:億", fontsize=16)
plt.title("2019年度內(nèi)地電影票房收入排名前十的影片", fontsize=16)
# 展示圖像
plt.show()
output_11.png
2偎快、完善實例二
- 對比同一時間的票房信息冯乘,如:首日和首周的票房情況
import numpy as np
import matplotlib.pyplot as plt
# 創(chuàng)建畫布
plt.figure(figsize=(20, 8),dpi = 80)
# 準(zhǔn)備數(shù)據(jù)
movie_name = ["哪吒之魔童降世","流浪地球","復(fù)仇者聯(lián)盟4:終局之戰(zhàn)","我和我的祖國","中國機長"]
movie_total_BoxOffice = [49.19,46.40,41.91,30.24,28.52]
first_day_BoxOffice = [1.38, 1.88, 5.35, 2.89, 2.05]
first_week_BoxOffice = [6.49, 19.98, 20.35, 20.59, 17.33]
# 繪制圖像
# 核心:繪制時兩種類別使用偏移量
width = 0.3
index = np.arange(len(movie_name))
plt.bar(movie_name, first_day_BoxOffice, width, color="b", label="首日票房")
plt.bar((index + width), first_week_BoxOffice, width, color="r",label="首周票房")
# ① 修改x和y刻度
plt.xticks(rotation=45, fontsize=15)
plt.yticks(range(51)[::5], fontsize=15)
# ② 增加網(wǎng)格背景
plt.grid(linestyle="--", alpha=0.3)
# ③ 增加描述信息
plt.ylabel("總票房,單位/億", fontsize=18)
plt.title("2019年度內(nèi)地電影票房排名前五的電影首映日和第一周票房統(tǒng)計情況", fontsize=18)
# ④ 增加圖例
plt.legend(loc="upper center")
# 展示圖像
plt.show()
output_12.png
三、繪制直方圖
- 需求:
假設(shè)你獲取了250部電影的時長(列表times中)晒夹,希望統(tǒng)計出這些電影時長的分布狀態(tài)(如時長為100分鐘到120分鐘電影的數(shù)量裆馒,出現(xiàn)的頻率)等信息,應(yīng)該如何呈現(xiàn)這些數(shù)據(jù)丐怯?
import matplotlib.pyplot as plt
# 1. 準(zhǔn)備數(shù)據(jù)
times = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124,
101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111, 78, 132, 124, 113, 150, 110, 117, 86,
95, 144, 105, 126, 130, 126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136, 123, 117, 119, 105, 137,
123, 128, 125, 104, 109, 134, 125, 127, 105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114, 105, 115,
132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134, 156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,
123, 107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133, 112, 114, 122, 109, 106, 123, 116, 131, 127,
115, 118, 112, 135, 115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154, 136, 100, 118, 119, 133, 134,
106, 129, 126, 110, 111, 109, 141, 120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126, 114, 140, 103,
130, 141, 117, 106, 114, 121, 114, 133, 137, 92, 121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113, 134,
106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110, 105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146,
133, 101, 131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111, 111, 133, 150]
# 計算組數(shù)(將數(shù)據(jù)共分多少個組喷好,計算公式:極差 / 組距,即(最大值-最小值)/組距 = 組數(shù))
d = 3 #定義組距(每個小組兩個端點的距離,即電影時長間隔分鐘數(shù))
num_bins = (max(times) - min(times)) // d
# 2. 創(chuàng)建畫布
plt.figure(figsize=(20, 8), dpi = 80)
# 3. 繪制圖像
plt.hist(times, num_bins, density=True) # 加上density=True屬性之后變?yōu)轭l率分布直方圖
# 設(shè)置x軸的刻度
plt.xticks(range(min(times), max(times)+d, d))
# 增加網(wǎng)格
plt.grid(linestyle="--", alpha=0.3)
# 3. 展示圖像
plt.show()
output_13.png
四读跷、繪制餅圖
- 需求:
統(tǒng)計2020年8月13日內(nèi)地日票房占比情況
import matplotlib.pyplot as plt
# 1. 準(zhǔn)備數(shù)據(jù)
movie_name = ["1917", "星際穿越", "多利特的奇幻冒險", "極速車王", "刺猬索尼克", "喋血戰(zhàn)士"]
tickets = [5672.4, 5010.7, 2888.7, 1422.1, 808.1, 511.6]
# 2. 創(chuàng)建畫布
plt.figure(figsize=(20, 8), dpi = 80)
# 3. 繪制圖像
color = ["y", "b", "m", "c","r", "g"]
font = {'fontsize':15,'color':'black'}
# 每一塊餅圖離開中心距離梗搅,默認(rèn)值為(0,0,...),即不離開中心效览;
explode = (0.1,0,0,0,0,0) # 將第一塊分離出來
# shadow表示顯示陰影;counterclock指定指針方向无切,默認(rèn)True表示逆時針;
# labeldistance指定label顯示位置,相對于半徑的比例,如<1則繪制在餅圖內(nèi)側(cè)丐枉,默認(rèn)值為1.1;
# pctdistance類似于labeldistance,指定autopct的位置刻度哆键,默認(rèn)值為0.6
plt.pie(tickets, labels=movie_name, autopct="%1.2f%%", colors = color, textprops = font,
explode=explode,shadow=True, pctdistance=0.4, labeldistance=0.8)
plt.axis("equal") # 保持餅圖顯示圓形,添加plt.axis("equal")使得長寬一樣
# 增加圖例
plt.legend()
# 添加描述
plt.title("2020年8月13日內(nèi)地日票房占比情況", fontsize = 18)
# 4. 展示圖片
plt.show()
output_14.png
五瘦锹、matplotlib總結(jié)
1籍嘹、matplotlib三層結(jié)構(gòu)
-
容器層
- 畫板層(Canvas)
- 畫布層(Figure)——>創(chuàng)建畫布(指定尺寸和像素[清晰度])
- 繪圖區(qū)/坐標(biāo)系(Axes)——>繪制圖像——>結(jié)合輔助顯示區(qū)使圖更豐富
輔助顯示層(在繪圖區(qū)之上)——>修改x和y軸刻度闪盔、描述信息、圖例等
圖像層(在繪圖區(qū)之上)——>根據(jù)數(shù)據(jù)描繪圖像
2辱士、不同類圖形應(yīng)用場景
常見圖形 | 應(yīng)用場景(關(guān)鍵字) | 繪制 |
---|---|---|
折線圖 | 展現(xiàn)某事物(指標(biāo))隨時間或者其他變化情況锭沟、各種數(shù)學(xué)函數(shù) | matplotlib.plot(…) |
散點圖 | 展現(xiàn)不同事物(指標(biāo)/變量)之間的關(guān)系/規(guī)律 | matplotlib.scatter(…) |
柱狀圖 | 統(tǒng)計對比同一事物不同類別的大小或數(shù)量 | matplotlib.bar(…) |
直方圖 | 展現(xiàn)某事物(指標(biāo))的分布狀態(tài) | matplotlib.hist(…) |
餅圖 | 展現(xiàn)某事物的占比情況(一般不超過9個類別) | matplotlib.pie(…) |
3、matplotlib繪圖總結(jié)
matplotlib工具總結(jié).png