Python數(shù)據(jù)可視化 課件 第7、8章 Seaborn繪圖庫(kù)、Pyecharts交互可視化庫(kù)_第1頁(yè)
Python數(shù)據(jù)可視化 課件 第7、8章 Seaborn繪圖庫(kù)、Pyecharts交互可視化庫(kù)_第2頁(yè)
Python數(shù)據(jù)可視化 課件 第7、8章 Seaborn繪圖庫(kù)、Pyecharts交互可視化庫(kù)_第3頁(yè)
Python數(shù)據(jù)可視化 課件 第7、8章 Seaborn繪圖庫(kù)、Pyecharts交互可視化庫(kù)_第4頁(yè)
Python數(shù)據(jù)可視化 課件 第7、8章 Seaborn繪圖庫(kù)、Pyecharts交互可視化庫(kù)_第5頁(yè)
已閱讀5頁(yè),還剩103頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Python數(shù)據(jù)可視化第7章Seaborn統(tǒng)計(jì)數(shù)據(jù)可視化教師:xxx2024.07第1節(jié)Seaborn簡(jiǎn)介第7章Seaborn統(tǒng)計(jì)數(shù)據(jù)可視化第2節(jié)

可視化分類數(shù)據(jù)第3節(jié)

可視化統(tǒng)計(jì)關(guān)系第4節(jié)

可視化變量分布第5節(jié)

其他方法本章介紹Python平臺(tái)下另一最常用的繪圖庫(kù)Seaborn,在官網(wǎng)/上注明了Seaborn的目標(biāo)就是實(shí)現(xiàn)統(tǒng)計(jì)數(shù)據(jù)可視化(statisticaldatavisualization)。該庫(kù)提供了更精美的繪圖效果和更方便快捷的數(shù)據(jù)可視化方法,目前最新版本是0.13.2(2024年07月)。新版和舊版在某些參數(shù)名上有變動(dòng),讀者學(xué)習(xí)本章時(shí)請(qǐng)升級(jí)到新版(pipinstallseaborn==0.12.2)。其0.9版本的中文文檔網(wǎng)址為

。本章代碼在0.12.2版下測(cè)試通過(guò),各代碼段首部默認(rèn)包含下述語(yǔ)句。為節(jié)省版面,后續(xù)代碼段不再列出。第1節(jié)Seaborn簡(jiǎn)介importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassns #引入seaborn,按慣例命名為snsplt.rcParams['font.sans-serif']='SimHei' #設(shè)置中文字體plt.rcParams['axes.unicode_minus']=False #設(shè)置負(fù)號(hào)顯示正常sns.__version__#0.12.2,查看seaborn版本一、Seaborn繪圖特點(diǎn)Seaborn建立在Matplotlib基礎(chǔ)之上,用很少的代碼就可以實(shí)現(xiàn)精美的繪圖效果,其改進(jìn)主要體現(xiàn)在以下方面:1.Seaborn對(duì)原Matplotlib的很多方法和參數(shù)進(jìn)行了包裝,調(diào)用更加方便,并對(duì)圖形進(jìn)行了符合現(xiàn)代繪圖風(fēng)格的美化修飾。2.Seaborn繪圖時(shí)可設(shè)置語(yǔ)義元素(hue),將不同類別的數(shù)據(jù)自動(dòng)用多子圖、不同顏色、不同符號(hào)進(jìn)行區(qū)分,不需要額外編寫代碼控制。3.Seaborn可以對(duì)數(shù)據(jù)自動(dòng)匯總計(jì)算并利用結(jié)果作圖。例如對(duì)統(tǒng)計(jì)數(shù)據(jù)自動(dòng)分類、求均值、計(jì)數(shù),極大減少了用戶的編碼量。4.Seaborn和Pandas的DataFrame對(duì)象緊密集成,只需指定列名即可繪圖。Seaborn的函數(shù)接口高度統(tǒng)一,可以由數(shù)個(gè)高級(jí)函數(shù)僅通過(guò)變動(dòng)kind圖形類型參數(shù)來(lái)調(diào)用低一級(jí)的繪圖函數(shù),諸如散點(diǎn)圖、條形圖、箱線圖等都可以用同一條繪圖命令設(shè)置不同的kind參數(shù)完成。注意:Seaborn不是用于取代matplotlib,很多繪圖細(xì)節(jié)仍需借助plt進(jìn)行設(shè)置,兩者配合工作。Seaborn用于快速成圖,plt用于設(shè)置圖形細(xì)節(jié)。Seaborn的API參考鏈接:/api.html#categorical-api

。下面以titanic(泰坦尼克)數(shù)據(jù)集為例初步展示Seaborn繪圖效果。Seaborn包含了若干示例數(shù)據(jù),詳見(jiàn)/mwaskom/seaborn-data,示例數(shù)據(jù)在使用時(shí)可實(shí)時(shí)下載。如因網(wǎng)絡(luò)原因無(wú)法下載,可將本書(shū)資源中的seaborndata.rar內(nèi)的所有.csv文件解壓至某目錄,在使用sns.load_dataset()讀數(shù)據(jù)時(shí)指定該目錄即可。本章主要使用其中的titanic、tips、iris和anscombe等數(shù)據(jù)集演示。本節(jié)代碼見(jiàn)資源包

