可視化是在整個數據挖掘的關鍵輔助工具,能夠清晰的理解數據,從而調整咱們的分析方法。html
例以下面兩個圖爲數字展現和圖形展現:python
plt.figure(figsize=(20, 8), dpi = 100) plt.plot([1,2,3], [4,5,6]) plt.show()
matplotlib框架分爲三層,這三層構成了一個棧,上層能夠調用下層。編程
matplotlib的底層,實現了大量的抽象接口類,這些API用來在底層實現圖形元素的一個個類json
圖形中全部能看到的元素都屬於Artist對象,即標題、軸標籤、刻度等組成圖形的全部元素都是Artist對象的實例後端
特色爲:api
主要用於可視化編程,pytplot模塊能夠提供給咱們一個與matplotlib打交道的接口。能夠只經過調用pyplot模塊的函數從而操做整個程序包,來繪製圖形。緩存
爲了更好的去理解全部基礎繪圖功能,咱們經過天氣溫度變化的繪圖來融合全部的基礎API使用架構
matplotlib.pytplot包含了一系列相似於matlab的畫圖函數。 它的函數做用於當前圖形(figure)的當前座標系(axes)。app
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10)) plt.plot([1, 2, 3, 4, 5, 6 ,7], [17,17,18,15,11,11,13]) plt.show()
能夠看到這樣去顯示效果並很差,圖形的大小等等,因此咱們能夠經過加入更多的功能。框架
plt.figure(figsize=(), dpi=) figsize:指定圖的長寬 dpi:圖像的清晰度 返回fig對象 plt.savefig(path)
plt.figure(figsize=(20, 8), dpi=80) plt.savefig("test.png")
會將圖片保存到當前路徑下
需求:畫出某城市11點到12點1小時內每分鐘的溫度變化折線圖,溫度範圍在15度~18度
效果:
# 畫出溫度變化圖 # 建立一個figure plt.figure(figsize=(20, 8), dpi=80) # 準備x, y座標的數據 x = range(60) y_shanghai = [random.uniform(15, 18) for i in x] # 畫折線圖 plt.plot(x, y_shanghai, label="上海") plt.show()
plt.xticks(x, **kwargs)
x:要顯示的刻度值
plt.yticks(y, **kwargs)
y:要顯示的刻度值
# 增長如下兩行代碼 # 構造中文列表的字符串 x_ch = ["11點{}分".format(i) for i in x] y_ticks = range(40) # 修改x,y座標的刻度 plt.xticks(x[::5], x_ch[::5]) plt.yticks(y_ticks[::5])
若是沒有解決過中文問題的話,會顯示這個樣子:
下載中文字體(黑體,看準系統版本)
下載 arial unicode ms 字體到 /home 目錄
拷貝字體到 usr/share/fonts 下:
sudo cp ~/arial\ unicode\ ms.ttf /usr/share/fonts/arial\ unicode\ ms.ttf
修改配置文件matplotlibrc 而且在~/.matplotlib/matplotlibrc也進行修改
在安裝的地方找到虛擬環境ai/lib/python3.6/site-packages/matplotlib/mpl-data目錄下面,修改下面三項配置
font.family : sans-serif font.sans-serif : arial unicode ms, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
刪除matplotlib字體緩存:
rm -rf ~/matplotlib/fontList.json
plt.xlabel("時間") plt.ylabel("溫度") plt.title("中午11點0分到12點之間的溫度變化圖示")
收集到北京當天溫度變化狀況,溫度在1度到3度。怎麼去添加另外一個在同一座標系當中的不一樣圖形,其實很簡單隻須要再次plot便可,可是須要區分線條,以下顯示
# 生成北京的溫度 y_beijing = [random.uniform(1, 3) for i in x] # 畫折線圖 plt.plot(x, y_shanghai, label="上海") # 使用plot能夠屢次畫多個折線 plt.plot(x, y_beijing, color='r', linestyle='--', label="北京") # 添加圖形註釋 plt.legend(loc="best")
咱們仔細觀察,用到了兩個新的地方,一個是對於不一樣的折線展現效果,一個是添加註釋
顏色字符 | 風格字符 |
---|---|
r 紅色 | - 實線 |
g 綠色 | - - 虛線 |
b 藍色 | -. 點劃線 |
w 白色 | : 點虛線 |
c 青色 | ' ' 留空、空格 |
m 洋紅 | |
y 黃色 | |
k 黑色 |
plt.legend(loc="best")
若是咱們想要將上海和北京的天氣圖顯示在同一個圖的不一樣座標系當中,效果以下:
能夠經過subplots函數實現(舊的版本中有subplot,使用起來不方便),推薦subplots函數
matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 建立一個帶有多個座標系的圖
Parameters: nrows, ncols : int, optional, default: 1, Number of rows/columns of the subplot grid. **fig_kw : All additional keyword arguments are passed to the figure() call. Returns: fig : 圖對象 ax : 設置標題等方法不一樣: set_xticks set_yticks set_xlabel set_ylabel
關於axes子座標系的更多方法:參考https://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes
# 畫出溫度變化圖,展示在不一樣axes裏面 # 建立一個figure fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 8), dpi=80) # 準備x, y座標的數據 x = range(60) # y的刻度範圍 y_ticks = range(40) y_shanghai = [random.uniform(15, 18) for i in x] # 生成北京的溫度 y_beijing = [random.uniform(1, 3) for i in x] # 構造中文列表的字符串 x_ch = ["11點{}分".format(i) for i in x] # 畫折線圖 axes[0].plot(x, y_shanghai, label="上海") # 使用plot能夠屢次畫多個折線 axes[1].plot(x, y_beijing, color='r', linestyle='--', label="北京") # 美化x,y的刻度值 # 第一個參數必須是刻度數字類型,第二個是對應着第一個數字的中文描述 axes[0].set_xticks(x[::5], x_ch[::5]) axes[0].set_yticks(y_ticks[::5]) axes[1].set_xticks(x[::5], x_ch[::5]) axes[1].set_yticks(y_ticks[::5]) # 增長x,y描述信息和標題信息 axes[0].set_xlabel("時間") axes[0].set_ylabel("溫度") axes[1].set_xlabel("時間") axes[1].set_ylabel("溫度") axes[0].set_title("中午11點0分到12點之間的溫度變化圖示") axes[1].set_title("中午11點0分到12點之間的溫度變化圖示") axes[0].legend(loc="best") axes[1].legend(loc="best") plt.show()
開頭的這幾個目標應用全都很重要
matplotlib可以繪製折線圖、柱狀圖、餅圖、直方圖、散點圖、熱力圖、K線圖等,可是,咱們須要知道不一樣的統計圖到底可以表示出什麼,以此來決定選擇哪一種統計圖來更直觀的呈現咱們的數據
折線圖:以折線的上升或降低來表示統計數量的增減變化的統計圖
特色:可以顯示數據的變化趨勢,反映事物的變化狀況。(變化)
直方圖:由一系列高度不等的縱向條紋或線段表示數據分佈的狀況。 通常用橫軸表示數據範圍,縱軸表示分佈狀況。
特色:繪製,連續性的數據展現一組或者多組數據的分佈情況(統計)
柱狀圖:排列在工做表的列或行中的數據能夠繪製到柱狀圖中。
特色:繪製連離散的數據,可以一眼看出各個數據的大小,比較數據之間的差異。(統計)
散點圖:用兩組數據構成多個座標點,考察座標點的分佈,判斷兩變量之間是否存在某種關聯或總結座標點的分佈模式。
特色:判斷變量之間是否存在數量關聯趨勢,展現離羣點(分佈規律)
電影數據以下圖所示:
['雷神3:諸神黃昏','正義聯盟','東方快車謀殺案','尋夢環遊記','全球風暴', '降魔傳','追捕','七十七天','密戰','狂獸','其它'] [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
繪製柱狀圖
Parameters: x : sequence of scalars. width : scalar or array-like, optional 柱狀圖的寬度 align : {‘center’, ‘edge’}, optional, default: ‘center’ Alignment of the bars to the x coordinates: ‘center’: Center the base on the x positions. ‘edge’: Align the left edges of the bars with the x positions. 每一個柱狀圖的位置對齊方式 **kwargs : color:選擇柱狀圖的顏色 Returns: `.BarContainer` Container with all the bars and optionally errorbars.
代碼:
# 完成簡單的條形圖展示不一樣的電影票房之間的對比 plt.figure(figsize=(20, 8), dpi=80) # 準備電影的名字以及電影的票房數據 movie_name = ['雷神3:諸神黃昏','正義聯盟','東方快車謀殺案','尋夢環遊記','全球風暴','降魔傳','追捕','七十七天','密戰','狂獸','其它'] y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222] # 放進橫座標的數字列表 x = range(len(movie_name)) # 畫出條形圖 plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g','g']) # 修改刻度名稱 plt.xticks(x, movie_name) plt.show()
有時候爲了公平起見,咱們須要對比不一樣電影首日和首周的票房
movie_name = ['雷神3:諸神黃昏','正義聯盟','尋夢環遊記'] first_day = [10587.6,10062.5,1275.7] first_weekend=[36224.9,34479.6,11830] 數據來源: https://piaofang.maoyan.com/?ver=normal
效果以下:
代碼:
# 三部電影的首日和首周票房對比 plt.figure(figsize=(20, 8), dpi=80) movie_name = ['雷神3:諸神黃昏','正義聯盟','尋夢環遊記'] first_day = [10587.6,10062.5,1275.7] first_weekend=[36224.9,34479.6,11830] x = range(len(movie_name)) # 畫出柱狀圖 plt.bar(x, first_day, width=0.2, label="首日票房") # 首周柱狀圖顯示的位置在首日的位置右邊 plt.bar([i+0.2 for i in x], first_weekend, width=0.2, label="首周票房") # 顯示X軸中文,固定在首日和首周的中間位置 plt.xticks([i+0.1 for i in x], movie_name) plt.legend(loc='best') plt.show()
適合用在分類數據對比場景上
應用
電影時長分佈
直方圖,形狀相似柱狀圖卻有着與柱狀圖徹底不一樣的含義。直方圖牽涉統計學的概念,首先要對數據進行分組,而後統計每一個分組內數據元的數量。 在座標系中,橫軸標出每一個組的端點,縱軸表示頻數,每一個矩形的高表明對應的頻數,稱這樣的統計圖爲頻數分佈直方圖。
現有250部電影的時長,但願統計出這些電影時長的分佈狀態(好比時長爲100分鐘到120分鐘電影的數量,出現的頻率)等信息,你應該如何呈現這些數據?
數據:
time =[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]
效果:
直方圖繪製
Parameters: x : (n,) array or sequence of (n,) arrays bins : integer or sequence or ‘auto’, optional 組距 normed : bool, optional 以頻率顯示或者以頻數顯示,默認頻數,值1爲頻率
代碼:
# 展示不一樣電影的時長分佈狀態 plt.figure(figsize=(20, 8), dpi=100) # 準備時長數據 time =[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,