1. 程式人生 > 實用技巧 >Day05-黑馬學習篇(二)matplot基本繪圖函式集合

Day05-黑馬學習篇(二)matplot基本繪圖函式集合

一、上節回顧

繪製網格:plt.grid()

  引數:alpha=''設定透明度,(0~1,1為完全不透明,0為完全透明)

同時繪製兩個表格

  只需要plot兩次即可,matplotlib會自動幫助使用者解決掉圖形的顏色區分問題

圖例(圖形區分)

1、新增圖例名:plot(x,y,laber = ' xxx ')

2、呼叫函式legend(),引數如下

  (1)loc :

      best :0

      upper right/left :1/2

      lower left/right : 3/4

      right :5

      center left/right : 6/7

      lower/upper center : 8/9

      center : 10

3、plot中傳入引數color = ' '可以改變線條顏色(r 紅色 h綠色 b藍色 w 白色 c 青色 n 洋紅 y 黃色 k 黑色),linestyle = ' ' 可以改變線條風格(- 實線 -- 虛線 -. 點劃線 : 點虛線),linewidth = 可以改變線條粗細。alpha = 改變透明度(注:網格和plot畫圖中這些引數相同)

二、運用matplotlib畫其它圖形

不同圖形的應用場景

  1、折線圖:以折線的上升或下降來表示統計數量的增減變化的統計圖

    特點:能夠顯示資料的變化趨勢,反映事物的變化情況。(變化)

  2、直方圖:由一系列高度不等的縱向條紋或線段來表示資料分佈的情況,一 般用橫軸表示資料範圍,縱軸表示分佈情況

    特點:繪製連續性的資料,展示一組或多組資料分佈情況(統計)

  3、條形圖:排列在工作表的列或者行中的資料可以繪製到條形圖中

    特點:繪製離散型的資料,能夠一眼看出多個數據的大小,比較資料之間 的差別(統計)

  4、散點圖:用兩組資料構成多個座標點,考察座標點的分佈,判斷兩變數之 間是否存在某種關聯或總結座標點的分佈模式

    特點:判斷變數之間是否存在關聯關係,展示離群點(分佈規律)

繪製散點圖

  1、繪圖函式:plt.scatter(x,y)

  2、要點

    (1)之所以要將兩組資料的range設定的中間差較大,是防止兩資料因為間隔原因而重疊

    (2)設定的數字值要和字串個數一一對應,所以迴圈中引入的列表就是最初的數值列表

#散點圖
from matplotlib import pyplot as plt

y_3 = [11,17,16,11,12,6,6,7,8,9,12,15,14,17,18,21,16,17,20,14,15,15,15,19,21,22,22,22,23,23,24]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,17,10,11,13,12,13,6]

x_3 = range(1,32)
x_10 = range(51,82)

#設定圖形大小
plt.figure(figsize=(20,8),dpi = 80)

#繪製散點圖
plt.scatter(x_3,y_3,label ="3月份")
plt.scatter(x_10,y_10,label = "10月份")

#設定x軸刻度
_x = list(x_3)+list(x_10)
_xtick = ["3月{}日".format(i) for i in x_3]
_xtick += ["10月{}日".format(i-50) for i in x_3]
plt.xticks(_x[::3],_xtick[::3],rotation = 45)

#新增圖例
plt.legend(loc = "upper left")

#新增描述資訊
plt.xlabel("時間")
plt.ylabel("溫度")
plt.title("標題")

#展示圖形
plt.show()

繪製條形圖

  1、繪圖函式:plt.bar(x,y,width=)

  2、正常繪圖:

#條形圖
from matplotlib import pyplot as plt

a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸","加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3","智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#繪製條形圖
plt.bar(a,b,width=0.3)

plt.xticks(rotation = 90)


#展示圖片
plt.show()

  3、當遇見字串過長的時候我們需要讓圖片橫過來顯示:plt.barh(x,y,hight=)

#橫著的條形圖
from matplotlib import pyplot as plt

a = ["戰狼2","速度與激情8","功夫瑜伽","西遊伏妖篇","變形金剛5:最後的騎士","摔跤吧!爸爸","加勒比海盜5:死無對證","金剛:骷髏島","極限特工:終極迴歸","生化危機6:終章","乘風破浪","神偷奶爸3","智取威虎山","大鬧天竺","金剛狼3:殊死一戰","蜘蛛俠:英雄歸來","悟空傳","銀河護衛隊2","情聖","新木乃伊",]
b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23]

#繪製條形圖
plt.barh(a,b,height=0.3,color = 'orange')

#新增網格
plt.grid(alpha=0.3)

#展示圖片
plt.show()

  4、小測驗(注意需要控制數值資料之間的寬度防止出現條形圖重疊現象)

#小測驗

from matplotlib import pyplot as plt

a = ["猩球崛起3:終極之戰","敦刻爾克","蜘蛛俠:英雄歸來","戰狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]

bar_width  = 0.2

x_14 = list(range(len(a)))
x_15 = [i+bar_width for i in x_14]
x_16 = [i+bar_width*2 for i in x_14]

plt.bar(x_14,b_15,width=0.2,color = "orange",label = "9月14日")
plt.bar(x_15,b_15,width=0.2,color = "blue",label = "9月15日")
plt.bar(x_16,b_16,width=0.2,color = "pink",label = "9月16日")

plt.legend(loc = "upper right")
plt.xticks(x_15,a)

plt.show()

繪製直方圖

  1、繪圖函式:plt.hist(a,num_bins) 引數a為列表,引數num_bins代表組數

  2、組數:資料的分組,當資料在100以內時,按資料多少常分為5-12組

  3、組距:指每個想租的兩個端點之間的距離

  4、組數 = 極差/組距

  5、圖形繪製:頻數分佈和頻率分佈的區別在於hist()函式中的引數normed,改為True即可表示頻率分佈。此程式中存在一些刻度偏差問題。解決方法有多種(1)提前規定好正確的刻度(2)採用刻度間距定義組距的方式進行。

#頻數分佈直方圖
from matplotlib import pyplot as plt

a=[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]

#計算組數
d = 3 #採用提前規定好組距的方式解決偏移問題
num_bins = (max(a)-min(a))//d

plt.figure(figsize=(20,5),dpi=80)
plt.hist(a,num_bins)  #plt.hist(a,num_bins,normed = True)頻率分佈直方圖

# 採用刻度間距代替組距的方式解決偏移問題
# plt.hist(a,range(min(a),max(a)+d,d))

#設定x軸的刻度
plt.xticks(range(min(a),max(a)+d,d))

plt.grid()

plt.show()

  6、沒有進行過統計的資料才被用作繪製直方圖,如果資料已經被處理了,比如分了組,得出了每個組出現的頻數,我們用這些資料可以繪製成條形圖,修改條形圖的樣式呈現出直方圖的效果即可。(令條形圖的width=1可以使條形圖中間沒有間隔,達到形成直方圖的目的)

#條形圖與直方圖之間的轉換

from matplotlib import pyplot as plt

interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]

plt.figure(figsize=(20,5),dpi = 80)

plt.bar(range(len(interval)),quantity,width=1)

#設定x軸的刻度
_x = [i-0.5 for i in range(13)]
_xtick_labels = interval+[150]
plt.xticks(_x,_xtick_labels)

plt.grid()
plt.show()

  7、應用場景

    (1)使用者的年林分佈狀態

    (2)一段時間內使用者點選次數的分佈狀態

    (3)使用者活躍時間的分佈狀態