1、定義python
matplotlib:最流行的python的底層繪圖庫,主要作數據可視化,模仿MATLAB構建app
2、爲何學習dom
1,能將數據進行可視化,更直觀的呈現學習
2,使數據更加客觀,更具說服力字體
3、基礎繪圖大數據
案列1 :假設一天中每隔兩小時(range(2,26,2))的氣溫分別是[15,13,14,5,17,20,25,26,26,24,22,18,15]orm
# 代碼 import matplotlib.pyplot as plt # 規範,官方推薦 # 構建座標 x = range(2,26,2) y = [15,13,14.5,17,20,25,26,26,24,22,18,15] # 畫圖 plt.plot(x, y) # 顯示圖標 plt.show()
1,一、保存圖片blog
# 代碼 fig = plt.figure(figsize=(20,8), dpi=100) plt.plot(x,y) fig.savefig('test.png')
1,二、X軸,Y軸的調整圖片
# 代碼 plt.plot(x, y) # x軸的刻度 plt.xticks(x) # y軸的刻度 plt.yticks(y) plt.show()
案列2 :列表a表示10點到12點每一分鐘的氣溫,如何繪製折線圖觀察每分鐘的氣溫?字符串
a=[random.randint(20,35) for in range(120)]
# 代碼 import random # 隨機氣溫值 # y = [] # 產生120個隨機值 #for i in range(120): # y.append(random.randint(20,35)) # 列表生成式 y = [random.randint(20,35) for i in range(120)] x = list(range(120)) # 設置圖片大小 fig = plt.figure(figsize=(20,8)) # 畫圖 plt.plot(x,y) # 調整刻度 xlables = ['10點{}分'.format(i) for i in range(60) ] xlables += ['11點{}分'.format(i) for i in range(60) ] plt.xticks(x[::3], xlables[::3]) plt.yticks(y) plt.show()
2,1 顯示中文
matplotlib默認不支持中文字符,須要修改默認字體來顯示中文字符
# 代碼 import random import matplotlib as mpl # 設置字符集 mpl.rcParams['font.sans-serif'] = ['FangSong'] # 用來正常顯示中文標籤 mpl.rcParams['font.size'] = 16 # 設置字體大小 # 隨機氣溫值 # y = [] # 產生120個隨機值 #for i in range(120): # y.append(random.randint(20,35)) # 列表生成式 y = [random.randint(20,35) for i in range(120)] x = list(range(120)) # 設置圖片大小 fig = plt.figure(figsize=(20,8)) # 畫圖 plt.plot(x,y) # 調整刻度 xlables = ['10點{}分'.format(i) for i in range(60) ] xlables += ['11點{}分'.format(i) for i in range(60) ] plt.xticks(x[::3], xlables[::3], rotation=45) plt.yticks(y) plt.show()
2,2 添加描述信息
X,Y軸的描述
# 代碼 y = [random.randint(20,35) for i in range(120)] x = list(range(120)) # 設置圖片大小 fig = plt.figure(figsize=(20,8)) # 畫圖 plt.plot(x,y) # 調整刻度 xlables = ['10點{}分'.format(i) for i in range(60) ] xlables += ['11點{}分'.format(i) for i in range(60) ] plt.xticks(x[::3], xlables[::3], rotation=45) plt.yticks(y) # 添加描述 plt.xlabel('時間', color='red', fontdict={'fontsize': 20}) plt.ylabel('溫度') plt.show()
2,3 圖形標題
# 代碼 y = [random.randint(20,35) for i in range(120)] x = list(range(120)) # 設置圖片大小 fig = plt.figure(figsize=(20,8)) # 畫圖 plt.plot(x,y) # 調整刻度 xlables = ['10點{}分'.format(i) for i in range(60) ] xlables += ['11點{}分'.format(i) for i in range(60) ] plt.xticks(x[::3], xlables[::3], rotation=45) plt.yticks(y) # 添加描述 plt.xlabel('時間', color='red', fontdict={'fontsize': 20}) plt.ylabel('溫度') # 設置標題 plt.title('某日10點到12點間的溫度變化狀況') plt.show()
2,4 添加網格
# 代碼 y = [random.randint(20,35) for i in range(120)] x = list(range(120)) # 設置圖片大小 fig = plt.figure(figsize=(20,8)) # 畫圖 plt.plot(x,y) # 調整刻度 xlables = ['10點{}分'.format(i) for i in range(60) ] xlables += ['11點{}分'.format(i) for i in range(60) ] plt.xticks(x[::3], xlables[::3], rotation=45) plt.yticks(y) # 添加描述 plt.xlabel('時間', color='red', fontdict={'fontsize': 20}) plt.ylabel('溫度') # 設置標題 plt.title('某日10點到12點間的溫度變化狀況') # 添加網格 plt.grid(alpha=0.1) plt.show()
案列3 :
問題:根據實際狀況統計出來你和你的同桌各自從11歲到30歲每一年交的男(女)朋友的數量如列表a和b,請在一個圖中繪製出該數據的折線圖,以便比較本身和同桌20年間的差別,同時分析每一年交男(女)朋友的數量趨勢
a=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
b=[1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1]
#代碼 import matplotlib.pyplot as plt import matplotlib as mpl # 設置中文 mpl.rcParams['font.sans-serif'] = ['FangSong'] # 用來正常顯示中文標籤 mpl.rcParams['font.size'] = 16 # 設置字體大小 # 構建座標 # x軸表示 年齡 ,y軸表示女友個數 x = range(11, 31) y_self = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1] y_d = [1,0,3,1,2,2,3,3,2,1,2,1,1,1,1,1,1,1,1,1] # 建立容器 fig = plt.figure(figsize=(20,8)) # 畫圖 plt.plot(x, y_self, label='本身', color='black', linestyle='-.') plt.plot(x, y_d, label='同桌') # 設置刻度 x_lables = ['{}歲'.format(i) for i in x] plt.xticks(x, x_lables) plt.xlabel('年齡') plt.ylabel('女友個數') plt.title('我和同桌曆年交女友個數對比') # 設置了圖例必定要加上這句話 plt.legend() plt.grid(alpha=0.3) # 標記點 plt.annotate('最高點',xy=(23,6), xytext=(24, 6),arrowprops={'arrowstyle': '<->'}) plt.show()
--一些自定義繪圖風格
# 代碼 plt.plot( x, y, color='r', # 線條顏色 linestyle='--', # 線條風格 linewidth=5, # 線條粗細 alpha=0.5 #透明度 )
--標記一個點
# 代碼 plt.annotate(text='最高點', xytext=(24, 6.1), xy=(23, 6), arrowprops={'arrowstyle': '->'}) # text 想要標記的文本 # xytext 標記文本的座標 # xy 被標記點的座標 # arrowprops 箭頭形式
四,簡單圖形總結
1,繪製了折線圖
2,設置圖片的大小和分辨率
3,實現了圖片的保存
4,設置了XY軸上的刻度和字符串
5,解決了刻度稀疏和密集的問題
6,設置了標題,X,Y軸的lable
7,設置了字體
8,在一個圖形上繪製多個圖形
9,爲不一樣圖形添加圖例
5、繪製散點圖
假設經過爬蟲你獲取了北京2016年3月份,10月份天天白天的最高氣溫(分別位於列表a,b),要求找出氣溫隨時間變化的規律
a = [10, 16, 17, 14, 12, 10, 12, 6, 6, 7, 8, 9, 12, 15, 15, 17, 18, 21, 16, 16, 20, 13, 15, 15, 15, 18, 20, 22, 22, 22, 24]
b = [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]import matplotlib.pyplot as plt
import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['fangsong']#用來正常顯示中文標籤 mpl.rcParams['font.size'] = 16 #設置字體大小 y_3 = [10, 16, 17, 14, 12, 10, 12, 6, 6, 7, 8, 9, 12, 15, 15, 17, 18, 21, 16, 16, 20, 13, 15, 15, 15, 18, 20, 22, 22, 22, 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=list(range(1,32)) x_10=[i+50 for i in x_3] #設置容器 fig=plt.figure(figsize=(15,8)) #繪圖 plt.scatter(x_3,y_3,label='3月份') plt.scatter(x_10,y_10,label='10月份') #設置刻度 #集合 y=set(y_3+y_10) min_y=min(y) max_y=max(y) plt.yticks(range(min_y,max_y)) #x軸 x=x_3+x_10 x_lables=['3月{}日'.format(i) for i in range(1,32)]+['10月{}日'.format(i) for i in range(1,32)] plt.xticks(x[::2],x_lables[::2],rotation=45) plt.xlabel('日期') plt.ylabel('溫度(C)') plt.title('北京2016年3月份和10月份的氣溫變化趨勢圖') plt.annotate('最高點',xy=(53,28),xytext=(56,28),arrowprops={'arrowstyle':'<->'}) plt.annotate('最低點',xy=(73,5),xytext=(76,5),arrowprops={'arrowstyle':'<->'}) plt.grid(alpha=0.3) plt.legend() plt.show()
散點圖更多的應用場景:
--不一樣條件(維度)之間的內在關聯聯繫
--觀察數據的離散程度
6、繪製條形圖
假設你獲取了2019內地電影票房前20的電影(列表X)和電影票房數據(列表Y),那麼如何更加直觀的展現數據
x = ['哪吒之魔童降世', '流浪地球', '復仇者聯盟4:終局之戰', '瘋狂的外星人', '飛馳人生', '烈火英雄', '速度與激情:特別行動', '蜘蛛俠:英雄遠征', '掃毒2天地對決', '大黃蜂', '驚奇隊長', '比悲傷更悲傷的故事', '哥斯拉2:怪獸之王', '阿麗塔:戰鬥天使', '銀河補習班', '獅子王', '反貪風暴4 ', '熊出沒·原始時代', '使徒行者2:諜影行動', '大偵探皮卡丘']
y = [49.04, 46.18, 42.05, 21.83, 17.03, 16.74, 14.16, 14.01, 12.85, 11.38, 10.25, 9.46, 9.27, 8.88, 8.64, 8.23, 7.88, 7.09, 6.92, 6.34]
# 代碼 import matplotlib as mpl import matplotlib.pyplot as plt # 設置中文 mpl.rcParams['font.sans-serif'] = ['FangSong'] # 用來正常顯示中文標籤 mpl.rcParams['font.size'] = 16 # 設置字體大小 # 構建座標 movies = ['哪吒之魔童降世', '流浪地球', '復仇者聯盟4:終局之戰', '瘋狂的外星人', '飛馳人生', '烈火英雄', '速度與激情:特別行動', '蜘蛛俠:英雄遠征', '掃毒2天地對決', '大黃蜂', '驚奇隊長', '比悲傷更悲傷的故事', '哥斯拉2:怪獸之王', '阿麗塔:戰鬥天使', '銀河補習班', '獅子王', '反貪風暴4 ', '熊出沒·原始時代', '使徒行者2:諜影行動', '大偵探皮卡丘'] y = [49.04, 46.18, 42.05, 21.83, 17.03, 16.74, 14.16, 14.01, 12.85, 11.38, 10.25, 9.46, 9.27, 8.88, 8.64, 8.23, 7.88, 7.09, 6.92, 6.34] x = range(len(movies)) # 畫圖 fig = plt.figure(figsize=(20,8), dpi=100) plt.bar(x, y, width=0.5, color='orange') # 刻度 plt.xticks(x, movies, rotation=-90) plt.xlabel('電影') plt.ylabel('票房(億元)') plt.title('2019年內地前20名電影票房榜') # 網格 # plt.grid() plt.show()
--橫向條形圖
# 代碼 import matplotlib as mpl import matplotlib.pyplot as plt # 設置中文 mpl.rcParams['font.sans-serif'] = ['FangSong'] # 用來正常顯示中文標籤 mpl.rcParams['font.size'] = 16 # 設置字體大小 # 構建座標 movies = ['哪吒之魔童降世', '流浪地球', '復仇者聯盟4:終局之戰', '瘋狂的外星人', '飛馳人生', '烈火英雄', '速度與激情:特別行動', '蜘蛛俠:英雄遠征', '掃毒2天地對決', '大黃蜂', '驚奇隊長', '比悲傷更悲傷的故事', '哥斯拉2:怪獸之王', '阿麗塔:戰鬥天使', '銀河補習班', '獅子王', '反貪風暴4 ', '熊出沒·原始時代', '使徒行者2:諜影行動', '大偵探皮卡丘'] y = [49.04, 46.18, 42.05, 21.83, 17.03, 16.74, 14.16, 14.01, 12.85, 11.38, 10.25, 9.46, 9.27, 8.88, 8.64, 8.23, 7.88, 7.09, 6.92, 6.34] x = range(len(movies)) # 畫圖 fig = plt.figure(figsize=(20,8), dpi=100) plt.barh(x, y, color='orange') # 刻度 plt.yticks(x, movies) plt.ylabel('電影') plt.xlabel('票房(億元)') plt.title('2019年內地前20名電影票房榜') # 網格 # plt.grid() plt.show()
列表a中的電影最近5天的電影分別在列表,b_25,b_26,b_27,b_28,b_29中,爲了展現電影自己票房,及同其餘電影數據的對比,應該如何更直觀的呈現數據
a = ['決勝時刻', '誅仙Ⅰ', '小小的願望']
b_25 = [891.4, 246.71, 550.45]
b_26 = [81]9.27, 397.18, 513.67]
b_27 = [867.78, 480.43, 752.36]
b_28 = [533.09, 500.42, 780.69]
b_29 = [679.87, 462.28, 374.11]
# 代碼 # 導庫 import matplotlib as mpl import matplotlib.pyplot as plt # 設置中文 mpl.rcParams['font.sans-serif'] = ['Fangsong'] mpl.rcParams['font.size'] = 16 # 準備數據 a = ['決勝時刻', '誅仙Ⅰ', '小小的願望'] b_25 = [891.4, 246.71, 550.45] b_26 = [819.27, 397.18, 513.67] b_27 = [867.78, 480.43, 752.36] b_28 = [533.09, 500.42, 780.69] b_29 = [679.87, 462.28, 374.11] # fig = plt.figure(figsize=(20,8)) width = 0.1 plt.bar(range(3), b_25, width=width) plt.bar([i+width for i in range(3)], b_26, width=width, label='9月26日') plt.bar([i+width*2 for i in range(3)], b_27, width=width, label='9月27日') plt.bar([i+width*3 for i in range(3)], b_28, width=width, label='9月28日') plt.bar([i+width*4 for i in range(3)], b_29, width=width, label='9月29日') # 刻度 plt.xticks([0.2, 1.2, 2.2], a) # 描述信息 plt.xlabel('電影') plt.ylabel('票房(萬)') plt.title('某些電影的票房') plt.legend() plt.show()
--條形圖應用更多的場景
-數量的統計
-頻率的統計
7、繪製直方圖
咱們獲取了347部電影的時長(列表data中),但願統計出這些電影的時長分佈狀態(好比時長100到120分鐘的數量,出現頻次等)等信息,你該如何呈現這些數據
data = [110, 201, 160, 152, 139, 178, 179, 83, 67, 132, 136, 177, 162, 110, 132, 115, 108, 102, 76, 105, 108, 24, 140, 162, 143, 165, 163, 95, 129, 137, 84, 93, 115, 96, 145, 173, 102, 116, 100, 120, 119, 88, 108, 136, 144, 111, 212, 87, 120, 91, 126, 55, 134, 181, 159, 138, 119, 138, 93, 155, 119, 88, 108, 136, 144, 111, 212, 87, 120, 91, 126, 55, 134, 181, 159, 138, 119, 138, 93, 155, 89, 140, 139, 75, 230, 179, 126, 178, 102, 91, 150, 96, 118, 100, 125, 130, 144, 140, 124, 157, 162, 121, 170, 111, 124, 99, 102, 75, 120, 139, 110, 138, 40, 70, 138, 137, 123, 133, 161, 83, 89, 140, 139, 75, 230, 179, 126, 178, 102, 91, 150, 96, 118, 100, 125, 130, 144, 140, 124, 157, 162, 121, 170, 111, 124, 99, 102, 75, 120, 139, 110, 138, 40, 70, 138, 137, 123, 133, 161, 83, 93, 121, 105, 106, 140, 101, 124, 148, 131, 101, 90, 90, 100, 129, 100, 94, 96, 89, 144, 100, 107, 90, 137, 133, 97, 84, 99, 142, 126, 132, 144, 124, 112, 111, 169, 151, 132, 169, 127, 120, 162, 121, 170, 111, 124, 99, 102, 75, 120, 139, 110, 138, 40, 70, 138, 137, 123, 133, 161, 83, 93, 121, 105, 106, 140, 101, 124, 148, 131, 101, 90, 90, 100, 129, 100, 94, 96, 89, 144, 100, 107, 90, 137, 133, 97, 84, 99, 142, 126, 132, 144, 124, 112, 111, 169, 151, 132, 169, 127, 120, 101, 141, 99, 139, 132, 93, 136, 127, 87, 96, 108, 120, 111, 130, 91, 237, 151, 76, 102, 64, 118, 84, 84, 105, 140, 144, 133, 93, 123, 147, 130, 149, 147, 121, 114, 105, 104, 98, 115, 93, 121, 105, 106, 140, 101, 124, 148, 131, 101, 90, 90, 100, 129, 100, 94, 96, 89, 144, 100, 107, 90, 137, 133, 97, 84, 99, 142, 126, 132, 144, 124, 112, 111, 169, 151, 132, 169, 127, 120, 101, 141, 99, 139, 132, 93, 136, 127]
# 代碼 import matplotlib as mpl import matplotlib.pyplot as plt # 設置中文 mpl.rcParams['font.sans-serif'] = ['Fangsong'] mpl.rcParams['font.size'] = 16 # 準備數據 data = [110, 201, 160, 152, 139, 178, 179, 83, 67, 132, 136, 177, 162, 110, 132, 115, 108, 102, 76, 105, 108, 24, 140, 162, 143, 165, 163, 95, 129, 137, 84, 93, 115, 96, 145, 173, 102, 116, 100, 120, 119, 88, 108, 136, 144, 111, 212, 87, 120, 91, 126, 55, 134, 181, 159, 138, 119, 138, 93, 155, 119, 88, 108, 136, 144, 111, 212, 87, 120, 91, 126, 55, 134, 181, 159, 138, 119, 138, 93, 155, 89, 140, 139, 75, 230, 179, 126, 178, 102, 91, 150, 96, 118, 100, 125, 130, 144, 140, 124, 157, 162, 121, 170, 111, 124, 99, 102, 75, 120, 139, 110, 138, 40, 70, 138, 137, 123, 133, 161, 83, 89, 140, 139, 75, 230, 179, 126, 178, 102, 91, 150, 96, 118, 100, 125, 130, 144, 140, 124, 157, 162, 121, 170, 111, 124, 99, 102, 75, 120, 139, 110, 138, 40, 70, 138, 137, 123, 133, 161, 83, 93, 121, 105, 106, 140, 101, 124, 148, 131, 101, 90, 90, 100, 129, 100, 94, 96, 89, 144, 100, 107, 90, 137, 133, 97, 84, 99, 142, 126, 132, 144, 124, 112, 111, 169, 151, 132, 169, 127, 120, 162, 121, 170, 111, 124, 99, 102, 75, 120, 139, 110, 138, 40, 70, 138, 137, 123, 133, 161, 83, 93, 121, 105, 106, 140, 101, 124, 148, 131, 101, 90, 90, 100, 129, 100, 94, 96, 89, 144, 100, 107, 90, 137, 133, 97, 84, 99, 142, 126, 132, 144, 124, 112, 111, 169, 151, 132, 169, 127, 120, 101, 141, 99, 139, 132, 93, 136, 127, 87, 96, 108, 120, 111, 130, 91, 237, 151, 76, 102, 64, 118, 84, 84, 105, 140, 144, 133, 93, 123, 147, 130, 149, 147, 121, 114, 105, 104, 98, 115, 93, 121, 105, 106, 140, 101, 124, 148, 131, 101, 90, 90, 100, 129, 100, 94, 96, 89, 144, 100, 107, 90, 137, 133, 97, 84, 99, 142, 126, 132, 144, 124, 112, 111, 169, 151, 132, 169, 127, 120, 101, 141, 99, 139, 132, 93, 136, 127] # 組距 bin_width = 8 max_value = max(data) min_value = min(data) bins = (max_value - min_value)//bin_width # 實際組距 real_width = (max_value - min_value)/bins # 設置大小 fig = plt.figure(figsize=(20,8)) plt.hist(data, bins) print([min_value + i*bin_width for i in range(bins)]) # x軸刻度 plt.xticks([min_value + i*real_width for i in range(bins)], rotation=45) plt.grid() plt.show()
須要注意的點:
1,組數的選擇
組數要適當,較少會有太大的統計偏差,太多規律不明顯
當數據在100之內時,按數據多少通常分5-12組
當數據較多時能夠按照組距進行分組
組距:是指每組兩個端點的距離
組數:=極差/組距=(最大數據-最小數據)/組距
2,X軸的刻度
正常狀況下實際組距會是小數,因此刻度須要按照實際組距來,不然或出現圖形偏移的狀況
實際組距=極差/組數
刻度列表=[最小數據+實際組距 * i for in range(組數 +1)]
三、頻率直方圖與頻數直方圖
頻率分佈直方圖縱軸表示頻率/組距,橫軸表示各組組距,若求某一組的頻率,就用縱軸的頻率/組距*橫軸的組距,即獲得該組頻數
頻率=頻數/數據總數
美國人口普查發現有1.24億人在外工做。根據他們從家到上班地點所須要的時間,經過抽樣統計出了下表的數據,這些數據能繪製成直方圖嗎
思考這個數據能繪製直方圖嗎?
給出的數據是統計以後的數據,因此爲了達到直方圖的效果,須要繪製條形圖。
結論:通常來講可以使用plt.hist方法繪製直方圖的是那些沒有統計過的原始數據。
# 代碼 import matplotlib as mpl import matplotlib.pyplot as plt # 設置中文 mpl.rcParams['font.sans-serif'] = ['Fangsong'] mpl.rcParams['font.size'] = 16 # 用條形圖模擬直方圖 # 數據 interval = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 60, 90, 150] width = [5, 5, 5, 5, 5, 5, 5, 5, 5, 15, 30, 60] quantity = [4180, 13687, 18618, 19634, 17981, 7190, 16369, 3212, 4122, 9200, 6461, 3435] # 畫圖 plt.figure(figsize=(20,8)) for i in range(len(width)): plt.bar([interval[i]+width[i]/2], [quantity[i]], width=width[i], color='orange') # plt.bar(interval[1:], quantity, width=5) # 刻度 plt.xticks(interval) # x軸 ,y周的信息 plt.show()