一: 什麼是matplotlib?app
matplotlib:最流行的Python底層繪圖庫,主要作數據可視化圖標,名字取材於MATLAB,模仿MATLAB構建。dom
二:繪製折線圖:spa
每一個紅色的點是座標,把5個點的座標鏈接成一條線,就組成了折線圖3d
經過下面的小例子來看一下matplotlib該如何簡單使用code
假設一天中每隔兩個小時(range(2,26,2))的氣溫(℃)分別是[15,13,14.5,17,20,25,26,26,27,22,18,15]
from matplotlib import pyplot as plt # 數據在x軸的位置,是一個可迭代對象 x = range(2, 26, 2) # 數據在y軸的位置,是一個可迭代對象 y = [15, 13, 14, 5, 17, 20, 25, 26, 24, 22, 18, 12] #x軸和y軸的數據一塊兒組成了全部藥繪製出的座標¶ #傳入x和y,經過plot繪製出折線圖 plt.plot(x,y) plt.show() # 在pycharm中展現圖形,Juptyer notebook不用
目前就簡單的繪製出一個折線圖,可是目前存在如下幾個問題:orm
1.設置圖片的大小(想要一個高清無碼大圖) 對象
plt.figure(figsize=(20,8),dpi=80)
——→ figure圖形圖標的意思,這裏指明咱們要畫的圖blog
——→經過實例化一個figure而且傳遞參數,可以在後臺自動使用該figure實例圖片
——→在圖像模糊的時候,能夠傳入dpi參數,讓圖片更加清晰pycharm
2.保存到本地
plt.savefig("./sig_size.png")
3.描述信息,好比x軸和y軸表示什麼,這個圖表示什麼?
plt.xlabel("時間") # 這樣添加中文會顯示亂碼,須要設置fontproperties plt.ylabel("溫度 單位(℃)") plt.title("10點到12點每分鐘氣溫變化")
4.調整x或y的刻度間距
plt.xticks(x) # 設置x刻度 # plt.xticks(x[::2]) # 當刻度太密集的時候,使用列表的步長(間隔取值)來解決,
那麼問題來了:
若是列表a表示10點到12點的每一分鐘的氣溫,如何繪製折線圖觀察每分鐘氣溫變化狀況?
a = [random.randint(20,35) for i in range(120)]
xtick_labels = ["10點{}分".format(i) for i in range(60)] # 設置x軸上的刻度
xtick_labels += ["11點{}分".format(i) for i in range(60)]
plt.xticks(_x, xtick_labels[::3], rotation=90) # 中文顯示不出來,須要設置fontproperties,rotation=90表示旋轉90°
matplotlib默認不支持中文字符,經過font_manager解決
from matplotlib import font_manager my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf")
plt.xlabel("時間", fontproperties=my_font)
plt.ylabel("溫度 單位(℃)", fontproperties=my_font)
plt.title("10點到12點每分鐘氣溫變化", fontproperties=my_font)
5.線條的樣式(好比顏色,透明度等)
完整代碼:
import random from matplotlib import font_manager from matplotlib import pyplot as plt my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf") x = range(0, 120) y = [random.randint(20, 35) for i in range(120)] plt.figure(figsize=(20, 8), dpi=80) plt.plot(x, y) # 調整x的刻度 _x = list(x)[::3] print(_x) xtick_labels = ["10點{}分".format(i) for i in range(60)] xtick_labels += ["11點{}分".format(i) for i in range(60)] print(xtick_labels) plt.xticks(_x, xtick_labels[::3], rotation=45, fontproperties=my_font) # 添加描述信息 plt.xlabel("時間", fontproperties=my_font) plt.ylabel("溫度 單位(℃)", fontproperties=my_font) plt.title("10點到12點每分鐘氣溫變化", fontproperties=my_font) plt.show()
動手1:
假設你們在30歲的時候,根據本身的實際狀況,統計出來了從11歲到30歲每一年交的女(男)朋友數量如列表啊,請繪製出該數據的折線圖,以便分析本身每一年交女(男)朋友的數量走勢
a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
要求:y軸表示個數
x軸表示歲數,如11歲,12歲
from matplotlib import pyplot as plt, font_manager a = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1] x = range(11, 31) my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf") plt.figure(figsize=(20, 8), dpi=80) plt.plot(x, a) plt.xticks(x, ["{}歲".format(i) for i in x], rotation=45, fontproperties=my_font) plt.yticks(a) plt.ylabel("數量:個", fontproperties=my_font) plt.xlabel('年齡', fontproperties=my_font) plt.title("11歲到30歲每一年交的男女友數量統計", fontproperties=my_font) # 繪製網格 plt.grid(alpha=0.3) plt.show()
動手2:假設你們在30歲時候,根據本身的實際狀況,統計出你和你同坐各自從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]
要求:y軸表示個數
x軸表示歲數,好比11歲,12歲
from matplotlib import pyplot as plt, font_manager 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] x = range(11, 31) my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf") plt.figure(figsize=(20, 8), dpi=80) plt.plot(x, a, label="本身", color="r", linestyle="--") plt.plot(x, b, label="同桌", color="y") plt.xticks(x, ["{}歲".format(i) for i in x], rotation=45, fontproperties=my_font) plt.yticks(a) plt.ylabel("數量:個", fontproperties=my_font) plt.xlabel('年齡', fontproperties=my_font) plt.title("11歲到30歲每一年交的男女友數量統計", fontproperties=my_font) # 繪製網格 plt.grid(alpha=0.3) # 添加圖例 plt.legend(prop=my_font) # 只有在legend中用prop添加顯示中文 plt.show()
折線圖更多應用場景:
呈現公司產品(不一樣區域)天天活躍用戶數
呈現app天天下載數量
呈現產品新功能上線後,用戶點擊次數隨時間的變化
呈現員工天天上下班時間
三:繪製散點圖
1.技術要點: plt.scatter(x,y)
2.假設經過爬蟲獲取到了北京2016年3,10月份天天白天的最高氣溫(分別位於列表a,b),那麼此時如何找出氣溫和隨時間變化的某種規律?
a = [11,17,16,11,12,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]
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]
from matplotlib import pyplot as plt from matplotlib import font_manager a = [11,17,16,11,12,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] 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] x_3 = range(0,31) x_10 = range(51,82) # 設置圖形大小 plt.figure(figsize=(20,8), dpi=80) my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf") plt.scatter(x_3, a, label="三月份") plt.scatter(x_10,b, label="十月份") # 調整x軸的刻度 _x = list(x_3) + list(x_10) _xtick_labels = ["3月{}日".format(i) for i in x_3] _xtick_labels += ["10月{}日".format(i-50) for i in x_10] plt.xticks(_x, _xtick_labels, rotation=45, fontproperties=my_font) plt.yticks(a) plt.yticks(b) plt.ylabel("溫度",fontproperties=my_font) plt.xlabel("月份",fontproperties=my_font) plt.title("溫度散點圖",fontproperties=my_font) plt.legend(prop=my_font) plt.show()
散點圖的更多應用場景:
不一樣條件(維度)之間的內在關聯關係
觀察數據的離散聚合程度
四: 繪製條形圖
1.技術要點: plt.bar(x,y,width) bar繪製條形圖,只能接受含數字的可迭代對象,width表示長條間距,默認爲0.8
2.假設你獲取到了2017年內地電影票房前20的電影(列表a)和電影票房數據(列表b),那麼如何更加直觀的展現該數據呢?
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]
from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf") 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.figure(figsize=(20, 8), dpi=80) plt.bar(range(len(a)), b, width=0.3) # width表示長條的寬度,默認爲0.8 plt.xticks(range(len(a)), a, fontproperties=my_font, rotation=45) plt.xlabel("電影名",fontproperties=my_font) plt.ylabel("票房(單位:億元)", fontproperties=my_font) plt.show()
3.繪製橫着的條形圖,plt.barh(x,y,hight)
# 繪製橫着的條形圖 from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf") 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.figure(figsize=(20, 8), dpi=80) plt.barh(range(len(a)), b, height=0.3) plt.yticks(range(len(a)), a, fontproperties=my_font) plt.ylabel("電影名",fontproperties=my_font) plt.xlabel("票房(單位:億元)", fontproperties=my_font) plt.grid(alpha=0.3) plt.show()
4.繪製多個條形圖
假設你知道了列表a中電影分別在2017-09-14(b_14),2017-09-15(b_15),2017-09-16(b_16)三天的票房,爲了展現列表中電影自己的 票房以及同其餘電影的數據對比狀況,應該如何更加直觀的呈現該數據?
a = ["猩球崛起3:終極之戰","敦刻爾克","蜘蛛俠:英雄歸來","戰狼2"]
b_16 = [15746,312,4497,319]
b_15 = [12357,156,2045,168]
b_14 = [2358,399,2358,362]
# 多個 條形圖 from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname=r"C:\Windows\Fonts\simfang.ttf") 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 for i in x_15] plt.figure(figsize=(20, 8),dpi=80) plt.bar(x_14, b_14, width=bar_width, label="9月14日") plt.bar(x_15, b_15, width=bar_width, label="9月15日") plt.bar(x_16, b_16, width=bar_width, label="9月16日") plt.xticks(x_15, a, fontproperties=my_font) plt.legend(prop=my_font) plt.show()
5.條形圖更多的應用場景
數量統計
頻率統計(市場飽和度)
五:繪製直方圖
1.假設你獲取到了250部電影的時長(列表a),但願統計出這些電影時長的分佈狀態(好比時長爲100分鐘到120分鐘電影的數量,出現的頻率)等信息,你應該如何呈現這些數據?
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]
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 原始數據
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,8), dpi=80)
# 繪製直方圖 用於原始數據
plt.hist(a, num_bins, density=True) # density 分佈頻率
# 設置x軸的刻度
plt.xticks(range(min(a), max(a)+d, d))
plt.grid(alpha=0.3)
plt.show()
2.在美國2004年人口普查發現有124million的人在離家相對較遠的地方工做,更具他們從家到上班地點所須要的時間,經過抽樣統計(最後一列)出下標的數據,這些數據能繪製成直方圖嗎?
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]
from matplotlib import pyplot as plt from matplotlib import font_manager plt.figure(figsize=(20, 8), dpi=80) 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.bar(range(len(quantity)), quantity, width=1) # 設置x軸的刻度 _x = [i-0.5 for i in range(len(width)+1)] _xtick_label = interval + [150] plt.xticks(_x,_xtick_label) plt.show()
直方圖更多應用場景:
用戶年齡的分佈狀態
一段時間內用戶點擊次數的分佈狀態
用戶活躍時間的分佈狀態