"07.1.ipynb"文件,可用該文件配合演示。繪制客艙平均生還率對(duì)比圖如下:importseabornassns #設(shè)置繪圖主題為ticks(白色背景、無(wú)網(wǎng)格線、有刻度線)sns.set_style('ticks') #從seaborndata子目錄讀取titanic文件,返回DataFrame數(shù)據(jù)框tit=sns.load_dataset('titanic',data_home='./seaborndata')sns.catplot(x='pclass',y='survived',kind='bar',data=tit)#右圖二、繪圖示例說(shuō)明:(1)survived生還列,0未生還,1生還;pclass客艙等級(jí)列,有1、2、3三個(gè)等級(jí)。seaborn自動(dòng)按x列分組,對(duì)每組的y列求均值。相當(dāng)于y列先求所有1的和,再除以數(shù)據(jù)總條數(shù)得到平均生還率。1類艙旅客生還率最高。(2)柱狀圖上的小黑條是誤差棒,表示數(shù)據(jù)的置信區(qū)間。(3)tit=pd.read_csv('./seaborndata/titanic.csv')#用pd讀數(shù)據(jù)亦可上圖只使用了一條catplot命令就完成了按客艙分類、均值計(jì)算和繪圖的功能,由此可見(jiàn)Seaborn的高效。上面的命令在統(tǒng)計(jì)時(shí)沒(méi)有區(qū)分性別,如果想按性別分類統(tǒng)計(jì),可在命令中增加hue='sex'參數(shù)。hue在Seaborn中被稱為語(yǔ)義,可視為類別區(qū)分,不同語(yǔ)義的數(shù)據(jù)自動(dòng)用不同顏色表示,這樣可將每類客艙中的男性和女性分開(kāi)求平均生還率。ci=None表示不繪制誤差條。下圖可見(jiàn)女性生還率遠(yuǎn)高于男性。sns.catplot(x='pclass',y='survived',kind='bar',hue='sex',ci=None,data=tit)#左圖,注意hue二、繪圖示例改變kind參數(shù)可繪制不同類型的圖形。繪制各客艙旅客的年齡箱線圖如下:sns.catplot(x='pclass',y='age',kind='box',col='sex',data=tit)#右圖,kind='box'箱線圖,col參數(shù)(分列子圖)如果kind='strip'(此為默認(rèn)值)則繪制散點(diǎn)圖,見(jiàn)左下圖。繪制時(shí)每類客艙有很多旅客,Seaborn將旅客的年齡值分散顯示,各散點(diǎn)盡量不相互覆蓋,以便于觀察點(diǎn)的分布。與之相對(duì),如果用plt命令畫(huà)年齡散點(diǎn)圖,可以看到很多點(diǎn)是聚集在一起的,無(wú)法分辨,見(jiàn)右下圖。sns.catplot(x='pclass',y='age',data=tit)#年齡散點(diǎn)圖,左圖,不設(shè)kind時(shí)默認(rèn)為kind='strip'型散點(diǎn)plt.figure() #創(chuàng)建新畫(huà)布plt.scatter(x=tit.pclass,y=tit.age)#右圖,用plt命令繪散點(diǎn)圖會(huì)重疊覆蓋二、繪圖示例主題是預(yù)定義的樣式集合。Seaborn有五個(gè)預(yù)設(shè)主題:darkgrid、whitegrid、dark、white和ticks。darkgrid是默認(rèn)主題,灰色背景帶網(wǎng)格線。whitegrid白色背景帶網(wǎng)格線,dark和white主題則無(wú)網(wǎng)格線。ticks主題是白色背景無(wú)網(wǎng)格線,但顯示刻度標(biāo)記。主題可用sns.set(style='樣式名')或sns.set_style('樣式名')切換。sns.set_style('darkgrid') #darkgrid主題。該主題是默認(rèn)主題,因此亦可簡(jiǎn)寫為sns.set()三、主題樣式切換主題時(shí)會(huì)覆蓋Matplotlib的參數(shù),設(shè)置后sns和plt的繪圖命令都會(huì)受主題影響。設(shè)主題時(shí)字體會(huì)改為英文字體,導(dǎo)致中文顯示錯(cuò)誤。因此設(shè)置后,應(yīng)再執(zhí)行plt.rcParams['font.sans-serif']='SimHei'語(yǔ)句重設(shè)中文字體。sns.set_style('ticks',{'font.sans-serif':'Simhei'})#或在設(shè)置主題時(shí)同時(shí)設(shè)置中文字體繪圖命令執(zhí)行后會(huì)自動(dòng)設(shè)置坐標(biāo)軸標(biāo)簽、圖例和軸線。如需直接控制圖形的四邊軸線是否顯示可使用sns.despine()命令,該命令應(yīng)在繪圖命令之后執(zhí)行,默認(rèn)將屏蔽頂部和右側(cè)軸線,只顯示底部和左側(cè)軸線。x=np.linspace(-2*np.pi,2*np.pi,100)df=pd.DataFrame({'x':x,'y':np.sin(x)})#創(chuàng)建繪圖所需的DataFrame對(duì)象sns.set_style('white')sns.relplot(x='x',y='y',data=df,kind='scatter')sns.despine(left=True,bottom=True) #所有軸線都不顯示,True:屏蔽,False:顯示,左圖

sns.despine(top=False,bottom=False,left=False,right=False)#顯示所有軸線,右圖三、主題樣式數(shù)據(jù)中包含很多類別(category)數(shù)據(jù),例如性別、職稱、質(zhì)量等級(jí)等。在可視化時(shí),通常需要按類別分類繪制對(duì)比圖形,Seaborn繪制分類數(shù)據(jù)主要使用catplot()命令。本節(jié)代碼見(jiàn)"07.2.ipynb"文件。第2節(jié)

可視化分類數(shù)據(jù)catplot()是一條高級(jí)命令,通過(guò)指定x或y參數(shù)為一個(gè)列名實(shí)現(xiàn)自動(dòng)分類。常用參數(shù)如下表所示。一、catplot()命令總覽參數(shù)名描

述參數(shù)名描

述x/yx或y軸數(shù)據(jù)列名(必須為字符串)row/col分行/分列子圖(字符串列名)hue語(yǔ)義列(字符串)col_wrap每行最大子圖數(shù)(整數(shù))data數(shù)據(jù)源(必須參數(shù)且為DataFrame對(duì)象)ciNone:不繪制誤差條order字符串列表,規(guī)定X軸的分類數(shù)據(jù)順序kind圖形類型(字符串)height子圖高度(英寸)aspect子圖的寬度/高度之比(浮點(diǎn)數(shù))orient方向('v':垂直,'h':水平)palette調(diào)色板legendTrue顯示圖例,False不顯示legend_out默認(rèn)True:圖例顯示在外側(cè)hue_order字符串列表,規(guī)定語(yǔ)義類別的順序col_order字符串列表,規(guī)定按列生成子圖的順序seaborn繪圖命令主要分為figure-level圖級(jí)和axes-level軸級(jí)兩類。圖級(jí)命令通過(guò)設(shè)定kind參數(shù)調(diào)用低級(jí)的軸級(jí)命令完成實(shí)際繪圖。下面兩條命令完成的繪圖效果基本相同,實(shí)際上就是catplot()圖級(jí)命令通過(guò)kind='bar'的參數(shù)調(diào)用了低一級(jí)的barplot()軸級(jí)命令完成條形圖繪制。一、catplot()命令總覽sns.catplot(x='pclass',y='survived',hue='sex',kind='bar',ci=None,data=tit)#figure-levelsns.barplot(x='pclass',y='survived',hue='sex',ci=None,data=tit) #axes-levelsns.catplot(x='列名',y='列名',hue='語(yǔ)義列',col='列名',kind='圖形類型',data=df)可設(shè)定的kind:kind='strip':默認(rèn)參數(shù),strip型散點(diǎn)圖,調(diào)用sns.stripplot()完成kind='swarm':swarm型散點(diǎn)圖,調(diào)用sns.swarmplot()完成kind='box':箱線圖,調(diào)用sns.boxplot()完成kind='boxen':增強(qiáng)型箱線圖,調(diào)用sns.boxenplot()完成kind='violin':小提琴圖,調(diào)用sns.violinplot()完成kind='point':點(diǎn)圖,調(diào)用sns.pointplot()完成kind='bar':條形圖,調(diào)用sns.barplot()完成kind='count':條形計(jì)數(shù)圖,調(diào)用sns.countplot()完成要注意的是catplot()圖級(jí)命令必須含有data參數(shù),且必須是DataFrame類型,x和y參數(shù)必須是列名字符串。圖級(jí)命令支持kind(圖形類型)、col(分列子圖)、row(分行子圖)、height(子圖高度)和aspect(子圖寬度高度之比)等參數(shù),圖級(jí)命令可產(chǎn)生多子圖。對(duì)比下面兩條命令。一、catplot()命令總覽g=sns.catplot(x='pclass',y='age',kind='box',data=tit)

#正確g=sns.catplot(x=tit.pclass,y=tit.age,kind='box',data=tit)#錯(cuò)誤,x/y參數(shù)類型錯(cuò)誤,必須是字符串列名軸級(jí)命令(如stripplot()、boxplot()等)中的x和y參數(shù)可以是DataFrame數(shù)據(jù)框的字符串列名,也可以是列表或numpy數(shù)組,data參數(shù)不是必須的,支持hue參數(shù),但不支持kind、col、row、height和aspect等和子圖有關(guān)的參數(shù),軸級(jí)命令返回的ax對(duì)象就是plt中的Axes類型。對(duì)比下面三條命令。ax=sns.boxplot(x=tit.pclass,y=tit.age) #正確,x/y參數(shù)可以是Series。返回對(duì)象為Axessns.boxplot(x='pclass',y='age',data=tit) #正確,x/y參數(shù)為字符串列名或數(shù)組均可sns.boxplot(x='pclass',y='age',col='sex',kind='box',data=tit)#錯(cuò)誤,軸級(jí)命令不支持col和kind參數(shù)圖級(jí)命令執(zhí)行后的返回對(duì)象g的類型是axisgrid.FacetGrid,此類對(duì)象可包含若干圖形單元格,是由多個(gè)子圖構(gòu)成的一種組合圖形對(duì)象。g.fig屬性得到的就是Matplotlib中的Figure對(duì)象,如有需要,可引用g.fig并利用plt命令進(jìn)一步修飾圖形。初步觀察數(shù)據(jù)時(shí)最常使用散點(diǎn)圖。分類散點(diǎn)圖主要呈現(xiàn)某個(gè)類別中數(shù)據(jù)的聚集情況。下面以sns中最常用的tips小費(fèi)數(shù)據(jù)集為例演示分類散點(diǎn)圖。sns.catplot(x="day",y="total_bill",data=tips)#右圖,默認(rèn)kind='strip'二、分類散點(diǎn)圖tips=sns.load_dataset('tips',

