Python繪圖與可視化

Python有不少可視化工具,本篇只介紹Matplotlib。css

Matplotlib是一種2D的繪圖庫,它能夠支持硬拷貝和跨系統的交互,它能夠在Python腳本、IPython的交互環境下、Web應用程序中使用。該項目是由John Hunter於2002年啓動的,其目的是爲Python構建一個MATLAB式的繪圖接口。若是結合使用一種GUI工具包(如IPython),Matplotlib還具備諸如縮放和平移等交互功能。它不只支持各類操做系統上許多不一樣的GUI後端,並且還能將圖片導出爲各類常見的食量(vector)和光柵(raster)圖:PDF、SVG、JPG、PNG、BMP、GIF等。python

Matplotlib程序包數據庫


 所謂「一圖勝千言」,咱們不少時候須要經過可視化的方式查看、分析數據,雖然Pandas中也有一些繪圖操做,可是相比較而言,Matplotlib在繪圖顯示效果方面更加出色。Python爲Matplotlib提供了一個方便的接口,咱們能夠經過Pyplot對Matplotlib進行操做,多數狀況下,Pyplot的命令與MATLAB有些類似。後端

導入Matplotlib包進行簡單的操做(此處須要安裝pip install matplotlib):api

import matplotlib.pyplot as plt#約定俗成的寫法plt
#首先定義兩個函數(正弦&餘弦)
import numpy as np

X=np.linspace(-np.pi,np.pi,256,endpoint=True)#-π to+π的256個值
C,S=np.cos(X),np.sin(X)
plt.plot(X,C)
plt.plot(X,S)
#在ipython的交互環境中須要這句話才能顯示出來
plt.show()

輸出結果:架構

 

繪圖命令的基本架構及其屬性設置app


 上面的例子咱們能夠看出,幾乎全部的屬性和繪圖的框架咱們都選用默認設置。如今咱們來看Pyplot繪圖的基本框架是什麼,用過Photoshop的人都知道,做圖時先要定義一個畫布,此處的畫布就是Figure,而後再把其餘素材「畫」到該Figure上。框架

1)在Figure上建立子plot,並設置屬性dom

x=np.linspace(0,10,1000)#X軸數據
y1=np.sin(x)#Y軸數據
y2=np.cos(x**2)#Y軸數據  x**2即x的平方

plt.figure(figsize=(8,4))

plt.plot(x,y1,label="$sin(x)$",color="red",linewidth=2)#將$包圍的內容渲染爲數學公式
plt.plot(x,y2,"b--",label="$cos(x^2)$")
#指定曲線的顏色和線性,如‘b--’表示藍色虛線(b:藍色,-:虛線)

plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")

'''
使用關鍵字參數能夠指定所繪製的曲線的各類屬性:
label:給曲線指定一個標籤名稱,此標籤將在圖標中顯示。若是標籤字符串的先後都有字符'$',則Matplotlib會使用其內嵌的LaTex引擎將其顯示爲數學公式
color:指定曲線的顏色。顏色能夠用以下方法表示
       英文單詞
       以‘#’字符開頭的3個16進制數,如‘#ff0000’表示紅色。
       以0~1的RGB表示,如(1.0,0.0,0.0)也表示紅色。
linewidth:指定權限的寬度,能夠不是整數,也可使用縮寫形式的參數名lw。
'''

plt.ylim(-1.5,1.5)
plt.legend()#顯示左下角的圖例

plt.show()

2)在Figure上建立多個子plot編輯器

若是須要繪製多幅圖表的話,能夠給Figure傳遞一個整數參數指定圖表的序號,若是所指定序號的繪圖對象已經存在的話,將不建立新的對象,而只是讓它成爲當前繪圖對象。

fig1=plt.figure(2)
plt.subplot(211)
#subplot(211)把繪圖區域等分爲2行*1列共兩個區域,而後在區域1(上區域)中建立一個軸對象
plt.subplot(212)#在區域2(下區域)建立一個軸對象
plt.show()

輸出結果:

咱們還能夠經過命令再次拆分這些塊(至關於Word中拆分單元格操做)

f1=plt.figure(5)#彈出對話框時的標題,若是顯示的形式爲彈出對話框的話
plt.subplot(221)
plt.subplot(222)
plt.subplot(212)
plt.subplots_adjust(left=0.08,right=0.95,wspace=0.25,hspace=0.45)
# subplots_adjust的操做時相似於網頁css格式化中的邊距處理,左邊距離多少?
# 右邊距離多少?這取決於你須要繪製的大小和各個模塊之間的間距
plt.show()

