python数据可视化工具 pandas_Pandas数据可视化工具——Seaborn用法整理(下)
在前一篇文章 Pandas數(shù)據(jù)可視化工具——Seaborn用法整理(上),我們了解了如何使用這些Seaborn代碼繪制分布圖和分類(lèi)圖。在本文中,我們將繼續(xù)討論Seaborn提供的一些其他以繪制不同類(lèi)型統(tǒng)計(jì)圖的功能,我們將從矩陣圖開(kāi)始討論。
矩陣圖
矩陣圖是一種以行和列的形式顯示數(shù)據(jù)的圖。Heat maps是矩陣圖的一個(gè)典型例子。
Heat Maps
Heat Maps通常用于以矩陣形式繪制數(shù)值列之間的相關(guān)性。這里需要提到的是,要繪制矩陣圖,需要有關(guān)于行和列的有價(jià)值的信息。延續(xù)上一篇文章的主題,我們將使用財(cái)報(bào)數(shù)據(jù)10-18年的數(shù)據(jù),看看行和列標(biāo)題是否都是有意義的信息。執(zhí)行以下代碼:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = DataSource('financial_statement_CN_STOCK_A').read(start_date='2010-04-01',end_date='2018-04-02')
df.head()
在輸出中,可以看到如下結(jié)果:
從輸出中可以看到,列標(biāo)頭包含有用的信息,如股票代碼、日期、固定資產(chǎn)、營(yíng)業(yè)利潤(rùn)等。而行標(biāo)頭只包含索引0、1、2等。一種方法是調(diào)用數(shù)據(jù)集上的corr()方法。函數(shù)的作用是:返回?cái)?shù)據(jù)集中所有數(shù)字列之間的相關(guān)性。執(zhí)行以下代碼:
df_0 = df[['date','instrument','fs_operating_profit','fs_current_assets','fs_net_profit_ttm','fs_roe','fs_gross_profit_margin','fs_free_cash_flow']]
df_0.corr()
(這里為了使結(jié)果圖簡(jiǎn)潔,只選擇了六個(gè)統(tǒng)計(jì)量。)
在輸出中,將看到各列之間的相關(guān)系數(shù),如下所示:
現(xiàn)在,要?jiǎng)?chuàng)建具有這些相關(guān)值的Heat Maps,需要調(diào)用heatmap()函數(shù)并將相關(guān)系數(shù)的DataFrame傳遞給它。請(qǐng)看下面的代碼:
sns.heatmap(df_0.corr())
在輸出中,將看到如下結(jié)果:
從輸出中可以看出,heatmap的基本功能是為行和列值的每個(gè)組合繪制一個(gè)框。圖像的顏色取決于漸變。例如,在上面的圖像中,如果兩個(gè)特征之間有很高的相關(guān)性,對(duì)應(yīng)的單元格或者方框是白偏向于色的,另一方面,如果沒(méi)有相關(guān)性,對(duì)應(yīng)的單元格是黑色的。
通過(guò)為傳遞參數(shù)annot為T(mén)rue,相關(guān)系數(shù)也可以繪制在heatmap上。執(zhí)行下面的代碼,看看這是否有效:
sns.heatmap(df_0.corr(), annot=True)
還可以通過(guò)給cmap傳遞參數(shù)來(lái)更改heatmap的顏色。現(xiàn)在,看看下面的代碼:
sns.heatmap(df_0.corr(), cmap='winter')
結(jié)果如下:
除了僅使用所有列之間的相關(guān)性之外,還可以使用pivot_table函數(shù)指定索引、列以及希望看到的與索引和列對(duì)應(yīng)的值。為了展示pivot_table函數(shù)的運(yùn)行情況,我們可以觀察單個(gè)股票的情況。這里我們
執(zhí)行以下代碼導(dǎo)入數(shù)據(jù)集并查看數(shù)據(jù)集的前5行:
df_1 = df.ix[df['instrument']=='600760.SHA']#選出某一只股票單獨(dú)作圖(否則圖像無(wú)意義)
df_2 = df_1.pivot_table(index='fs_quarter_index', columns='fs_quarter_year', values='fs_roe' )
df_2.head()
輸出:
(由于財(cái)報(bào)數(shù)據(jù)沒(méi)有類(lèi)似月份的列,我們選擇的時(shí)間也相對(duì)較短,本圖美觀度有所欠缺,不過(guò)重在總結(jié)方法)
現(xiàn)在使用pivot_table函數(shù),我們可以創(chuàng)建一個(gè)Heat Maps,顯示在特定年份的特定季度特定股票的凈資產(chǎn)收益率(fs_roe)。為此,我們將輸入季度(fs_quarter_index)作為index參數(shù)的值。index屬性對(duì)應(yīng)于行。接下來(lái),我們需要將輸入年份(fs_quarter_year)作為列參數(shù)。最后對(duì)于values參數(shù),我們將輸入凈資產(chǎn)收益率(fs_roe)。執(zhí)行以下代碼:
sns.heatmap(df_2)
結(jié)果如下
從結(jié)果可以明顯看出,該股票在這段時(shí)間里凈資產(chǎn)收益率的變化
有時(shí)候,我們會(huì)發(fā)現(xiàn)方框或單元格是重疊的,單元格邊界之間的區(qū)別不是很清楚。要在單元格之間創(chuàng)建清晰的邊界,可以使用linecolor和linewidths參數(shù)。看看下面的代碼:
sns.heatmap(df_2, linecolor='blue', linewidth=1)
在上面的代碼中,我們輸入了“blue”作為linecolor參數(shù)的值,而line width參數(shù)被設(shè)置為1。在輸出中,您將看到每個(gè)單元格的藍(lán)色邊界:
如果需要更厚的邊界,可以增加linewidth參數(shù)的值。
Cluster Map
除了Heat Map,另一個(gè)常用的矩陣圖是Cluster Map。Cluster Map基本上使用層次聚類(lèi)來(lái)對(duì)矩陣的行和列進(jìn)行聚類(lèi)。
讓我們繪制一個(gè)Cluster Map,表示在特定季度和特定年份的凈資產(chǎn)收益率。執(zhí)行以下代碼:
df_3 = df_1[['fs_quarter_index','fs_roe','fs_quarter_year']]
df_4 = df_3.pivot_table(index='fs_quarter_year', columns='fs_quarter_index', values='fs_roe')
sns.clustermap(df_4)
要繪制集群映射,需要使用clustermap函數(shù),與heat map函數(shù)一樣,傳遞的數(shù)據(jù)集應(yīng)該具有行和列的有意義的標(biāo)題。上面代碼的結(jié)果是這樣的:
在輸出中,您可以看到根據(jù)特定季度和特定年份聚集起來(lái)的凈資產(chǎn)收益率。
至此,我們結(jié)束了關(guān)于矩陣圖的討論。在下一節(jié)中,我們將開(kāi)始討論Seaborn庫(kù)的網(wǎng)格功能。
Seaborn網(wǎng)格
Seaborn中的網(wǎng)格允許我們根據(jù)圖中使用的特性操作子圖。
Pair Grid
在本系列文章的第1部分中,我們了解了如何使用pair plot繪制數(shù)據(jù)集中數(shù)字列的所有可能組合的散點(diǎn)圖。
現(xiàn)在讓我們?cè)谏鲜龃a的基礎(chǔ)上繪制Pair Plot。執(zhí)行以下代碼:
df_5 = df[['fs_account_payable','fs_account_receivable','fs_capital_reserves','fs_construction_in_process','fs_undistributed_profit']]
sns.pairplot(df_5)
該代碼輸出是這樣的:
現(xiàn)在我們來(lái)畫(huà)Pair Grid看看Pair Grid和Pair Plot的區(qū)別。要?jiǎng)?chuàng)建對(duì)網(wǎng)格,只需將數(shù)據(jù)集傳遞給PairGrid函數(shù),如下所示:
sns.PairGrid(df_5)
在輸出中,可以看到空網(wǎng)格。這就是pair grid函數(shù)的作用。它返回?cái)?shù)據(jù)集中所有特性的空網(wǎng)格集。
接下來(lái),需要對(duì)pair grid函數(shù)返回的對(duì)象調(diào)用map函數(shù),并將希望在網(wǎng)格上繪制的繪圖類(lèi)型傳遞給它。讓我們用對(duì)網(wǎng)格繪制一個(gè)散點(diǎn)圖。
df_5 = df_5.dropna()
df_6 = sns.PairGrid(df_5)
df_6.map(plt.scatter)
輸出是這樣的:
可以在看到df_5中所有列分別作x、y軸的散點(diǎn)圖。
還可以在同一對(duì)網(wǎng)格上繪制不同類(lèi)型的圖。例如,如果想在對(duì)角線上繪制“分布”圖,在對(duì)角線的上半部分繪制“kdeplot”圖,在對(duì)角線的下半部分繪制“散點(diǎn)”圖,那么可以分別使用map_diag、map_upper和map_lower函數(shù)。將繪制的繪圖類(lèi)型作為參數(shù)傳遞給這些函數(shù)。看看下面的代碼:
grids = sns.PairGrid(df_5)
grids.map_diag(sns.distplot)
grids.map_upper(sns.kdeplot)
grids.map_lower(plt.scatter)
代碼結(jié)果如下:
從上面的圖像中可以看出pair grid函數(shù)的真正威力。對(duì)角線上是分布圖,上半部分是核密度圖,下半部分是散點(diǎn)圖。
Facet Grids
Facet Grid用于將兩個(gè)或兩個(gè)以上的分類(lèi)特征與兩個(gè)或兩個(gè)以上的數(shù)字特征進(jìn)行繪圖。讓我們畫(huà)一個(gè) Facet Grid來(lái)展示這幾個(gè)統(tǒng)計(jì)量?jī)蓛芍g的關(guān)系。
在本節(jié)中,我們將再次使用財(cái)報(bào)數(shù)據(jù)的部分列。執(zhí)行以下代碼加載數(shù)據(jù)集:
df_6 = df[['fs_quarter_index','fs_roe','fs_quarter_year','fs_account_payable','fs_account_receivable','fs_capital_reserves','fs_construction_in_process','fs_undistributed_profit']]
df_6.head()
要繪制Facet Grid,使用FacetGrid()函數(shù)。函數(shù)的第一個(gè)參數(shù)是數(shù)據(jù)集,第二個(gè)參數(shù)col指定要在列上繪圖的特性,而row參數(shù)指定行上的特性。函數(shù)的作用是:返回一個(gè)對(duì)象。與pair grid類(lèi)似,可以使用map函數(shù)指定要繪制的繪圖類(lèi)型。
執(zhí)行以下腳本:(winsorize函數(shù)將df_6進(jìn)行去極值處理,目的是使得結(jié)果更加具有表現(xiàn)力)
def winsorize(df, width=3):
df = df.copy()
factor_columns = set(df.columns).difference(['date','instrument'])
for factor in factor_columns:
mean = df[factor].mean()
sigma = df[factor].std()
df[factor] = df[factor].clip(mean-width*sigma,mean+width*sigma)
return df
df_6 = winsorize(df_6)
grid = sns.FacetGrid(data=df_6, col='fs_quarter_year', row='fs_quarter_index')
grid.map(sns.distplot, 'fs_roe')
在上面的代碼中,我們?cè)谛∑矫婢W(wǎng)格上繪制了凈資產(chǎn)收益率分布圖。輸出是這樣的:
從輸出中,您可以看到4×9個(gè)圖,單個(gè)圖上展示了各個(gè)股票在特定年份特定季度的凈資產(chǎn)收益率(fs_roe)的分布,這由FacetGrid()函數(shù)指定。
對(duì)于不同的子圖之間,子圖的位置決定了該子圖的時(shí)間:第一行第一列的圖為2009年第一季度的凈資產(chǎn)收益率的分布圖,以此類(lèi)推
除了為一個(gè)特征繪制分布圖外,我們還可以繪制包含面網(wǎng)格上兩個(gè)特征的散點(diǎn)圖。
例如,下面的代碼為年份和季度繪制了應(yīng)付賬款(fs_account_payable)和資本公積金(fs_capital_reserves)的散點(diǎn)圖。
grid = sns.FacetGrid(data=df_6, col='fs_quarter_year', row='fs_quarter_index')
grid.map(sns.scatterplot, 'fs_account_payable','fs_capital_reserves')
輸出結(jié)果如下:
回歸圖
回歸圖,顧名思義,是用來(lái)進(jìn)行兩個(gè)或多個(gè)變量之間的回歸分析。
在這一節(jié)中,我們將研究線性模型圖,它根據(jù)數(shù)據(jù)繪制出兩個(gè)變量之間的線性關(guān)系以及最佳擬合回歸線。
為了繪制線性模型,使用lmplot()函數(shù)。第一個(gè)參數(shù)是要在x軸上繪制的特征,第二個(gè)變量是要在y軸上繪制的特征。最后一個(gè)參數(shù)是數(shù)據(jù)集。執(zhí)行以下代碼:
sns.lmplot(x='fs_account_payable', y='fs_capital_reserves', data=df_6)
還可以根據(jù)分類(lèi)特征繪制多個(gè)線性模型。特性名作為值傳遞給hue參數(shù)。例如,如果要繪制不同季度的時(shí)候應(yīng)付賬款(fs_account_payable)和資本公積金(fs_capital_reserves)之間關(guān)系的多個(gè)線性模型,根據(jù)不同季度的情況,可以使用lmplot函數(shù)如下:
sns.lmplot(x='fs_account_payable', y='fs_capital_reserves', data=df_6,hue='fs_quarter_index')
結(jié)果如下:
從輸出可以看出,對(duì)于理想切割的鉆石,克拉與價(jià)格之間的線性關(guān)系是最陡的,而對(duì)于合理切割的鉆石,線性模型是最淺的。
除了為不同色調(diào)的cut feature繪制數(shù)據(jù)外,我們還可以為每個(gè)cut繪制一個(gè)plot。為此,需要將列名傳遞給col屬性。看看下面的腳本:
sns.lmplot(x='fs_account_payable', y='fs_capital_reserves', data=df_6,col='fs_quarter_index')
在輸出中,將看到鉆石數(shù)據(jù)集的cut列中的每個(gè)值都有一個(gè)單獨(dú)的列,如下所示:
還可以使用aspect和size參數(shù)更改繪圖的大小和縱橫比。看看下面的代碼:
sns.lmplot(x='fs_account_payable', y='fs_capital_reserves', data=df_6,col='fs_quarter_index',aspect = 0.5,size = 8)
aspect參數(shù)定義寬度和高度之間的縱橫比。長(zhǎng)寬比為0.5意味著寬度是輸出中所示高度的一半。
可以看出,圖的大小已經(jīng)發(fā)生了變化,字體大小仍然很小。在下一節(jié)中,我們將看到如何控制Seaborn圖的字體和樣式。
圖像樣式
Seaborn庫(kù)提供了多種樣式選項(xiàng)。在本節(jié)中,我們將講解其中一些。
設(shè)置風(fēng)格
函數(shù)的作用是:設(shè)置網(wǎng)格的樣式。您可以將darkgrid、whitegrid、dark、white和tick作為參數(shù)傳遞給set_style函數(shù)。
在本節(jié)中,我們將再次使用df_6。執(zhí)行以下代碼以查看darkgrid樣式。
df_6 = df_6.dropna()
sns.set_style('darkgrid')
sns.distplot(df_6['fs_roe'])
輸出如下:
在輸出中,您可以看到我們有帶有網(wǎng)格的黑色背景。讓我們看看whitegrid是什么樣子。執(zhí)行以下代碼:
sns.set_style('whitegrid')
sns.distplot(df_6['fs_roe'])
輸出如下:
現(xiàn)在你可以看到我們?nèi)匀挥芯W(wǎng)格在背景中,但深灰色的背景是不可見(jiàn)的。我們建議嘗試使用其他選項(xiàng),看看哪種風(fēng)格適合自己。
改變圖大小
由于Seaborn在后臺(tái)使用Matplotlib函數(shù),可以使用Matplotlib的pyplot包來(lái)更改圖形大小,如下圖所示:
plt.figure(figsize=(8,4))
sns.distplot(df_6['fs_roe'])
在上面的代碼中,我們將情節(jié)的寬度和高度分別設(shè)置為8英寸和4英寸。上面腳本的輸出是這樣的:
設(shè)置 Context
可以使用theset_context()函數(shù),并將poster作為惟一的屬性傳遞給它,如下所示:
sns.set_context('poster')
sns.distplot(df_6['fs_roe'])
在輸出中,應(yīng)該看到一個(gè)符合海報(bào)標(biāo)準(zhǔn)的圖,如下所示。例如,可以看到字體比正常的圖形大得多。
小結(jié)
Seaborn庫(kù)是用于數(shù)據(jù)可視化的高級(jí)Python庫(kù)。本文是關(guān)于在Python中使用Seaborn實(shí)現(xiàn)數(shù)據(jù)可視化的系列文章的第2部分。在這篇文章中,我們看到了如何在Seaborn中繪制回歸圖和矩陣圖。我們還了解了如何更改繪圖樣式和使用網(wǎng)格函數(shù)來(lái)操作子圖。
本文實(shí)現(xiàn)代碼可直接前往BigQuant平臺(tái)一鍵克隆代碼進(jìn)行實(shí)踐研究。
總結(jié)
以上是生活随笔為你收集整理的python数据可视化工具 pandas_Pandas数据可视化工具——Seaborn用法整理(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京东国行Xbox Series X有货了
- 下一篇: 北京昌平通报1例确诊:此前17次核酸阴性