data_home='./seaborndata')

#加載tips數(shù)據(jù)集tips.sample(2) #隨機(jī)抽取2條數(shù)據(jù)Out: total_bill tip sex smoker day time size106 20.49 4.06 Male Yes Sat Dinner 2125 29.80 4.20 Female No Thur Lunch 6數(shù)據(jù)集tips共7列,3個(gè)數(shù)值列和4個(gè)類別列,依次為total_bill(賬單金額)、tip(小費(fèi))、sex(性別)、smoker(是否吸煙)、day(星期幾,只含星期四/五/六/日)、time(用餐時(shí)段Dinner/Lunch)、size(用餐人數(shù))。數(shù)據(jù)在x軸上按星期幾分為4類,每類都有多筆賬單金額,這些數(shù)據(jù)自動(dòng)采用隨機(jī)“抖動(dòng)”以分散點(diǎn)的位置。如下軸級(jí)命令將產(chǎn)生類似的效果。sns.stripplot(x="day",y="total_bill",data=tips,jitter=0.1)參數(shù)jitter控制分散程度,值越大越分散。注意,分類散點(diǎn)圖用于展示某類的數(shù)據(jù)點(diǎn)分布,x是類別變量,1個(gè)x值對(duì)應(yīng)多個(gè)y值。如要展示x和y的一對(duì)一函數(shù)關(guān)系應(yīng)使用7.3節(jié)介紹的relplot()命令。catplot命令還支持kind='swarm'型散點(diǎn)圖,并支持col等多子圖參數(shù)。如下命令中col='smoker'參數(shù)將數(shù)據(jù)分為吸煙和不吸煙兩列子圖,更便于分類觀察。如將參數(shù)換成

row='smoker'則得到分行子圖。sns.catplot(x="day",y="tip",kind="swarm",col="smoker",data=tips) #swarm型散點(diǎn)圖,分列多子圖二、分類散點(diǎn)圖圖中可見(jiàn)星期六/日的散點(diǎn)數(shù)明顯比星期四/五多,小費(fèi)金額也高一些。星期六有幾筆小費(fèi)金額最高。上面命令繪圖時(shí),"smoker=Yes"子圖排在前面。如果想將"smoker=No"子圖排在前面,可加入col_order參數(shù)指定分列時(shí)的子圖順序。圖略,見(jiàn)代碼文件。sns.catplot(x="day",y="tip",kind='swarm',col='smoker',col_order=["No","Yes"],data=tips)#指定列序二、分類散點(diǎn)圖下面命令中order=["No","Yes"]指定在x軸上"No"非吸煙類數(shù)據(jù)排在前面。sns.catplot(x="smoker",y="tip",order=["No","Yes"],data=tips) #order指定x軸數(shù)據(jù)順序g=sns.catplot(x="total_bill",y="day",kind="swarm",data=tips)#橫向散點(diǎn)圖print(type(g.ax)) #輸出信息<class'matplotlib.axes._axes.Axes''>ax=g.ax #g.ax對(duì)應(yīng)當(dāng)前子圖對(duì)象axesax.set_title('橫向散點(diǎn)圖示例',fontsize=16) #設(shè)置titleax.set_yticklabels(['星期四','星期五','星期六','星期日']) #設(shè)置y軸刻度標(biāo)簽有時(shí)可將命令中的x/y參數(shù)互換,將類別列指定為y軸以繪制出橫向散點(diǎn)圖,尤其適用于類別名稱較長(zhǎng)或類別數(shù)較多的情況。catplot()這類figure-level圖級(jí)函數(shù)不能直接設(shè)定圖形大小,只能設(shè)定子圖的高度height和寬高比aspect,繪圖時(shí)將根據(jù)子圖數(shù)量自動(dòng)設(shè)定圖形大小。繪制后,各子圖之間的間距還可用如下指令調(diào)整。sns.catplot(x="day",y="tip",col='smoker',row='time',data=tips,height=2,aspect=0.8)plt.subplots_adjust(wspace=0.5,hspace=0.3) #調(diào)整子圖間水平和垂直間距,圖略二、分類散點(diǎn)圖上例中ax=ax參數(shù)指定stripplot()在已設(shè)定大小的ax上繪圖,該參數(shù)僅適用軸級(jí)函數(shù),對(duì)圖級(jí)函數(shù)無(wú)效。如要精確控制圖形大小,可將plt和axes-level軸級(jí)函數(shù)配合,如下所示。fig,ax=plt.subplots(figsize=(6,4)) #設(shè)定圖形大小,圖略sns.stripplot(x="day",y="tip",data=tips,ax=ax) #ax=ax,指定stripplot()在此ax上繪圖另一種設(shè)置圖形默認(rèn)大小的方式是使用sns.set()命令,如下所示。設(shè)置后,plt函數(shù)和單獨(dú)的軸級(jí)函數(shù)的圖形尺寸以此設(shè)置為默認(rèn)值。sns.set(rc={"figure.figsize":(6,4)}) #設(shè)置圖形默認(rèn)大小,影響axes-level級(jí)函數(shù)和plt函數(shù)catplot()支持兩種箱線圖,參數(shù)kind='box'繪制普通箱線圖,調(diào)用boxplot()命令完成。參數(shù)kind='boxen'繪制增強(qiáng)箱線圖,調(diào)用boxenplot()命令完成。sns.catplot(x="day",y="tip",kind='box',data=tips,height=4,aspect=1.2,palette='Set1')#左圖,箱線圖sns.catplot(x="day",y="tip",kind='boxen',data=tips,height=4,aspect=1.2) #右圖,增強(qiáng)箱線圖三、分類箱線圖和小提琴圖指令中x='day'將數(shù)據(jù)在x軸上按星期幾分為4類。普通箱線圖標(biāo)注25%,50%,75%三個(gè)分位點(diǎn),增強(qiáng)型箱線圖在兩端擴(kuò)展,標(biāo)注1/8、1/16、1/32等更多分位點(diǎn),適合大數(shù)據(jù)集。設(shè)置kind='violin'參數(shù)可將箱線圖和核概率密度圖結(jié)合起來(lái),構(gòu)成小提琴圖。小提琴圖內(nèi)部的細(xì)的黑色柱體是原來(lái)的箱體,中間的白點(diǎn)是中位數(shù),外側(cè)的曲線是概率密度曲線,兩側(cè)曲線是對(duì)稱的。整個(gè)圖形比較寬的區(qū)域表示此區(qū)域數(shù)據(jù)較密集,較窄的區(qū)域表示數(shù)據(jù)較稀疏。sns.catplot(x="day",y="tip",kind='violin',hue='smoker',data=tips,height=4,aspect=1.2)#小提琴圖三、分類箱線圖和小提琴圖命令中如添加split=True參數(shù),則將每個(gè)小提琴分為兩半,左側(cè)顯示吸煙者核密度曲線,右側(cè)顯示非吸煙者核密度曲線,以更好地對(duì)比兩者的密度分布。如上面右圖所示。catplot()命令中參數(shù)kind='bar'繪制條形圖,調(diào)用barplot()命令完成。g=sns.catplot(x="sex",y="survived",hue="class",kind="bar",data=tit,height=4,aspect=1.2,ci=None)ax=g.ax #返回當(dāng)前子圖forpinax.patches: #遍歷圖中所有條形,ha:水平居中,va:垂直底部對(duì)齊,'%.2f'2位小數(shù)