輸出結果:

3)經過Axes設置當前對象plot的屬性

 以上咱們操做的是在Figure上繪製圖案,可是當咱們繪製圖案過多,又須要選取不一樣的小模塊進行格式化設置時,Axes對象就能很好地解決這個問題。

fig,axes=plt.subplots(nrows=2,ncols=2)#定一個2*2的plot
plt.show()

輸出結果:

如今咱們須要經過命令來操做每一個plot(subplot),設置它們的title並刪除橫縱座標值。

fig,axes=plt.subplots(nrows=2,ncols=2)#定一個2*2的plot
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')

# 經過Axes的flat屬性進行遍歷
for ax in axes.flat:
#     xticks和yticks設置爲空置
    ax.set(xticks=[],yticks=[])
plt.show()

輸出結果:

另外,實際來講,plot操做的底層操做就是Axes對象的操做,只不過若是咱們不使用Axes而用plot操做時,它默認的是plot.subplot(111),也就是說plot實際上是Axes的特例。

 4)保存Figure對象

最後一項操做就是保存,咱們繪圖的目的是用在其餘研究中,或者但願能夠把研究結果保存下來,此時須要的操做時save。

plt.savefig(r"C:\Users\123\Desktop\save_test.png",dpi=520)#默認像素dpi是80

很明顯保存的像素越高,內存越大。此處只是用了savefig屬性對Figure進行保存。

另外,除了上述的基本操做以外,Matplotlib還有其餘的繪圖優點,此處只是簡單介紹了它在繪圖時所須要注意的事項,更多的屬性設置請參考:https://matplotlib.org/api/

 

Seaborn模塊介紹


 前面咱們簡單介紹了Matplotlib庫的繪圖功能和屬性設置,對於常規性的繪圖,使用Pandas的繪圖功能已經足夠了,但若是對Matplotlib的API屬性研究較爲透徹,幾乎沒有不能解決的問題。可是Matplotlib仍是有它的不足之處,Matplotlib自動化程度很是高,可是,掌握如何設置系統以便得到一個吸引人的圖是至關困難的事。爲了控制Matplotlib圖表的外觀,Seaborn模塊自帶許多定製的主題和高級的接口。

1)未加Seaborn模塊的效果

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

np.random.seed(sum(map(ord,"aesthetics")))
#首先定義一個函數用來畫正弦函數,可幫助瞭解能夠控制的不一樣風格參數
def sinplot(flip=1):
    x=np.linspace(0,14,100)
    for i in range(1,7):
        plt.plot(x,np.sin(x+i*0.5)*(7-i)*flip)
sinplot()
plt.show()

輸出結果:

2)加入Seaborn模塊的效果

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# 添加了Seaborn模塊

np.random.seed(sum(map(ord,"aesthetics")))
#首先定義一個函數用來畫正弦函數,可幫助瞭解能夠控制的不一樣風格參數
def sinplot(flip=1):
    x=np.linspace(0,14,100)
    for i in range(1,7):
        plt.plot(x,np.sin(x+i*0.5)*(7-i)*flip)
#轉換成Seaborn模塊,只須要引入seaborn模塊
import seaborn as sns#添加Seaborn模塊
sinplot()
plt.show()

輸出效果:

小編使用的jupyter notebook編輯器,使用與不使用Seaborn模塊效果差異不明顯。

使用Seaborn的優勢有:

  1. Seaborn默認淺灰色背景與白色網格線的靈感來源於Matplotlib,卻比Matplotlib的顏色更加柔和
  2. Seaborn把繪圖風格參數與數據參數分開設置。

其中,Seaborn有兩組函數對風格進行控制:axes_style()/set_style()函數和plotting_context()/set_context()函數。

axes_style()函數和plotting_context()函數返回參數字典,set_style()函數和set_context()函數設置Matplotlib。

使用set_style()函數

import seaborn as sns

'''
Seaborn有5種預約義的主題:
darkgrid(灰色背景+白網格)
whitegrid(白色背景+黑網格)
dark(僅灰色背景)
white(僅白色背景)
ticks(座標軸帶刻度)
默認的主題是darkgrid,修改主題可使用set_style函數
'''
sns.set_style("whitegrid")
sinplot()#即上段代碼中定義的函數
plt.show()

