您好,登錄后才能下訂單哦!
本篇文章為大家展示了Seaborn,進階Python數據可視化,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
- 為什么用 Seaborn -
Seaborn 是基于 Python 且非常受歡迎的圖形可視化庫,在 Matplotlib 的基礎上,進行了更高級的封裝,使得作圖更加方便快捷。即便是沒有什么基礎的人,也能通過極簡的代碼,做出具有分析價值而又十分美觀的圖形。
Seaborn 可以實現 Python 環境下的絕大部分探索性分析的任務,圖形化的表達幫助你對數據進行分析,而且對 Python 的其他庫(比如 Numpy/Pandas/Scipy)有很好的支持。
那么現在開始,十分鐘的時間,你就可以了解 Seaborn 中常用圖形的繪制方法,以及進階的可視化分析技巧。
- Seaborn 繪圖上手 -
如果你還沒有安裝 Python 環境,那么推薦你安裝 Anaconda,對于上手 Python 來說更加簡單,不容易出差錯。Anaconda 的安裝教程網上很多,找到對應版本客戶端安裝即可。
安裝好后,即可在終端(cmd)安裝核心庫 Seaborn 和 Matplotlib。
安裝 Matplotlib
python -m pip install matplotlib
安裝 Seaborn
pip install seaborn
然后打開 Jupyter Notebook(安裝好 Anaconda 后,Jupyter 也已裝好,在應用窗口中可以找到),我們就可以直接上手了。
先來一段基本的代碼:
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.barplot(x='class',y='survived',data=titanic)
通過以上代碼,我們就繪制出了基本的條形圖,是不是超級簡單。這也是用 Seaborn 實現一個圖形的基本模式,接下來我們把上面的代碼拆開來看。
1.導入繪圖模塊
import seaborn as sns import matplotlib.pyplot as plt
這里我們導入 Seaborn 和 Matplotlib.pyplot 模塊,分別命名為 sns 和 plt,原則上這個簡稱是可以隨意寫的,但為了規范,盡量寫成這樣。這里引入 Matplotlib.pyplot ,是為了通過 Matplotlib 的參數去進行更好的控制。
2.提供顯示條件
%matplotlib inline
這里的 “%matplot inline” 是為了在 Jupyter 中正常顯示圖形,若沒有這行代碼,圖形顯示不出來的。
3.導入數據
titanic=sns.load_dataset('titanic')
這里我們用 Seaborn 的 load_dataset() 方法導入數據 ‘titanic’,這是泰坦尼克號的相關數據,內置于 Seaborn(內置數據都可以用此方法導入)。當然 Seaborn 還提供了其他的內置數據,可以直接調用:
地址:<u style="text-decoration: none; border-bottom: 1px dashed rgb(128, 128, 128);">https://github.com/mwaskom/seaborn-data</u>
4.輸出圖形
sns.barplot(x='class',y='survived',data=titanic)
這是圖形輸出的直接代碼,barplot 表示輸出條形圖,同樣的還有 Seaborn 中還有 countplot、boxplot、violinplot、regplot、lmplot、heatmap 等多種圖形方法可以使用,我們在接下來會詳細說明。
barplot() 括號里的是需要設置的具體參數,涉及到數據、顏色、坐標軸、以及具體圖形的一些控制變量,一般比較固定的是 'x'、'y'、'data',分別表示x軸,y軸,以及選擇的數據集。
- Seaborn 圖形可視化 -
01 distplot
直方圖
通常我們在分析一組數據時,首先要看的就是變量的分布規律,而直方圖則提供了簡單快速的方式,在 Seaborn 中可以用 distplot() 實現。
我們首先導入數據集 'titanic',并查看隨機的10行數據,對數據集有一個初步的印象:
import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline #導數數據集'titanic' titanic=sns.load_dataset('titanic') #查看數據集的隨機10行數據,用sample方法 titanic.sample(10)
通過觀察數據,我們對'age'進行直方圖展示。但在繪圖之前,我們觀測到'age'字段中存在缺失值,需要先用 dropna() 方法刪掉存在缺失值的數據,否則無法繪制出圖形。
#去除'age'中的缺失值,distplot不能處理缺失數據 age1=titanic['age'].dropna() sns.distplot(age1)
在上圖中,矩形表示在不同年齡段的數量分布,并且 distplot() 默認擬合出了密度曲線,可以看出分布的變化規律。
同時我們可以調節其中的一些參數,來控制輸出的圖形。
'kde' 是控制密度估計曲線的參數,默認為 True,不設置會默認顯示,如果我們將其設為 False,則不顯示密度曲線。
#去掉擬合的密度估計曲線,kde參數設為False sns.distplot(age1,kde=False)
'bins'是控制分布矩形數量的參數,通常我們可以增加其數量,來看到更為豐富的信息。
# 通過'bins'參數設定數據片段的數量 sns.distplot(age1,bins=30,kde=False)
'reg' 參數用于控制直方圖中的邊際毛毯,通過控制'reg'是實現毛毯是否顯示。
#創建一個一行2列的畫布,主要方便對比 fig,axes=plt.subplots(1,2) #設置'reg'參數,加上觀測數值的邊際毛毯 #需要用axes[]表示是第幾張圖,從0開始 sns.distplot(age1,ax=axes[0]) #左圖 sns.distplot(age1,rug=True,ax=axes[1]) #右圖
當然,除了控制矩形分布、密度曲線及邊際毛毯是否顯示,還可以通過更豐富的參數控制他們展示的細節,這些通過參數 'hist_kws' 、'kde_kws' 、'reg_kws' 來進行設置,因為其中涉及到多個參數,參數間用逗號隔開,參數外面用大括號括住。
#可以分別控制直方圖、密度圖的關鍵參數 fig,axes=plt.subplots(1,2) sns.distplot(age1,rug=True,ax=axes[0]) sns.distplot(age1,rug=True, hist_kws={'color':'green','label':'hist'}, kde_kws={'color':'red','label':'KDE'}, ax=axes[1])
02 barplot
條形圖
barplot() 利用矩陣條的高度反映數值變量的集中趨勢,以及使用errorbar功能(差棒圖)來估計變量之間的差值統計(置信區間)。需要提醒的是 barplot() 默認展示的是某種變量分布的平均值(可通過參數修改為 max、median 等)。
這里我們仍然以'titanic'數據集作為展示,將'class'設為x軸,'survived'設為y軸。
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline #導入數據集'titanic',命名為'titanic' titanic=sns.load_dataset('titanic') #將'class'設為x軸,'survived'為y軸,傳入'titanic'數據 sns.barplot(x='class',y='survived',data=titanic)
我們可以通過設置'hue'參數,對x軸的數據進行細分,細分的條件就是'hue'的參數值,比如這里我們的x軸是'class'(倉位等級),我們將其按'sex'(性別)再進行細分。
sns.barplot(x='class',y='survived',hue='sex',data=titanic)
換一組數據試試,將x軸設為'embarked',y軸設為'survived',并用'class'進行細分。
sns.barplot(x='embarked',y='survived', hue='class',data=titanic)
03 countplot
計數圖
countplot 故名思意,計數圖,可將它認為一種應用到分類變量的直方圖,也可認為它是用以比較類別間計數差。當你想要顯示每個類別中的具體觀察數量時,countplot 很容易實現,比較類似我們在 Excel 等軟件中應用的條形圖。
同樣,我們以數據集'titanic'為例子,首先探索'deck'字段下的類別計數。
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.countplot(x='deck',data=titanic)
由此可見,我們選定某個字段,countplot() 會自動幫我們統計該字段下各類別的數目。當然,我們也可以再傳入'hue'參數,進行細分,這里我們加入'sex'分類。
sns.countplot(x='deck',hue='sex',data=titanic)
如果我們希望調換橫縱坐標,也就是類別放于縱坐標,計數值橫坐標顯示,將x軸換為y軸即可。
sns.countplot(y='deck',hue='who',data=titanic)
04 stripplot/swarmplot
散點圖
在seaborn中有兩種不同的分類散點圖。stripplot() 使用的方法是用少量的隨機“抖動”調整分類軸上的點的位置,swarmplot() 表示的是帶分布屬性的散點圖。
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.stripplot(x='embarked',y='fare',data=titanic)
這里我們可以通過設置'jitter'參數控制抖動的大小。
sns.stripplot(x='embarked',y='fare', data=titanic,jitter=1)
swarmplot() 方法使用防止它們重疊的算法沿著分類軸調整點。它可以更好地表示觀測的分布,它適用于相對較小的數據集。
sns.swarmplot(x='embarked',y='fare',data=titanic)
可以通過'hue'參數,對散點圖添加更多細分的維度,Seaborn 中會以顏色來進行區分。
sns.stripplot(x='embarked',y='age',hue='who',jitter=1,data=titanic)
sns.swarmplot(x='embarked',y='age',hue='who',data=titanic)
05 boxplot
箱線圖
boxplot(箱線圖)是一種用作顯示一組數據分散情況的統計圖。它能顯示出一組數據的最大值、最小值、中位數及上下四分位數。因形狀如箱子而得名。這意味著箱線圖中的每個值對應于數據中的實際觀察值。
以'titanic'數據集為例,我們首先來探索不同的'class'(船艙)下的乘客的'age'(年齡)情況。
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.boxplot(x='class',y='age',data=titanic)
同樣的,可以通過傳入'hue'的參數,來對x軸的字段進行細分,這里我們通過'who'來進行分類觀察。
sns.boxplot(x='class',y='age',hue='who',data=titanic)
與上述類似,我們也可以通過調換x/y軸,實現箱線圖的橫向顯示。
sns.boxplot(x='age',y='class',hue='who',data=titanic)
調節'order' 和 'hue_order' 參數,我們可以控制x軸展示的順序。
fig,axes=plt.subplots(1,2) sns.boxplot(x='class',y='age',hue='who', data=titanic,ax=axes[0]) sns.boxplot(x='class',y='age',hue='who',data=titanic, order=['Third','Second','First'], hue_order=['child','woman','man'],ax=axes[1])
可以通過'linewidth'參數,控制線條的粗細。我們把'linewidth'參數設為1,就可以看到整體圖形的線條變細,你可以根據自己的需要調節。
sns.boxplot(x='class',y='age',hue='who', linewidth=1,data=titanic)
06 violinplot
小提琴圖
小提琴圖其實是箱線圖與核密度圖的結合,箱線圖展示了分位數的位置,小提琴圖則展示了任意位置的密度,通過小提琴圖可以知道哪些位置的密度較高。
在圖中,白點是中位數,黑色盒型的范圍是下四分位點到上四分位點,細黑線表示須。外部形狀即為核密度估計。
與箱線圖進行對比,同樣以'titanic'數據集為例,我們來探索不同的'class'(船艙)下乘客的'age'(年齡)情況。
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline titanic=sns.load_dataset('titanic') sns.violinplot(x='class',y='age',data=titanic)
同樣,可以設置'hue'參數,對字段進行細分。
sns.violinplot(x='class',y='age',hue='who',data=titanic)
當hue參數只有兩個級別時,也可以通過設置'split'參數為True,“拆分”小提琴,提琴兩邊分別表示兩個分類的情況,這樣可以更有效地利用空間。
sns.violinplot(x='class',y='age',hue='alive', data=titanic,split=True)
我們可以在小提琴內部添加圖形來幫助我們進行分析,這里就需要控制'inner'參數。
sns.violinplot(x='class',y='age',hue='alive', data=titanic,split=True,inner='stick')
我們甚至可以把上面提到的散點圖加入小提琴圖中。
sns.violinplot(x='class',y='age',data=titanic,inner=None) sns.swarmplot(x='class',y='age',data=titanic,color='white')
07 regplot/lmplot
回歸圖
Seaborn 中利用 regplot() 和 lmplot() 來進行回歸,確定線性關系,它們密切相關,共享核心功能,但也有明顯的不同。
這里我們使用 Seaborn 自帶的數據集'iris'來繪制回歸相關的圖形。首先我們導入收據來看看數據集的大概情況:
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline #導入數據集'iris' iris=sns.load_dataset('iris') #隨機查看數據集的10行數據 iris.sample(10)
數據集非常簡單,總共是5個字段,我們首先來看 'sepal_length' 和 'petal_length' 之間的線性關系。
sns.regplot(x='sepal_length',y='petal_length',data=iris)
圖中的點表示實際的數據點,Seaborn 根據這些數據擬合出直線,表示x軸和y軸對應字段之間的線性關系,直線周圍的陰影表示置信區間。
關于置信區間,可以通過設置'ci'參數控制是否顯示。
sns.regplot(x='sepal_length',y='petal_length',data=iris,ci=None)
可以通過'color'和'marker'參數來控制圖形的顏色以及數據點的形狀。
fig,axes=plt.subplots(1,2) sns.regplot(x='sepal_length',y='petal_length',data=iris, color='r',marker='+',ax=axes[0]) sns.regplot(x='sepal_length',y='petal_length',data=iris, color='g',marker='*',ax=axes[1])
lmplot() 可以設置hue,進行多個類別的顯示,而 regplot() 是不支持的。這里我們通過設置hue='species',來進行分類別地展示。
sns.lmplot(x='sepal_length',y='petal_length', hue='species',data=iris)
同樣的,我們也可以更改數據點的形狀,來進行區分。
sns.lmplot(x='sepal_length',y='petal_length',hue='species', data=iris,markers=['*','o','+'])
設置'fit_reg'參數,可以控制是否顯示擬合的直線。
sns.lmplot(x='sepal_length',y='petal_length',hue='species', data=iris,markers=['*','o','+'],fit_reg=False)
如果要對不同的類別分開繪制,用'col'參數代替'hue'。
sns.lmplot(x='sepal_length',y='petal_length', col='species',data=iris)
08 heatmap
熱力圖
熱力圖通常用來表示特征之間的相關性,一般通過顏色的深淺來表示數值的大小或者相關性的高低。
這里我們導入 Seaborn 自帶的另一個數據集'flights',來繪制熱力圖。先查看數據前10行的情況:
import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline flights = sns.load_dataset("flights") flights.head(10)
我們以'year'為縱軸,'month'為橫軸,'passengers'的值為標準繪制熱力圖。
f=flights.pivot('year','month','passengers') sns.heatmap(f)
如果要顯示具體的數值,可以通過'annot'參數來控制。
sns.heatmap(f, annot=True,fmt="d")
通過 Seaborn 的調色板控制熱力圖顯示的顏色,調色板在后續會有詳細的說明,這里只做演示,示例熱力圖的顏色調節機制。
cmap = sns.diverging_palette(200,20,sep=20,as_cmap=True) sns.heatmap(f,cmap=cmap)
- 圖形控制的藝術 -
前面我們利用 Seaborn 繪制了各種類型的圖形,對于基本的快速分析,其實已經足夠,但是在細節的調節、顏色、美觀度等方面我們還可以進行精細化的控制。
首先我們利用 Numpy 創建一組數據(20行6列的隨機數),然后利用 Seaborn 創建一個箱線圖來進行展示。
import numpy as np import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline #創建一個20行6列的數據 data = np.random.normal(size=(20, 6)) + np.arange(6) / 2 sns.boxplot(data=data)
圖形背景
Seaborn 中有 white / whitegrid / dark / darkgrid / ticks 幾種樣式,用 set_style() 函數控制,分別如下:
whitegrid 白色網格背景
white 白色背景(默認)
darkgrid 黑色網格背景
dark 黑色背景
ticks 四周帶有刻度的白色背景
# 設為白色網格背景 sns.set_style("whitegrid") sns.boxplot(data=data)
# 設為黑色網格背景 sns.set_style("darkgrid") sns.boxplot(data=data)
調色板
seaborn 中的分類色板,主要用 color_palette() 函數控制,color_palette() 不寫參數則顯示為 Seaborn 默認顏色。如果需要設置所有圖形的顏色,則用 set_palette() 函數定義。
Seaborn 中6個默認的顏色循環主題分別為: deep, muted, pastel, bright, dark, colorblind,下面我們列舉演示。
# 設置顏色模式為'deep' sns.boxplot(data=data,palette=sns.color_palette('deep'))
# 設置顏色模式為'pastel' sns.boxplot(data=data,palette=sns.color_palette('pastel'))
需要注意的是,除了默認的顏色模式有10中顏色外,其他的顏色模式只有6種顏色,如果需要更多顏色,那么則需要采用hls色彩空間。
#創建一個20行10列的數據'data2' data2 = np.random.normal(size=(20, 10)) + np.arange(10) / 2 #利用hls色彩空間進行調色 sns.boxplot(data=data2, palette=sns.color_palette('hls', 10))
我們也可以通過簡單的設置,得到單色漸變的效果,默認顏色由淺到深。
#可以嘗試 Reds/Greens,默認顏色由淺到深 sns.boxplot(data=data,palette=sns.color_palette('Blues'))
顯示中文
Seaborn 對中文的顯示不太友好,如果在遇到亂碼問題時,可以加入下面的代碼。
# 指定默認字體 mpl.rcParams['font.sans-serif'] = ['SimHei'] # 解決保存圖像是負號'-'顯示為方塊的問題 mpl.rcParams['axes.unicode_minus'] = False
保存圖片
畫出的圖形我們需要保存,可以先建立一個畫布,設置我們圖像的大小,然后將這個畫布保存下來。
#設置一個(12,6)的畫布 plt.figure(figsize=(12, 6)) #圖形繪制代碼 sns.boxplot(data=data,palette=sns.color_palette('Blues')) #將畫布保存為'xiang.png',還可以保存為jpg、svg格式圖片 plt.savefig('xiang.png')
關于 Seaborn,基本的圖形繪制到這里就差不多了,雖然只是最常規的圖形,但是足夠讓你開始嘗試探索數據,快速繪圖并獲得分析結果。
當然,這絕對不是 Seaborn 的全部,如果進行更精細化的參數設置,如何做出信息更多、更加美觀的圖形,還有很多需要去了解的細節。
探索性數據分析的路很長,但開始足夠簡單,去創造屬于你的圖形吧。
上述內容就是Seaborn,進階Python數據可視化,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。