ax.text(p.get_x()+p.get_width()/2,p.get_height(),'%.2f'%p.get_height(),fontsize=12,color='blue',ha='center',va='bottom') #在條形上端標(biāo)注數(shù)值ax.set_title('sex-pclasssurviedrate',fontsize=16)四、分類條形圖上例計(jì)算并標(biāo)注了每類客艙中男性/女性的平均生還率。先遍歷ax.patches得到每個(gè)條形對(duì)象p,通過(guò)p.get_x()和p.get_height()得到每個(gè)條的x軸位置和y軸高度(y數(shù)值),再使用ax.text()將數(shù)值標(biāo)注在條的頂部,p.get_x()+p.get_width()/2調(diào)整標(biāo)注的x位置。相關(guān)計(jì)算和統(tǒng)計(jì)工作由Seaborn自動(dòng)完成,由此見(jiàn)Seaborn特別適合統(tǒng)計(jì)類數(shù)據(jù)繪圖。同時(shí),應(yīng)將Seaborn和Matplotlib配合以實(shí)現(xiàn)更精準(zhǔn)的圖形控制。將上面命令的參數(shù)改為kind='count',并刪除y參數(shù),可繪制計(jì)數(shù)條形圖,統(tǒng)計(jì)每類客艙男女生還人數(shù)。g=sns.catplot(x="sex",hue="class",kind="count",data=tit,height=4,aspect=1.2,ci=None)ax=g.axforpinax.patches: #遍歷圖中所有條形,ax.text(x坐標(biāo),y坐標(biāo),y值,字號(hào),顏色,…)ax.text(p.get_x()+p.get_width()/2,p.get_height(),p.get_height(),fontsize=12,color='blue',ha='center',va='bottom')ax.set_title('sex-pclasscount',fontsize=16) 四、分類條形圖增加col='survived'參數(shù)則可分開(kāi)統(tǒng)計(jì)每類客艙中男性/女性生還和未生還的人數(shù)。g=sns.catplot(x="sex",hue="class",kind="count",col='survived',data=tit,ci=None)forindex,axinenumerate(g.axes.ravel()): #ravel()將g.axes二維數(shù)組轉(zhuǎn)為一維數(shù)組

ifindex==0:c='blue' #"生還"藍(lán)色

title='Survived'else:c='red' #"未生還"紅色

title='Notsurvived'forpinax.patches:#在條形頂端標(biāo)注數(shù)值ax.text(p.get_x()+p.get_width()/2,p.get_height(),p.get_height(),fontsize=14,color=c,ha='center',va='bottom')ax.set_title(title,fontsize=16) 四、分類條形圖catplot()命令參數(shù)kind='point'繪制點(diǎn)圖,調(diào)用pointplot()命令完成。g=sns.catplot(x="sex",y="survived",hue="class",kind="point",data=tit,height=4,aspect=1.5)ax=g.axforindexin[0,2]: #只標(biāo)注第0和第2根線。為避免數(shù)據(jù)覆蓋,未標(biāo)注第1根線

c=ax.collections[index] #ax.collections屬性包含所有的線,按index序號(hào)取某根線

forpinc.get_offsets(): #每根線含首/尾兩點(diǎn),遍歷時(shí)p代表一個(gè)點(diǎn)的(x,y)坐標(biāo)

ax.annotate("%.2f"%p[1],(p[0]-0.15,p[1]))#p[0]:x坐標(biāo),p[1]:y坐標(biāo)五、分類點(diǎn)圖點(diǎn)圖可反映數(shù)據(jù)在不同類別中的均值變化情況。右圖按x="sex"分為兩個(gè)大類,每類又按hue="class"分為3個(gè)小類,y="survived"參數(shù)將計(jì)算各類別的平均生還率。最上方的藍(lán)色線(第0根)表示1類客艙中平均生還率由男性對(duì)應(yīng)值0.37躍升到女性對(duì)應(yīng)值0.97,中間的棕黃色線表示2類客艙中平均生還率由男性對(duì)應(yīng)值0.14左右躍升到女性對(duì)應(yīng)值0.9左右。點(diǎn)圖體現(xiàn)了按sex和class分類后,每類數(shù)據(jù)的均值變化。本節(jié)討論可視化數(shù)據(jù)集中的兩個(gè)或多個(gè)變量間的相互關(guān)系。數(shù)據(jù)是紛繁復(fù)雜的,我們希望借助圖形給出的提示幫助我們快速理清數(shù)據(jù)之間的關(guān)聯(lián)(relevant)。本節(jié)介紹另一個(gè)常用的圖級(jí)命令relplot(),其通過(guò)設(shè)定如下kind參數(shù)完成繪圖。本節(jié)代碼見(jiàn)"07.3.ipynb"文件。第3節(jié)

可視化統(tǒng)計(jì)關(guān)系kind="scatter":默認(rèn)類型散點(diǎn)圖,調(diào)用sns.scatterplot()完成kind="line":折線圖,調(diào)用sns.lineplot()完成relplot()是一條圖級(jí)命令,用于反映數(shù)據(jù)間的相關(guān)關(guān)系。下面繪制賬單額和小費(fèi)額散點(diǎn)圖。tips=sns.load_dataset("tips",data_home='./seaborndata')sns.relplot(x="total_bill",y="tip",data=tips,kind="scatter",height=4,aspect=1.2) 一、relplot散點(diǎn)圖圖中可見(jiàn)小費(fèi)額密集的區(qū)域在(2,4)之間,圖形右上角的大額小費(fèi)筆數(shù)很少。隨著賬單額的增加,小費(fèi)的總體趨勢(shì)也是增加的,兩者是一種正相關(guān)關(guān)系。此散點(diǎn)圖不同于7.2節(jié)的分類散點(diǎn)圖,此散點(diǎn)圖體現(xiàn)的是x和y之間一對(duì)一的關(guān)系。x='total_bill'有很多不同取值,此處的x不是類別數(shù)據(jù)。7.2節(jié)catplot()命令中的x和y是一對(duì)多關(guān)系,x是類別。實(shí)際使用時(shí),這兩種散點(diǎn)圖應(yīng)選擇適用的場(chǎng)景。relplot()是一條功能強(qiáng)大的繪圖命令,可對(duì)散點(diǎn)進(jìn)行語(yǔ)義顏色、標(biāo)記符號(hào)和大小的映射,體現(xiàn)出數(shù)據(jù)之間復(fù)雜的關(guān)聯(lián)。執(zhí)行下面的語(yǔ)句。sns.relplot(x="total_bill",y="tip",hue="smoker",style="sex",size="size",sizes=(60,120),col="time",data=tips)一、relplot散點(diǎn)圖參數(shù)col="time"將數(shù)據(jù)分為午餐和晚餐2個(gè)子圖,hue="smoker"將是否吸煙用兩種顏色區(qū)分,style="sex"將男性和女性的點(diǎn)用不同形狀區(qū)分,size="size"按就餐人數(shù)映射為不同大小的點(diǎn),再加上x(chóng)和y屬性,上圖中的每個(gè)點(diǎn)可以從6個(gè)屬性進(jìn)行區(qū)分。繪圖時(shí)只需指定列名即可,不需要類似Matplotlib還要編碼實(shí)現(xiàn)。與之對(duì)比,7.2節(jié)介紹的catplot()命令不支持style和size參數(shù)。relplot()是figure-level圖級(jí)函數(shù),支持col和row等子圖參數(shù)。sns.relplot(x="total_bill",y="tip",col="day",col_wrap=2,data=tips,height=3) #左圖sns.relplot(x="total_bill",y="tip",col="time",row="smoker",data=tips,height=3) #右圖一、relplot散點(diǎn)圖左圖設(shè)置col="day"參數(shù),星期四至星期日共4類,col_wrap=2參數(shù)指定每行2個(gè)子圖,所以繪制出2行2列的子圖。右圖設(shè)置了col="time"和row="smoker",分別都是2種,因此也產(chǎn)生2行2列的子圖。relplot()命令參數(shù)kind='line'繪制折線圖,調(diào)用sns.lineplot()命令完成。折線圖適合反映數(shù)據(jù)在某段時(shí)間或某個(gè)序列中的連續(xù)變化。x=np.linspace(-2*np.pi,2*np.pi,100)df=pd.DataFrame({'x':x,'y':np.sin(x)})sns.relplot(x='x',y='y',data=df,kind='line') #kind='line'折線圖#sns.lineplot(x='x',y='y',data=df) #效果同上,使用軸級(jí)函數(shù)sns.lineplot()二、relplot折線圖np.random.seed(7) x=np.repeat(np.arange(40),20) #產(chǎn)生000..111…393939序列a=np.random.uniform(9.1,9.7,size=x.size) #A產(chǎn)品數(shù)據(jù)b=np.random.uniform(8.5,9.2,size=x.size)#B產(chǎn)品數(shù)據(jù)pid=['A']*x.size+['B']*x.size #產(chǎn)品類型AAA…BBBdf=pd.DataFrame({'x':np.concatenate((x,x)),'y':np.concatenate((a,b)),'pid':pid})#df含xypid三列

