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