Python實現資料分析(二)
阿新 • • 發佈:2020-11-23
Matplotlib的概念和簡單應用
一、Matplotlib的概念
Matplotlib 是 Python 的繪相簿。
它可與 NumPy 一起使用,提供了一種有效的 MatLab 開源替代方案。
它也可以和圖形工具包一起使用,如 PyQt 和 wxPython。
Matplotlib的特點:
1.是專門用於開發2D圖示(包括3D圖表)
2.使用起來極其簡單
3.以漸進、互動方式實現資料視覺化
-
matplotlib架構:
-
上層呼叫下層
-
後端:實現繪圖區域(分配畫圖資源)
-
美工:
- figure、axes、axis
- xticks,yticks
- xlabel,ylabel
- plot(引數)
- lengend
-
指令碼:pytplot
-
美工層
-
figure:指整個圖形(包括所有元素,比如標題、線等)
-
axes(座標系):資料的繪圖區域
-
axis(座標軸):座標系中的一條軸,包含大小限制、刻度和刻度標籤
特點
- 一個figure可以包含多個axes(座標系)
- 一個座標系可以包含多個座標軸
-
-
-
二、Matplotlib的簡單應用
1、折線圖
- 折線圖:點的座標(橫座標,縱座標)
案例1:實現溫度變化(折線圖)繪製
步驟:
1.先生成figure
2.準備資料,折線圖點,x,y座標個數一一對應
3.顯示呼叫show()
import matplotlib.pyplot as plt
plt. figure() # 畫幕布
plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,13])# 橫座標,縱座標
plt.savefig("./test.png") # 儲存位置
plt.show()# 顯示
效果如下:
案例2:顯示上海和北京的溫度變化(同一張圖)
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
plt.figure( figsize=(20,10),dpi=80) # 畫幕布
# 準備資料
x = range(60)
x_ch = ['11點{}分'.format(i) for i in x]
y_shanghai = [random.uniform(15,18) for i in range(60)] # 變化範圍15~18
# 準備北京的溫度
y_beijing = [random.uniform(1,3) for i in range(60)] # 變化範圍1~3
y_ticks = range(40)
plt.plot(x,y_shanghai,label = '上海')
# 顯示北京的溫度
plt.plot(x,y_beijing,color = 'r',linestyle = '--',label = '北京')
# 修改刻度值
# 指定顯示的x刻度的列表
# 第一個引數:必須是指
# 第二個引數:指定跟第一個引數對應的中文
plt.xticks(x[::5],x_ch[::5])
plt.yticks(y_ticks[::5])
# 增加標題,座標描述
plt.xlabel('時間')
plt.ylabel('溫度')
plt.title('北京和上海:從11點~12點的溫度變化情況')
# 增加圖例的顯示
plt.legend(loc = 'best')
plt.savefig("./test2.png")
plt.show()
效果如下:
案例3:顯示北京和上海的溫度變化(不同圖)
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
# plt.figure(figsize=(20,10),dpi=80) # 畫幕布
# 當在多個ax裡面畫圖的時候,標籤,刻度,在相應的座標系裡指定
fig,ax=plt.subplots(nrows=1,ncols=2,figsize=(20,8))
# 準備資料
x = range(60)
x_ch = ['11點{}分'.format(i) for i in x]
y_shanghai = [random.uniform(15,18) for i in range(60)] # 變化範圍15~18
# 準備北京的溫度
y_beijing = [random.uniform(1,3) for i in range(60)] # 變化範圍1~3
y_ticks = range(40)
# plt.plot(x,y_shanghai,label = '上海')
ax[0].plot(x,y_shanghai,label = '上海')
# 顯示北京的溫度
# plt.plot(x,y_beijing,color = 'r',linestyle = '--',label = '北京')
ax[1].plot(x,y_beijing,color = 'r',linestyle = '--',label = '北京')
# 修改刻度值
# 指定顯示的x刻度的列表
# 第一個引數:必須是指
# 第二個引數:指定跟第一個引數對應的中文
# plt是對整理座標系處理,ax是對每個座標系處理
# plt.xticks(x[::5],x_ch[::5])
ax[0].set_xticks(x[::5],x_ch[::5])
ax[1].set_xticks(x[::5],x_ch[::5])
# plt.yticks(y_ticks[::5])
ax[0].set_yticks(y_ticks[::5])
ax[1].set_yticks(y_ticks[::5])
# 增加標題,座標描述
# plt.xlabel('時間')
ax[0].set_xlabel('時間')
ax[1].set_xlabel('時間')
# plt.ylabel('溫度')
ax[0].set_ylabel('溫度')
ax[1].set_ylabel('溫度')
# plt.title('北京和上海:從11點~12點的溫度變化情況')
ax[0].set_title('中午從11點~12點的溫度變化情況')
ax[1].set_title('中午從11點~12點的溫度變化情況')
# 增加圖例的顯示
# plt.legend(loc = 'best')
ax[0].legend(loc = 'best')
ax[1].legend(loc = 'best')
plt.savefig("./test3.png")
plt.show()
效果如下:
2、條形圖
plt.bar(*x**,* *height**,* *width=0.8**,* *bottom=None**, ***,* *align='center'**,* *data=None**, ****kwargs*)
案例1:顯示每部電影的票房
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
# 柱狀圖
plt.figure(figsize=(20,8))
# 電影名字,每部電影對應的票房
movie_name = ['戰狼2','哪吒之魔童降世','流浪地球','復仇者聯盟4:終局之戰','紅海行動']
x = range(len(movie_name))
y = [5639,4934,4618,4205,3622]
# 使用plt.bar顯示
# plt.bar 填入的x座標必須全是數字
plt.bar(x,y,0.2,color = ['b','r','g','y','c','m'])
# 修改刻度,以及電影名字顯示
plt.xticks(x,movie_name)
plt.savefig('./test4')
plt.show()
效果如下:
案例2:顯示每日票房與每週票房的對比
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
# 柱狀圖
plt.figure(figsize=(20,8))
movie_name = ['戰狼2','哪吒之魔童降世','流浪地球']
first_day = [10587.6,10062.5,1275.7]
first_weekend = [36224.9,34479.6,11830]
x = range(len(movie_name))
# 使用plt.bar顯示
plt.bar(x,first_day,width=0.2,label='首日票房')
plt.bar([i+0.2 for i in x],first_weekend,width=0.2,label='首周票房')
plt.xticks([i+0.1 for i in x],movie_name)
plt.legend(loc='best')
plt.title('首日票房與首周票房對比')
plt.savefig('./test5')
plt.show()
效果如下:
3、直方圖
plt.hist
plt.grid
- 組數:在統計資料時,我們把資料按照不同的範圍分成幾個組,分成的組的個數稱為組數
- 組距:每一組兩個端點的差
步驟:
1.設定組距
2.設定組數:組數=極差/組距
案例1:顯示豆瓣電影評分分佈直方圖
# 組距為1
# 建立figure
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(20,8))
score = [8.7,8.2,8.1,8,8,7.9,7.8,7.8,7.8,7.7,7.6]
bins = 0.05
group = int((max(score)-min(score))/bins)
# 畫直方圖
plt.hist(score,group,density=True) # density 頻率 預設是0
# 指定刻度和步長
plt.xticks(score[::1])
plt.title('電影評分直方圖')
plt.xlabel('電影評分')
plt.ylabel('電影資料量')
# 新增網格
plt.grid(True,linestyle = '--',alpha=1) # alpha表示格子清晰度
plt.savefig('./test6')
plt.show()
效果如下:
直方圖的場景
- 用於表示分佈情況
- 通過直方圖還可以觀察和估計哪些資料比較集中,異常或者孤立的資料分佈在何處
- 利於較小資料的分析
- 例如:使用者年齡分佈,商品價格分佈
直方圖和柱狀圖對比
- 直方圖:適合x座標資料:連續的資料,資料量大
- 柱狀圖:x座標,類別。資料量較小。
4、餅圖
plt.pie(x,labels=,autopct=,colors)
案例1:顯示每個電影的場次佔比
# 電影的排片佔比顯示
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #顯示中文標籤
plt.rcParams['axes.unicode_minus']=False
# 建立figure
plt.figure(figsize=(20,8))
movie_name = ['戰狼2','哪吒之魔童降世','流浪地球','復仇者聯盟4:終局之戰','紅海行動']
# 場次
place_count = [60605,54546,45819,28243,13270]
# 顯示餅圖
plt.pie(place_count,labels=movie_name,autopct='%1.2f%%',colors=['b','r','y','g','c'])
plt.legend(loc='best')# 新增圖例
plt.axis('equal')# 變成圓形
plt.savefig('./test7')
plt.show()
效果如下:
應用場景
分類的佔比情況
例如:班級男女分佈佔比,公司銷售額佔比
說明:
資料來源:豆瓣網和電影網
5、各類統計圖的比較:
- 條形統計圖是用一個單位長度表示一定的數量,根據數量的多少畫出長短不同的直條,它能很快的看出各種數量的多少;
- 折線統計圖是用一個單位長度表示一定的數量,根據數量的多少描出各點,然後用線段依次連線起來,它不但可以看出各種數量的多少,而且可以看出數量的增減變化情況;
- 扇形統計圖是用一個圓表示整體,用圓內各個扇形的大小表示各部分佔總數的百分比,它可以清楚看出各種數量佔整體的百分比。