sns.relplot(x='x',y='y',hue='pid',data=df,kind='line',height=4,aspect=2)二、relplot折線圖上面指令通過(guò)hue='pid'語(yǔ)義將數(shù)據(jù)分為A/B兩組。每種產(chǎn)品每天的數(shù)據(jù)有20個(gè),sns自動(dòng)計(jì)算每天的數(shù)據(jù)均值,此處的折線實(shí)際上由數(shù)據(jù)的均值點(diǎn)構(gòu)成。折線兩側(cè)的陰影表示的是均值在95%置信區(qū)間的取值范圍。上頁(yè)代碼中x和y是一對(duì)一關(guān)系,這種簡(jiǎn)單折線圖還無(wú)法體現(xiàn)Seaborn折線圖的特色。日常很多統(tǒng)計(jì)和實(shí)驗(yàn)數(shù)據(jù)中x和y是一對(duì)多的關(guān)系。例如連續(xù)若干天的實(shí)驗(yàn)數(shù)據(jù),而每天的實(shí)驗(yàn)數(shù)據(jù)又包含多個(gè)觀測(cè)值。下面模擬一個(gè)實(shí)驗(yàn)數(shù)據(jù)集,包含A、B兩種產(chǎn)品,每個(gè)產(chǎn)品含40天數(shù)據(jù),每天數(shù)據(jù)由20個(gè)隨機(jī)值構(gòu)成。Seaborn數(shù)據(jù)集一般應(yīng)為長(zhǎng)(long)數(shù)據(jù)集,有的書(shū)中也稱為整潔(tidy)格式,不應(yīng)采用寬(wide)格式。例如上面的實(shí)驗(yàn)數(shù)據(jù),A和B的數(shù)據(jù)應(yīng)縱向連接,而不應(yīng)橫向連接。數(shù)據(jù)列應(yīng)組織為['x','y','pid']的形式,而不應(yīng)組織為['x','A','B']的形式。長(zhǎng)格式才便于指定hue、style、col和row等分類參數(shù)。繪圖時(shí),寬數(shù)據(jù)集可使用Pandas的melt命令轉(zhuǎn)換為長(zhǎng)數(shù)據(jù)集,如下所示。三、長(zhǎng)-寬數(shù)據(jù)集np.random.seed(7) x=np.repeat(np.arange(40),20) #產(chǎn)生000..111…393939序列a=np.random.uniform(9.1,9.7,size=x.size) #A數(shù)據(jù)b=np.random.uniform(8.5,9.2,size=x.size) #B數(shù)據(jù)dfw=pd.DataFrame({'x':x,'A':a,'B':b}) #dfw是寬數(shù)據(jù)集,有'x','A','B'三列df2=pd.melt(dfw,id_vars=['x'],value_vars=['A','B'],var_name='pid',value_name='y')#轉(zhuǎn)為長(zhǎng)數(shù)據(jù)集

pd.melt命令中,id_vars參數(shù)對(duì)應(yīng)數(shù)據(jù)集中不需要轉(zhuǎn)換的列,value_vars參數(shù)對(duì)應(yīng)需要轉(zhuǎn)換的列,var_name是轉(zhuǎn)換后的類型列的新列名,value_name是轉(zhuǎn)換后數(shù)值列的新列名。寬轉(zhuǎn)長(zhǎng)時(shí),將要轉(zhuǎn)換的列依次取出,以“不轉(zhuǎn)換的列的值+轉(zhuǎn)換列的列名+轉(zhuǎn)換列的值”的形式構(gòu)成新的一行,在縱向不斷插入新行。dfw原有800行數(shù)據(jù),轉(zhuǎn)為長(zhǎng)格式df2后有1600行數(shù)據(jù)。反映變量的分布情況是統(tǒng)計(jì)數(shù)據(jù)繪圖中很重要的一類可視化任務(wù)。本節(jié)代碼見(jiàn)"07.4.ipynb"文件。第4節(jié)

可視化變量分布一、distplot單變量分布單變量分布聚焦于考察一個(gè)變量的分布(distribution)情況,前面章節(jié)介紹的plt.hist()命令繪制單變量分布直方圖。在Seaborn中,使用distplot()命令可視化單變量分布,參數(shù)如下表所示。參數(shù)名描

述參數(shù)名描

述a單變量數(shù)據(jù)序列fit_kws密度曲線字典參數(shù)bins直方圖分組數(shù)(整數(shù))color顏色hist默認(rèn)值True,顯示直方圖vertical默認(rèn)值False,變量值在x軸上kde默認(rèn)值True,顯示密度曲線norm_histTrue時(shí)直方圖顯示頻率而不是頻數(shù)rug默認(rèn)值False,不顯示地毯圖axlabelx軸標(biāo)簽(如為False則不顯示)hist_kws直方圖字典參數(shù)label圖例字符串rug_kws地毯圖字典參數(shù)ax指定繪制在某個(gè)axes上下面考察tips數(shù)據(jù)集中tip列的分布情況。distplot()默認(rèn)顯示hist直方圖和kde核密度曲線,如設(shè)置rug=True參數(shù),還將在底部軸線上顯示地毯圖,如下圖所示。圖形顯示小費(fèi)數(shù)據(jù)主要集中在(2,4)區(qū)間段,(8,10)區(qū)間的高額小費(fèi)很少。注:本教材付印時(shí)distplot命令在新版seaborn中將逐步廢棄,不推薦使用。推薦使用displot()這一圖級(jí)函數(shù)。一、distplot單變量分布tips=sns.load_dataset('tips',data_home='./seaborndata')sns.distplot(a=tips.tip,rug=True)#默認(rèn)會(huì)顯示hist和kde,rug=True增加地毯圖顯示

底部軸線上的地毯圖小黑線標(biāo)注了數(shù)據(jù)出現(xiàn)的位置,線條的密度表現(xiàn)了該區(qū)域數(shù)據(jù)的密集程度。圖形中的直方圖和密度曲線可分別通過(guò)hist和kde參數(shù)控制是否顯示。如設(shè)置kde=False則不顯示密度曲線,此時(shí)y軸也變?yōu)轭l數(shù),而不是頻率。distplot()是一個(gè)axes-level軸級(jí)函數(shù),用于繪制單變量分布,因此沒(méi)有x、y和data參數(shù)。數(shù)據(jù)參數(shù)只有一個(gè)a參數(shù),傳入一個(gè)數(shù)組。直方圖還可通過(guò)bins參數(shù)設(shè)定分組的數(shù)目。繪制單變量概率密度曲線還可使用kdeplot()命令,該命令只繪制密度曲線,不繪制直方圖,但包含很多密度曲線的調(diào)整參數(shù)。sns.kdeplot(tips.tip,shade=True) #shade=True密度曲線下面填充陰影,左圖sns.kdeplot(tips.tip,cumulative=True) #cumulative=True累積密度曲線,右圖一、distplot單變量分布雙變量分布考察兩個(gè)變量間的概率密度分布關(guān)系,例如廣告費(fèi)和銷售額的關(guān)系,身高和體重的關(guān)系??梢暬p變量分布可使用kdeplot()命令(kerneldensityestimation核密度估計(jì)),常用參數(shù)如下表所示。二、kdeplot雙變量分布參數(shù)名描