輸出結果:

使用set_context()函數

'''
上下文(context)能夠設置輸出圖片的大小尺寸(scale)
Seaborn中預約義的上下文有4種:paper、notebook、talk和poster
默認使用notebook上下文
'''
sns.set_context("poster")
sinplot()#即前文定義的函數
plt.show()

輸出結果:

使用Seaborn「耍酷」

 然而Seaborn不只可以用來更改背景顏色,或者改變畫布大小,還有其餘不少方面的用途,好比下面的例子。

'''
Annotated heatmaps
================================
'''
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

#經過加載sns自帶數據庫中的數據(具體數據能夠不關心)
flights_long=sns.load_dataset("flights")
flights=flights_long.pivot("month","year","passengers")

# 使用每一個單元格中的數據值繪製一個熱力圖heatmap
sns.heatmap(flights,annot=True,fmt="d",linewidths=.5)
plt.show()

輸出結果:

描述性統計圖形概覽


 描述性統計是藉助圖表或者總結性的數值來描述數據的統計手段。數據挖掘工做的數據分析階段,咱們可藉助描述性統計來描繪或總結數據的基本狀況,一來能夠梳理本身的思惟,而來能夠更好地向他人展現數據分析結果。數值分析的過程當中,咱們每每要計算出數據的統計特徵,用來作科學計算的Numpy和Scipy工具能夠知足咱們的需求。Matplotlib工具可用來繪製圖,知足圖分析的需求。

1)製做數據

數據是本身製做的,主要包括我的身高、體重及一年的借閱圖書量(之因此本身製做數據是由於不是每份真實的數據均可以進行接下來的分析,好比有些數據就不能繪製餅圖,另外一個角度也說明,此處舉例的數據其實沒有實際意義,只是爲了分析二舉例,可是不表明在具體的應用中這些分析不能發揮做用)。

另外,如下的數據顯示都是在Seaborn庫的做用下體現的效果。

# 案例分析
from numpy import array
from numpy.random import normal

def getData():
    heights=[]
    weights=[]
    books=[]
    N=10000
    for i in range(N):
        while True:
            #身高服從均值爲172,標準差爲6的正態分佈
            height=normal(172,6)
            if 0<height:
                break
        while True:
            #體重由身高做爲自變量的線性迴歸模型產生,偏差服從標準正態分佈
            weight=(height-80)*0.7+normal(0,1)
            if 0<weight:
                break
        while True:
            #借閱量服從均值爲20,標準差爲5的正態分佈
            number=normal(20,5)
            if 0<=number and number<=50:
                book='E' if number<10 else ('D' if number<15 else ('C' if number<20 else ('B' if number<25 else 'A')))
                break
        heights.append(height)
        weights.append(weight)
        books.append(book)
   return array(heights),array(weights),array(books)
heights,weights,books=getData()

2)頻數分析

(1)定性分析

柱狀圖和餅形圖是對定性數據進行頻數分析的經常使用工具,使用前需將每一類的頻數計算出來。

柱狀圖。柱狀圖是以柱的高度來指代某類型的頻數,使用Matplotlib對圖書借閱量這必定性變量繪製柱狀圖的代碼以下。(接上段代碼)

from matplotlib import pyplot

#繪製柱狀圖
def drawBar(books):
    xticks=['A','B','C','D','E']
    bookGroup={}
    #對每一類借閱量進行頻數統計
    for book in books:
        bookGroup[book]=bookGroup.get(book,0)+1
    #建立柱狀圖
    #第一個參數爲柱的橫座標
    #第二個參數爲柱的高度
    #參數align爲柱的對齊方式,以第一個參數爲參考標準
    pyplot.bar(range(5),[bookGroup.get(xtick,0) for xtick in xticks],align='center')
    
    #設置柱的文字說明
    #第一個參數爲文字說明的橫座標
    #第二個參數爲文字說明的內容
    pyplot.xticks(range(5),xticks)
    #設置橫座標的文字說明
    pyplot.xlabel("Types of Students")
    #設置縱座標的文字說明
    pyplot.ylabel("Frequency")
    #設置標題
    pyplot.title("Numbers of Books Students Read")
    #繪圖
    pyplot.show()
drawBar(books)

輸出結果:

餅形圖。餅形圖事宜扇形的面積來指代某類型的頻率,使用Matplotlib對圖書借閱量這必定性變量繪製餅形圖的代碼以下:

#繪製餅形圖
def drawPie(books):
    labels=['A','B','C','D','E']
    bookGroup={}
    for book in books:
        bookGroup[book]=bookGroup.get(book,0)+1
    #建立餅形圖
    #第一個參數是扇形的面積
    #labels參數爲扇形的說明文字
    #autopct參數爲扇形佔比的顯示格式
    pyplot.pie([bookGroup.get(label,0) for label in labels],labels=labels,autopct='%1.1f%%')
    pyplot.title("Number of Books Students Read")
    pyplot.show()
drawPie(books)

輸出結果:

(2)定量分析

直方圖相似於柱狀圖,是用柱的高度來指代頻數,不一樣的是其將定量數據劃分爲若干連續的區間,在這些連續的區間上繪製柱。

直方圖。使用Matplotlib對身高這必定量變量繪製直方圖的代碼以下:

#繪製直方圖
def drawHist(heights):
    #建立直方圖
    #第一個參數爲待繪製的定量數據,不一樣於定性數據,這裏並無實現進行頻數統計
    #第二個參數爲劃分的區間個數
    pyplot.hist(heights,100)
    pyplot.xlabel('Heights')
    pyplot.ylabel('Frequency')
    pyplot.title('Height of Students')
    pyplot.show()
drawHist(heights)

輸出結果:

累積曲線。使用Matplotlib對身高這必定量變量繪製累積曲線的代碼以下:

#繪製累積曲線
def drawCumulativaHist(heights):
    #建立累積曲線
    #第一個參數爲待繪製的定量數據
    #第二個參數爲劃分的區間個數
    #normal參數爲是否無量綱化
    #histtype參數爲‘step’,繪製階梯狀的曲線
    #cumulative參數爲是否累積
    pyplot.hist(heights,20,normed=True,histtype='step',cumulative=True)
    pyplot.xlabel('Heights')
    pyplot.ylabel('Frequency')
    pyplot.title('Heights of Students')
    pyplot.show()
drawCumulativaHist(heights)

輸出結果:

3)關係分析

 散點圖。在散點圖中,分別以自變量和因變量做爲橫座標。當自變量與因變量線性相關時,散點圖中的點近似分佈在一條直線上。咱們以身高做爲自變量,體重做爲因變量,討論身高對體重的影響。使用Matplotlib繪製散點圖的代碼以下:

#繪製散點圖
def drawScatter(heights,weights):
    #建立散點圖
    #第一個參數爲點的橫座標
    #第二個參數爲點的縱座標
    pyplot.scatter(heights,weights)
    pyplot.xlabel('Heights')
    pyplot.ylabel('Weight')
    pyplot.title('Heights & Weight of Students')
    pyplot.show()
drawScatter(heights,weights)

輸出結果:

4)探索分析

 箱型圖。在不明確數據分析的目標時,咱們對數據進行一些探索性的分析,能夠知道數據的中心位置、發散程度及誤差程度。使用Matplotlib繪製關於身高的箱型圖代碼以下:

#繪製箱型圖
def drawBox(heights):
    #建立箱型圖
    #第一個參數爲待繪製的定量數據
    #第二個參數爲數據的文字說明
    pyplot.boxplot([heights],labels=['Heights'])
    pyplot.title('Heights of Students')
    pyplot.show()
drawBox(heights)

輸出結果:

注:

  • 上四分位數與下四分位數的差叫四分位差,它是衡量數據發散程度的指標之一
  • 上界線和下界線是距離中位數1.5倍四分位差的線,高於上界線或者低於下界線的數據爲異常值

 描述性統計是容易操做、直觀簡潔的數據分析手段。可是因爲簡單,對於多元變量的關係難以描述。現實生活中,自變量一般是多元的:決定體重的不只有身高,還有飲食習慣、肥胖基因等因素。經過一些高級的數據處理手段,咱們能夠對多元變量進行處理,例如,特徵工程中,可使用互信息方法來選擇多個對因變量有較強相關性的自變量做爲特徵,還可使用主成分分析法來消除一些冗餘的自變量來下降運算複雜度。

 

 參考書目:《數據館員的Python簡明手冊》

相關文章
相關標籤/搜索