學(xué)會(huì)這7個(gè)繪圖工具包,Matplotlib可視化也沒(méi)那么難
本文轉(zhuǎn)載自微信公眾號(hào)「數(shù)倉(cāng)寶貝庫(kù)」,作者楊游云、周健。轉(zhuǎn)載本文請(qǐng)聯(lián)系數(shù)倉(cāng)寶貝庫(kù)公眾號(hào)。
繪圖是數(shù)據(jù)分析工作中的重要一環(huán),是探索過(guò)程的一部分。Matplotlib是當(dāng)前用于數(shù)據(jù)可視化的最流行的Python包之一,本文主要介紹數(shù)據(jù)可視化分析工具:Matplotlib。
Matplotlib是一個(gè)跨平臺(tái)庫(kù),是根據(jù)數(shù)組中的數(shù)據(jù)制作2D圖的可視化分析工具。Matplotlib提供了一個(gè)面向?qū)ο蟮腁PI,有助于使用Python GUI工具包(如PyQt、WxPythonotTkinter)在應(yīng)用程序中嵌入繪圖。它也可以用于Python、IPython shell、Jupyter筆記本和Web應(yīng)用程序服務(wù)器中。
Matplotlib提供了豐富的數(shù)據(jù)繪圖工具,主要用于繪制一些統(tǒng)計(jì)圖形,例如散點(diǎn)圖、條形圖、折線圖、餅圖、直方圖、箱形圖等。首先我們簡(jiǎn)單介紹一下Matplotlib.pyplot模塊的繪圖基礎(chǔ)語(yǔ)法與常用參數(shù),因?yàn)楹竺嫖覀円榻B的各種圖形基本都是基于這個(gè)模塊來(lái)實(shí)現(xiàn)的。pyplot的基礎(chǔ)語(yǔ)法及常用參數(shù)詳見表1。
表1 pyplot的基礎(chǔ)語(yǔ)法及常用參數(shù)
散點(diǎn)圖
散點(diǎn)圖通常用在回歸分析中,描述數(shù)據(jù)點(diǎn)在直角坐標(biāo)系平面上的分布。散點(diǎn)圖表示因變量隨自變量而變化的大致趨勢(shì),據(jù)此可以選擇合適的函數(shù)對(duì)數(shù)據(jù)點(diǎn)進(jìn)行擬合。在廣告數(shù)據(jù)分析中,我們通常會(huì)根據(jù)散點(diǎn)圖來(lái)分析兩個(gè)變量之間的數(shù)據(jù)分布關(guān)系。散點(diǎn)圖的主要參數(shù)及其說(shuō)明如表2所示。
表2 散點(diǎn)圖的主要參數(shù)及其說(shuō)明
我們通過(guò)matplotlib.pyplot模塊畫一個(gè)散點(diǎn)圖,如代碼清單1所示。
- 代碼清單1 繪制散點(diǎn)圖
- import numpy as np
- import matplotlib.pyplot as plt
- x = np.arange(30)
- y = np.arange(30)+3*np.random.randn(30)
- plt.scatter(x, y, s=50)
- plt.show()
其可視化結(jié)果如下圖所示。
圖1 散點(diǎn)圖
條形圖
條形圖是用寬度相同的條形的高度或長(zhǎng)度來(lái)表示數(shù)據(jù)多少的圖形。條形圖可以橫置或縱置,縱置時(shí)也稱為柱狀圖。此外,條形圖有簡(jiǎn)單條形圖、復(fù)式條形圖等形式。條形圖的主要參數(shù)及各參數(shù)說(shuō)明如表3所示。
表3 條形圖的主要參數(shù)及各參數(shù)說(shuō)明
假設(shè)我們拿到了2017年內(nèi)地電影票房前10的電影的片名和票房數(shù)據(jù),如果想直觀比較各電影票房數(shù)據(jù)大小,那么條形圖顯然是最合適的呈現(xiàn)方式,如代碼清單2所示,其可視化結(jié)果如圖2所示。
- 代碼清單2 繪制條形圖
- a = ['戰(zhàn)狼2', '速度與激情8', '功夫瑜伽', '西游伏妖篇', '變形金剛5:最后的騎士', '摔跤吧!爸爸', '加勒比海盜5:死無(wú)對(duì)證','金剛:骷髏島', '極限特工:終極回歸', '生化危機(jī)6:終章']
- # 單位:億
- b=[56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12]
- # 用來(lái)正常顯示中文標(biāo)簽
- plt.rcParams['font.sans-serif']=['SimHei','Times New Roman']
- plt.rcParams['axes.unicode_minus']=False
- # bar要求傳遞兩個(gè)數(shù)字,可以單獨(dú)設(shè)置x軸的顯示
- plt.bar(range(len(a)), b, width=0.3)
- plt.xticks(range(len(a)), a, rotation=90) #字體傾斜角度
- plt.grid(False)
- plt.show()
圖2 條形圖
折線圖
折線圖是用直線連接排列在工作表的列或行中的數(shù)據(jù)點(diǎn)而繪制成的圖形。折線圖可以顯示隨時(shí)間(根據(jù)常用比例設(shè)置)而變化的連續(xù)數(shù)據(jù),因此非常適用于顯示相等時(shí)間間隔下數(shù)據(jù)的趨勢(shì)。折線圖的主要參數(shù)及各參數(shù)說(shuō)明如表4所示。
表4 折線圖的主要參數(shù)及各參數(shù)說(shuō)明
以某廣告平臺(tái)隨日期變化的用戶請(qǐng)求數(shù)為例,我們用折線圖來(lái)表現(xiàn)其變化趨勢(shì),如代碼清單3所示,其可視化結(jié)果如圖3所示。
- 代碼清單3 繪制折線圖
- import matplotlib.dates as mdate
- dateparse = lambda dates:pd.datetime.strptime(dates,'%Y%m%d')
- data = pd.read_csv('req_user.csv',encoding='utf-8',parse_dates=['date'],date_parser=dateparse)
- plt.figure(figsize=(10,7))
- plt.plot(data["date"],data['req_user'])
- plt.xlabel('date',fontsize=15)
- plt.ylabel('req_user',fontsize=15) #圖例字體大小
- plt.tick_params(labelsize=10) #刻度字體大小
- plt.show()
圖3 折線圖
餅圖
餅圖常用于統(tǒng)計(jì)學(xué)模塊中。用于顯示一個(gè)數(shù)據(jù)系列中各項(xiàng)的大小與各項(xiàng)總和的比例。餅圖中的數(shù)據(jù)點(diǎn)顯示為整個(gè)餅圖的百分比,餅圖的主要參數(shù)及其說(shuō)明如表5所示。
表5 餅圖的主要參數(shù)及其說(shuō)明
以某家庭10月份家庭支出情況為例,我們用餅圖來(lái)體現(xiàn)各部分支出占家庭整體支出的情況,如代碼清單4所示,其可視化結(jié)果如圖4所示。
- 代碼清單4 繪制餅圖
- import matplotlib.pyplot as plt
- plt.rcParams['font.sans-serif']=['SimHei'] #用來(lái)正常顯示中文標(biāo)簽
- labels = ['娛樂(lè)','育兒','飲食','房貸','交通','其他']
- sizes = [4,10,18,60,2,6]
- explode = (0,0,0,0.1,0,0)
- plt.figure(figsize=(10,7))
- plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=150)
- plt.title("餅圖示例-10月份家庭支出")
- plt.show()
圖4 餅圖
直方圖
直方圖,又稱質(zhì)量分布圖,是一種統(tǒng)計(jì)報(bào)告圖,由一系列高度不等的縱向條紋或線段表示數(shù)據(jù)分布的情況。一般用橫軸表示數(shù)據(jù)類型,用縱軸表示分布情況。直方圖是數(shù)值數(shù)據(jù)分布的精確圖形表示,是對(duì)連續(xù)變量(定量變量)的概率分布的估計(jì),由卡爾·皮爾遜(Karl Pearson)首先引入,是一種特殊的條形圖。在構(gòu)建直方圖時(shí),第一步是將值的范圍分段,即將整個(gè)值的范圍分成一系列間隔,然后計(jì)算每個(gè)間隔中有多少值。這些值通常被指定為連續(xù)的、不重疊的變量間隔,間隔必須相鄰,并且通常是相等的大小。直方圖的主要參數(shù)及說(shuō)明如表6所示。
表6 直方圖的主要參數(shù)及說(shuō)明
下面我們以Kaggle經(jīng)典比賽案例泰坦尼克號(hào)數(shù)據(jù)集為例,繪制乘客年齡的頻數(shù)直方圖,查看各年齡段乘客的年齡分布情況,如代碼清單5所示,其可視化結(jié)果如圖5所示。
- 代碼清單5 繪制直方圖
- # 導(dǎo)入第三方包
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import matplotlib.mlab as mlab
- # 中文和負(fù)號(hào)的正常顯示
- plt.rcParams['font.sans-serif'] = [u'SimHei']
- plt.rcParams['axes.unicode_minus'] = False
- # 讀取Titanic數(shù)據(jù)集
- titanic = pd.read_csv('train.csv')
- # 檢查年齡是否有缺失
- any(titanic.Age.isnull())
- # 刪除含有缺失年齡的樣本
- titanic.dropna(subset=['Age'], inplace=True)
- # 設(shè)置圖形的顯示風(fēng)格
- plt.style.use('ggplot')
- # 繪圖
- plt.hist(titanic.Age,
- bins = 20,
- color = 'steelblue',
- edgecolor = 'k',
- label = '直方圖' )
- # 去除圖形頂部邊界和右邊界的刻度
- plt.tick_params(top='off', right='off')
- # 顯示圖例
- plt.legend()
- # 去除網(wǎng)格線
- plt.grid(False)
- plt.show()
圖5 直方圖
箱形圖
箱形圖又稱為盒須圖、盒式圖或箱線圖,是一種用于顯示一組數(shù)據(jù)分散情況的統(tǒng)計(jì)圖,因形狀如箱子而得名。它主要用于反映原始數(shù)據(jù)分布的特征,也可以進(jìn)行多組數(shù)據(jù)分布特征的比較。箱形圖的主要參數(shù)及說(shuō)明如表7所示。
表7 箱形圖的主要參數(shù)及說(shuō)明
下面繪制箱形圖,如代碼清單6所示。
- 代碼清單6 繪制箱形圖
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- df = pd.DataFrame(np.random.rand(10,5),columns=['a','b','c','d','e'])
- # 繪圖
- plt.boxplot(df,patch_artist=True) #默認(rèn)垂直擺放箱體
- plt.show()
垂直箱形圖與水平箱形圖分別如圖6、圖7所示。
圖6 垂直箱形圖
圖7 水平箱形圖
組合圖
前面介紹的都是在figure對(duì)象中創(chuàng)建單獨(dú)的圖像,有時(shí)候我們需要在同一個(gè)畫布中創(chuàng)建多個(gè)子圖或者組合圖,此時(shí)可以用add_subplot創(chuàng)建一個(gè)或多個(gè)subplot來(lái)創(chuàng)建組合圖,或者通過(guò)subplot使用循環(huán)語(yǔ)句來(lái)創(chuàng)建多個(gè)子圖。pyplot.subplots的常用參數(shù)及說(shuō)明如表8所示。
表8 pyplot.subplots的常用參數(shù)
使用add_subplot創(chuàng)建組合圖,如代碼清單7所示,其可視化結(jié)果如圖8所示。
- 代碼清單7 繪制組合圖
- from numpy.random import randn
- import matplotlib.pyplot as plt
- #在同一個(gè)figure中創(chuàng)建一組2行2列的subplot
- fig = plt.figure()
- ax1 = fig.add_subplot(2,2,1) #表示4個(gè)subplot中的第一個(gè)
- ax2 = fig.add_subplot(2,2,2) #表示4個(gè)subplot中的第二個(gè)
- ax3 = fig.add_subplot(2,2,3) #表示4個(gè)subplot中的第三個(gè)
- ax4 = fig.add_subplot(2,2,4) #表示4個(gè)subplot中的第四個(gè)
- ax1.scatter(np.arange(30),np.arange(30)+3*randn(30))
- ax2.bar(np.arange(8),[1,2,3,7,8,5,6,4])
- ax3.hist(randn(100),bins=20)
- ax4.plot(randn(60).cumsum())
- plt.show()
圖8 組合圖
通過(guò)subplot使用循環(huán)語(yǔ)句來(lái)創(chuàng)建組合圖,如代碼清單8所示,其可視化結(jié)果如圖9所示。
- 代碼清單8 使用循環(huán)語(yǔ)句繪制組合圖
- fig,axes = plt.subplots(2,2,sharex=True,sharey=True)
- for i in range(2):
- for j in range(2):
- axes[i,j].plot(randn(100).cumsum())
- plt.subplots_adjust(wspace=0,hspace=0) #用于調(diào)整subplot周圍的間距
- plt.show()
圖9 組合圖
利用figure的subplot_adjust方法可以輕易地修改間距,其中wspace和hspace分別用于控制寬度和高度的百分比,可以用作subplot之間的間距。
本文摘編于《Python廣告數(shù)據(jù)挖掘與分析實(shí)戰(zhàn)》,經(jīng)出版方授權(quán)發(fā)布。