述參數(shù)名描

述x第1個(gè)變量序列l(wèi)abel圖例y第2個(gè)變量序列color密度曲線顏色shadeFalse,不顯示填充陰影l(fā)egend默認(rèn)值True,顯示圖例verticalFalse,單變量時(shí)數(shù)值對(duì)應(yīng)在x軸上cumulative默認(rèn)False,不累計(jì)密度曲線(適用單變量)kernel密度曲線核(默認(rèn)高斯核gau)cbarFalse,雙變量時(shí)設(shè)為True顯示顏色映射條bw密度曲線帶寬cbar_kwscbar字典參數(shù)n_levels等高線圖的輪廓數(shù)(適用雙變量)ax繪制在某個(gè)axes上kdeplot()命令如只提供一個(gè)數(shù)值序列則繪制單變量分布(如7.4.1節(jié)所示),提供兩個(gè)數(shù)值序列則繪制雙變量分布。上面的參數(shù)表要注意區(qū)分是針對(duì)單變量還是雙變量。注意,新的0.12版中該命令的形參名是x和y,舊版中的形參名是data和data2,不兼容。雙變量概率密度曲線繪制的結(jié)果是一個(gè)等高線圖,等高線的中心區(qū)域是兩個(gè)變量聯(lián)合概率密度分布最密集的區(qū)域,越往外側(cè)則密度越低。下面左圖反映單筆賬單金額注意集中在(8,20)區(qū)域,單筆小費(fèi)集中在(1.5,4)區(qū)域。二、kdeplot雙變量分布tips=sns.load_dataset('tips',data_home='./seaborndata')sns.kdeplot(data=tips,x='total_bill',y='tip')#左圖,賬單額和小費(fèi)額聯(lián)合分布sns.kdeplot(data=tips,x='total_bill',y='tip',shade=True,cbar=True)#右圖,陰影并顯示顏色映射條

繪雙變量圖時(shí)如設(shè)置shade=True添加陰影,此時(shí)就變成類似熱力圖的形式,通過(guò)顏色深淺反映密度值。雙變量分布可視化的另一常用命令是jointplot(),命令參數(shù)如下表所示。三、jointplot雙變量分布參數(shù)名描

述參數(shù)名描

述x/y兩個(gè)變量序列(字符串或數(shù)組形式)kwargs繪圖字典參數(shù)data可選參數(shù),應(yīng)為DataFramecolor顏色kind圖形類型(scatter/kde/hex/reg/resid)dropna如為True則移除x和y中的缺失值height圖形高度(此圖為正方形)space中心和側(cè)邊軸的間隔(浮點(diǎn)數(shù))ratio中心軸高度與側(cè)邊軸高度之比(小數(shù))

jointplot()默認(rèn)將繪制兩個(gè)變量的散點(diǎn)圖和各自的直方圖,并將三個(gè)圖形結(jié)合在一起,如下圖所示。圖形中間是散點(diǎn)圖,上側(cè)是x變量直方圖,右側(cè)是y變量直方圖。該命令不是圖級(jí)函數(shù),也不是軸級(jí)函數(shù),繪圖后返回的對(duì)象類型是seaborn.axisgrid.JointGrid。三、jointplot雙變量分布g=sns.jointplot(x='total_bill',y='tip',data=tips)print(type(g)) #返回的對(duì)象類型是<class'seaborn.axisgrid.JointGrid'>jointplot()命令支持5種kind,默認(rèn)值kind="scatter"表示中間的圖形繪制散點(diǎn)圖。kind='kde'繪制等高線密度曲線,kind='hex'繪制六邊型密度圖,kind='reg'繪制回歸線圖,kind='resid'繪制殘差圖。kind='kde'繪制等高線密度曲線。如果圖中的散點(diǎn)很密集,此時(shí)可選擇kind='hex'六邊形圖。這種圖是直方圖的一種變體,在圖中劃分六邊形,計(jì)算落入其中的散點(diǎn)數(shù)目,點(diǎn)數(shù)越多顏色越深。三、jointplot雙變量分布sns.jointplot(x='total_bill',y='tip',kind='kde',data=tips)#kind='kde'繪制密度曲線,左圖sns.jointplot(x='total_bill',y='tip',kind='hex',data=tips)#hex六邊形圖,右圖因?yàn)橘~單金額total_bill和小費(fèi)tip很明顯有正相關(guān)關(guān)系,通過(guò)kind='reg'參數(shù)可繪制一條線性回歸直線。三、jointplot雙變量分布sns.jointplot(x='total_bill',y='tip',kind='reg',data=tips)#kind='reg'回歸線圖,左圖sns.jointplot(x='total_bill',y='tip',kind='resid',data=tips)#kind='resid'殘差圖,右圖設(shè)置kind='resid'可繪制出在此回歸線下的殘差,即回歸值和真實(shí)值之間的差值,如右圖所示。殘差圖中的y軸不再是小費(fèi),而是誤差值。圖中間是代表誤差值為0的細(xì)線,圖左側(cè)可見(jiàn)小額賬單和小費(fèi)對(duì)應(yīng)的誤差值較小,距離0線較近;圖右側(cè)區(qū)域大額賬單和小費(fèi)對(duì)應(yīng)的誤差值較大,偏離0線較多,說(shuō)明這條回歸直線在賬單金額較小時(shí)預(yù)測(cè)較好,但大額情況下表現(xiàn)較差。前面小節(jié)繪制了一對(duì)數(shù)據(jù)的可視化圖形,如果有多對(duì)數(shù)據(jù)要交叉比較,可使用pairplot()命令。下面以鳶尾花iris數(shù)據(jù)集為例,該數(shù)據(jù)集有150條記錄,共三種鳶尾花。每條數(shù)據(jù)包含花萼(sepal)長(zhǎng)度、寬度,花瓣(petal)長(zhǎng)度、寬度4個(gè)特征值,加上花的類型共5個(gè)數(shù)據(jù)項(xiàng)。現(xiàn)在將花的4個(gè)特征值兩兩成對(duì)比較。四、pairplot繪制數(shù)據(jù)集成對(duì)關(guān)系iris=sns.load_dataset('iris',data_home='./seaborndata') sns.pairplot(iris,hue='species',markers=["^","v","o"])#散點(diǎn)圖矩陣4個(gè)特征值列,兩兩比較,產(chǎn)生16個(gè)子圖。對(duì)角線上是某個(gè)特征值和自己比較,同時(shí)又加入了hue='species'語(yǔ)義,因此對(duì)角線上就繪制每個(gè)特征值三類花的密度曲線。非對(duì)角線上的子圖就繪制某特征值和另外三個(gè)特征值兩兩配對(duì)的散點(diǎn)圖。markers=["^","v","o"]參數(shù)為三類花指定不同的散點(diǎn)形狀。圖中藍(lán)色點(diǎn)(上三角形)代表的setosa類花和另外兩種花基本可以區(qū)分開(kāi)。另兩種花中大部分的點(diǎn)可以區(qū)分,但有少量點(diǎn)混雜在一起。這樣的圖可快速選擇最相關(guān)的特征或供機(jī)器學(xué)習(xí)輔助選擇適合的特征值。回歸分析(regressionanalysis)是數(shù)據(jù)分析中的一種重要方法,回歸分析試圖找出自變量和因變量之間的函數(shù)關(guān)系。Seaborn提供了regplot()和lmplot()兩個(gè)命令來(lái)解決回歸分析的可視化問(wèn)題。其中,前者是軸級(jí)函數(shù),后者是圖級(jí)函數(shù)。五、回歸分析tips=sns.load_dataset("tips",data_home='./seaborndata')sns.regplot(x="total_bill",y="tip",data=tips)#賬單額和小費(fèi)間的回歸分析左圖中繪制了一條回歸直線,反映賬單金額和小費(fèi)之間的回歸關(guān)系。直線兩側(cè)的陰影表示此回歸方程下y的95%置信區(qū)間范圍,即均值有95%概率落在該區(qū)間內(nèi)。下面再以統(tǒng)計(jì)學(xué)中有名的anscombe四重奏數(shù)據(jù)集為例繼續(xù)討論回歸分析。該數(shù)據(jù)集含4組數(shù)據(jù),每組11條,每組中的x和y值不盡相同,但通過(guò)精心構(gòu)造,這4組數(shù)據(jù)x和y的均值和標(biāo)準(zhǔn)差均相同。五、回歸分析anscombe=sns.load_dataset('anscombe',data_home='./seaborndata')#四重奏數(shù)據(jù)集sns.lmplot(x='x',y='y',data=anscombe,col='dataset',col_wrap=2,height=3,aspect=1.2)數(shù)據(jù)集4組數(shù)據(jù)的組編號(hào)為I、II、III和IV。regplot()是軸級(jí)函數(shù),不能設(shè)置col參數(shù),無(wú)法自動(dòng)分類。要同時(shí)分組畫(huà)出四類數(shù)據(jù)集,可選擇lmplot()這個(gè)圖級(jí)函數(shù)。該示例表明在研究數(shù)據(jù)時(shí)不可盡信統(tǒng)計(jì)值,這4組數(shù)據(jù)雖然均值和標(biāo)準(zhǔn)差一樣,但實(shí)際上差別巨大,這個(gè)例子也說(shuō)明了數(shù)據(jù)可視化的重要性。(見(jiàn)下頁(yè))至此,我們學(xué)習(xí)了catplot、relplot和lmplot這三條圖級(jí)命令。掌握這三條命令并配合kind參數(shù),繪圖將非??旖荨P掳鎠eaborn中又增加了displot()這一圖級(jí)函數(shù)。#檢查每組的均值和標(biāo)準(zhǔn)差是否相同,applymap保留2位小數(shù)anscombe.groupby('dataset').agg([('均值',np.mean),('標(biāo)準(zhǔn)差',np.var)]).applymap(lambdax:'%.2f'%x)下面左圖可見(jiàn)四組數(shù)據(jù)明顯不同。第I組數(shù)據(jù)點(diǎn)比較均勻地分布在回歸直線兩側(cè),回歸效果較好。第II組數(shù)據(jù)點(diǎn)明顯對(duì)應(yīng)二次曲線,但用線性一次回歸,效果很差。第III組最上方有一個(gè)離群點(diǎn),該點(diǎn)導(dǎo)致回歸直線向上偏移。第IV組數(shù)據(jù)10個(gè)點(diǎn)的x值相同,只有一個(gè)點(diǎn)的x值不同,因?yàn)閤值相同,該組數(shù)據(jù)不適用回歸分析。第II組數(shù)據(jù)從散點(diǎn)圖上看是二次曲線,可增加order=2的參數(shù)按二次曲線回歸。第III組數(shù)據(jù)有一個(gè)異常點(diǎn),導(dǎo)致回歸直線向上偏移,設(shè)置robust=True和ci=None參數(shù),表示采用健壯回歸,回歸時(shí)剔除異常值的影響。五、回歸分析sns.regplot(x='x',y='y',data=anscombe.query('dataset=="II"'),order=2,label='dataIIorder=2')#中圖,二次曲線sns.regplot(x='x',y='y',data=anscombe.query('dataset=="III"'),robust=True,ci=None)#右圖,健壯回歸本節(jié)介紹sns中使用調(diào)色版、顏色和熱力圖等命令。本節(jié)代碼見(jiàn)"07.5.ipynb"文件。第5節(jié)

其他方法一、設(shè)置調(diào)色板Seaborn提供了一系列的顏色管理工具幫助使用者選擇最優(yōu)的配色方案。color_palette()用于生成調(diào)色板。參數(shù)palette是配色方案名或其它顏色表達(dá)形式。n_colors指定調(diào)色板中的顏色數(shù)目,默認(rèn)值6。desat和色彩飽和度有關(guān),取值范圍0~1,默認(rèn)值1對(duì)應(yīng)的顏色最深。不提供參數(shù)時(shí),該函數(shù)返回當(dāng)前調(diào)色板。pal=sns.color_palette(palette=None,n_colors=None,desat=None)#生成調(diào)色板palplot()顯示調(diào)色板,參數(shù)pal是要顯示的調(diào)色板對(duì)象,size是色塊大小。sns.palplot(pal,size=1)#顯示調(diào)色版set_palette()將palette設(shè)置為當(dāng)前調(diào)色板,設(shè)置后所有的繪圖命令都受此調(diào)色板的影響。sns.set_palette(palette,n_colors=None,desat=None)#將palette設(shè)為當(dāng)前使用的調(diào)色板一、設(shè)置調(diào)色板下面輸出觀察默認(rèn)調(diào)色板。sns.set() #此時(shí)默認(rèn)主題為darkgrid,默認(rèn)調(diào)色板為deepcur_palette=sns.color_palette() #color_palette()不帶參數(shù)時(shí),返回當(dāng)前調(diào)色板deepprint(cur_palette) #調(diào)色板其實(shí)是由RGB元組構(gòu)成的列表sns.palplot(cur_palette) #顯示deep調(diào)色板,有10種顏色如果使用plt命令繪制多根線條,不指定線條顏色,則各線條顏色就從默認(rèn)調(diào)色板中依次選擇。plt和Seaborn的顏色都受當(dāng)前調(diào)色板的控制。調(diào)色板內(nèi)容較多,請(qǐng)讀者在jupyternotebook中運(yùn)行本節(jié)配套的示例代碼。dfa=pd.DataFrame({'x':range(1,11),'y':range(4,14)})#共10個(gè)數(shù)sns.barplot(x='x',y='y',data=dfa) #10個(gè)條形默認(rèn)選用當(dāng)前調(diào)色板中的10種顏色

如繪圖時(shí)所需顏色超過(guò)默認(rèn)的10種且未指定調(diào)色板,此時(shí)Seaborn會(huì)棄用當(dāng)前調(diào)色板,自動(dòng)選用一種漸變調(diào)色板以區(qū)分眾多的條形。一、設(shè)置調(diào)色板調(diào)色板可以先用color_palette()函數(shù)創(chuàng)建,然后在繪圖命令中引用,也可用set_palette()命令設(shè)置為全局調(diào)色板,示例如下。pal=sns.color_palette("Blues",6) #自定義含6個(gè)漸變色(由淺到深)的Blues調(diào)色板palsns.barplot(x='x',y='y',data=dfa,palette=pal)#引用pal調(diào)色板,dfa數(shù)據(jù)框見(jiàn)上頁(yè)定義。下圖所示sns.set_palette(pal) #設(shè)置pal為全局調(diào)色板plt.plot([1,2],[3,4],[2,2],[3,5]) #繪2根線條,顏色受pal調(diào)色板控制。圖略一、設(shè)置調(diào)色板Seaborn預(yù)定義了140余種配色方案(在配套代碼文件中已列出),同時(shí)還支持RGB顏色和HTML網(wǎng)頁(yè)顏色。常用的調(diào)色板配色方案有:Set1、Set2、Set3、cool、spring、summer、autumn、winter、Blues、Greens、Oranges、cubehelix、Paired、gnuplot2、hls、husl、deep和bright等。在官方文檔中,將調(diào)色板大致分為三類:分類型(qualitative)、順序型(sequential)和發(fā)散型(diverging)。palstyle=['deep','muted','pastel','bright','dark','colorblind'] #輸出6個(gè)默認(rèn)分類調(diào)色板forpalinpalstyle:print(pal)sns.palplot(sns.color_palette(pal))(一)分類型調(diào)色板當(dāng)數(shù)據(jù)沒(méi)有明顯地主次或重點(diǎn)非重點(diǎn)區(qū)分時(shí),適合使用分類型調(diào)色板。例如tips中的吸煙和非吸煙者、午餐和晚餐,鳶尾花中的三類花等。分類色板只需用對(duì)比鮮明的顏色將數(shù)據(jù)區(qū)分開(kāi)即可。1.6個(gè)默認(rèn)的分類調(diào)色板上述6個(gè)調(diào)色板每個(gè)包含10種顏色。每次執(zhí)行sns.set_style()切換主題后,默認(rèn)的調(diào)色板會(huì)重設(shè)為deep。deep色板較深,pastel色板飽和度較低,bright顏色最亮,colorblind對(duì)色弱人士最友好。一、設(shè)置調(diào)色板pal=sns.color_palette("hls",15,desat=.9) #.9代表0.9飽和度,15種sns.palplot(pal)2.hls和husl分類調(diào)色板另一種常用的分類色板是hls,這是一種簡(jiǎn)單的RGB顏色變體。上面的命令創(chuàng)建并顯示了內(nèi)含15種顏色的hls色板。desat是飽和度,取值0~1,默認(rèn)值1對(duì)應(yīng)顏色最深。顏色設(shè)置中"0.9"常簡(jiǎn)寫為".9"。hls的意思就是色度、亮度和飽和度。Seaborn還提供了一個(gè)husl色板,使顏色、亮度和飽和度的間隔更加均勻,如下所示。pal=sns.palplot(sns.color_palette("husl",8))#husl色板

sns.palplot(pal)一、設(shè)置調(diào)色板sns.set_style('ticks',rc={'font.sans-serif':'Simhei'})city=pd.DataFrame({'城市':['株洲','長(zhǎng)沙','洛陽(yáng)','鄭州','珠海','廣州'],'數(shù)值':range(10,16)})pal=sns.color_palette("Paired",6) #用Paired配對(duì)色板生成含3對(duì)6個(gè)顏色值的色板sns.barplot(x='城市',y='數(shù)值',data=city,palette=pal) #指定pal調(diào)色板3.Paired配對(duì)調(diào)色板分類色板中還有一種Paired配對(duì)色板,用來(lái)強(qiáng)調(diào)一對(duì)一對(duì)的數(shù)據(jù)。例如現(xiàn)有6個(gè)城市,每2個(gè)城市來(lái)自同一個(gè)省。下圖中來(lái)自同一省份的2個(gè)城市會(huì)用同一色系的深淺兩種顏色繪制,體現(xiàn)城市之間的內(nèi)在關(guān)聯(lián)。一、設(shè)置調(diào)色板palstyle=['cool','spring','summer'] #三種預(yù)定義的順序調(diào)色板forpalinpalstyle:print(pal)sns.palplot(sns.color_palette(pal))#每個(gè)調(diào)色板內(nèi)含6種顏色(二)順序型調(diào)色板當(dāng)要展示的數(shù)據(jù)有主次或重點(diǎn)非重點(diǎn)區(qū)分時(shí),適合使用順序調(diào)色板。該類調(diào)色板一般色調(diào)變化幅度較小,但亮度和飽和度變化較大,生成同一色系或相近色系由明到暗或由暗到明的顏色,適合對(duì)應(yīng)數(shù)據(jù)由不重要到重要的變化,將人們的注意力自然吸引到數(shù)據(jù)中相對(duì)重要的部分。例如等高線密度曲線圖的中心使用深色,邊緣使用淺色以體現(xiàn)密度變化。表示疫情數(shù)據(jù)時(shí),嚴(yán)重的地區(qū)用深色表示,不嚴(yán)重的地區(qū)用淺色表示。更多內(nèi)容詳見(jiàn)配套代碼文件。一、設(shè)置調(diào)色板sns.palplot(sns.color_palette("BrBG",7)) #兩個(gè)發(fā)散型調(diào)色板,顏色數(shù)一般為奇數(shù)sns.palplot(sns.color_palette("RdBu",7)) (三)發(fā)散型調(diào)色板當(dāng)數(shù)據(jù)集的低值和高值都很重要,且數(shù)據(jù)集有明確定義的中心點(diǎn)時(shí),可選擇使用發(fā)散型調(diào)色板。此類調(diào)色板的中間顏色最淡(深),向兩端顏色逐漸加深(變淺),兩端的顏色具有相似的亮度和飽和度。例如,使用此類調(diào)色板可以很好地展示溫度相對(duì)于基準(zhǔn)溫度0的上升或下降。二、set_context設(shè)置上下文參數(shù)sns.set_context() #省略參數(shù)時(shí)默認(rèn)上下文是notebooksns.set_context("talk") #設(shè)為talk,文字和線條默認(rèn)是notebook的1.3倍sns.set_context("poster") #設(shè)為poster,文字和線條默認(rèn)是notebook的1.6倍

Seaborn除了主題設(shè)置,還有一個(gè)set_context()函數(shù)用于設(shè)置繪圖的上下文參數(shù),可設(shè)置的值只有4種:notebook、paper、talk和poster,示例如下。上下文參數(shù)影響軸上的刻度標(biāo)簽、軸標(biāo)簽、線條等圖形元素的大小,但不影響主題樣式。默認(rèn)為"notebook",設(shè)置為"paper"、"talk"和"poster"參數(shù)時(shí),其文本大小和線條粗細(xì)默認(rèn)是notebook狀態(tài)下的0.8、1.3和1.6倍。每次執(zhí)行sns.set_style()切換主題時(shí),上下文參數(shù)自動(dòng)重設(shè)為默認(rèn)值notebook。下面的代碼演示了在不同上下文參數(shù)下,同樣代碼所繪制圖形的差異。sns.set() #默認(rèn)上下文為notebooksns.lineplot(x=[1,2],y=[3,4],label='y=x') #圖略plt.figure()sns.set_context('poster') #圖略,設(shè)為poster,字體最大,線條最粗sns.lineplot(x=[1,2],y=[3,4],label='y=x')plt.figure()sns.set_context('paper') #圖略,設(shè)為paper,字體最小,線條最細(xì)sns.lineplot(x=[1,2],y=[3,4],label='y=x') 二、set_context設(shè)置上下文參數(shù)前面小節(jié)中已出現(xiàn)了多條設(shè)置命令,例如set_style()、set_palette()和set_context(),這些命令都可以統(tǒng)一到sns.set()命令中,如下所示。注:新版seaborn將sns.set改名為sns.set_theme。sns.set_style("ticks") #選擇主題sns.set_palette('Set2') #選擇調(diào)色板sns.set_context("notebook") #選擇上下文參數(shù)sns.set(style="ticks",context="notebook",palette="Set2") #效果同上面三條指令三、Facetgrid多子圖命令tips=sns.load_dataset("tips",data_home='./seaborndata')g=sns.FacetGrid(data=tips,col="time",row="smoker",height=3)#先生成一個(gè)FacetGrid對(duì)象gg.map(sns.kdeplot,'total_bill','tip')#然后g.map再調(diào)用kdeplot,在子圖內(nèi)繪制密度曲線前面介紹sns命令分為figure-l

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論