7天學會python_7天學會Python最佳可視化工具Seaborn(五):結構化展示多維數據

當探索具有中等數量(不多不少的意思……)維度的數據集時,一個很好的方式是基于不同的子數據集構建不同的實例,并將它們以網格的方式組織在一張圖之中。這種技術有時被稱為“lattice”或“trellis”(大概是格子圖、網格圖),這跟“small multiples”的概念類似(多張更小的子圖)。它能幫助我們快速從復雜的數據中提取大量信息。matplotlib對于創建帶有多個坐標軸(每個坐標軸體系意味著一張子圖)的圖形有著良好的支持,seaborn基于這些來直接地將圖形的排布結構與數據集的結構聯結起來。

要利用這些特性,我們的數據集應該保存在一個pandas DataFrame中,并且應該是Hadley Whickam口中的“tidy data”格式。簡短來說,就是我們的dataframe對象中,每一行是一個觀測樣本,每一列是一個變量。

對于一些更高級的應用來說,我們可以直接使用這篇教程中討論的一些對象來獲得最大的靈活性。一些seaborn函數(如lmplot()/catplot()/pairplot())也隱式地使用了這些對象。很多seaborn函數是坐標軸級別的,它們僅僅針對某個特定的matplotlib Axes來繪圖,而不會修改圖形的屬性;而在這篇教程中即將討論到的這些方法是更高級別的函數,在被調用時,它們會創建一個新的圖形,而且一般情況下對于創建過程更加嚴格。在某些案例中,這些函數和他們依賴的類所需要輸入的參數依賴于不同的接口屬性,比如在lmplot()中我們通過設置高度和寬高比(height和aspect)來控制每個子圖(facet)的大小,而非直接指定整個圖形的大小。這些函數在調用后都會返回這個圖形對象,而且大多數對象都提供了非常方便的方法來改變繪圖的方式,這些方法往往更加抽象和簡單。

import seaborn as snsimport matplotlib.pyplot as pltsns.set(style='ticks')

一、條件式多圖

當我們想要基于不同的數據子集來展示某個變量的分布或者多個變量之間的關系時,FacetGrid類會提供很大的幫助。一個FacetGrid圖可以從三個維度來構建:row、col和hue。前兩個與它返回的坐標軸數組有著之間的關聯;我們可以把hue變量理解為第三個維度,就像長、寬和高一樣,只不過在這里我們是用不同的顏色來體現它的。

在使用FacetGrid時,我們會通過一個pandas DataFrame以及控制圖形網格的行、列和顏色的變量名稱來初始化一個對象。這些維度變量(控制行、列和顏色的變量)應該是分類變量或者離散變量,然后這些變量的不同水平組合起來就構成了整個圖形的每一個子圖(facet,在這里可以理解為我們維度拆解的最小粒度)。比如說我們想要檢驗一下tips數據集中午餐和晚餐的差異。

另外,relplot()/catplot()/lmplot()內置了FacetGrid對象,繪圖完成后他們都會返回這個對象,這樣我們就可以進行更多的調整。

tips = sns.load_dataset('tips')g = sns.FacetGrid(tips, col='time')

150362355_1_20181224075203860

傳入數據和維度變量名稱會初始化一個網格,其中生成了基于matplotlib的圖形和坐標軸,但是不會在這些坐標軸中畫任何東西(因為我們還沒告訴它們畫什么)。

在這些網格中畫圖的主要方式是使用FacetGrid.map()方法。我們需要告訴它使用哪個繪圖函數以及使用哪些(哪個)變量。我們用直方圖來看下兩個數據子集中小費的分布情況:

g = sns.FacetGrid(tips, col='time')g.map(plt.hist, 'tip');

150362355_2_20181224075203953

這一函數的目標是一步到位地提供一幅完整的成品圖,它在完成繪圖后還會對每個坐標軸添加注釋。想要生成一個戰士變量關系的圖,只需要傳遞更多的變量名稱進去。我們還可以提供關鍵字參數,它會將他們傳遞給繪圖函數:

g = sns.FacetGrid(tips, col='sex', hue='smoker')g.map(plt.scatter, 'total_bill', 'tip', alpha=.7)g.add_legend();

150362355_3_2018122407520447

有很多選項可以傳遞給FacetGrid的構造函數,用以控制網格的樣式:

g = sns.FacetGrid(tips, row='smoker', col='time', margin_titles=True)g.map(sns.regplot, 'size', 'total_bill', color='.3', fit_reg=False, x_jitter=.1);

150362355_4_20181224075204110

需要注意的是,margin_title參數并沒有被matplotlib API提供正式支持,在某些案例中或許并不可用。比如說當圖外邊有圖例時,它是不可用的。

圖的大小是通過每張子圖的高度和寬高比來控制的:

g = sns.FacetGrid(tips, col='day', height=4, aspect=.5)g.map(sns.barplot, 'sex', 'total_bill');/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py:715: UserWarning: Using the barplot function without specifying `order` is likely to produce an incorrect plot. warnings.warn(warning)

150362355_5_20181224075204235

它默認會從DataFrame中推導分類的順序。如果用來控制某個方面(facet:維度/軸/角度,看哪個概念能幫助你理解它,你就用哪個名字)的變量是分類變量,那么分類變量的順序就會被使用。否則,seaborn會使用這些分類在數據集中出現的先后順序。當然,我們完全可以通過*_order參數直接指定某個維度變量的順序:

ordered_days = tips.day.value_counts().indexg = sns.FacetGrid(tips, row='day', row_order=ordered_days, height=1.7, aspect=4)g.map(sns.distplot, 'total_bill', hist=False, rug=True);

150362355_6_20181224075204344

我們可以指定某個seaborn調色板,也可以通過字典將hue變量中的每個分類與其對應的matplotlib顏色傳遞給函數(這樣就可以隨心所以使用大量的matplotlib支持的色彩):

pal = dict(Lunch='seagreen', Dinner='gray')g = sns.FacetGrid(tips, hue='time', palette=pal, height=5)g.map(plt.scatter, 'total_bill', 'tip', s=50, alpha=.7, linewidth=.5, edgecolor='white')g.add_legend();

150362355_7_20181224075204438

我們還可以控制hue變量的不同水平展示出來的其他樣式(方面),這些在黑白色調下(比如黑白印刷圖)對于提高圖形的可讀性尤其有用。我們需要將一個字典傳遞給hue_kws參數,在這個字典中,key(字典的鍵)是繪圖函數的關鍵字參數名稱;而value(字典的值)則是一個列表,用于存儲關鍵字參數的取值,其中每個取值對應了hue變量的一個水平。

g = sns.FacetGrid(tips, hue='sex', palette='Set1', height=5, hue_kws={'marker': ['^', 'v']})g.map(plt.scatter, 'total_bill', 'tip', s=100, linewidth=.5, edgecolor='white')g.add_legend();

150362355_8_20181224075204532

如果某個維度變量(用于col/row/hue參數的變量,之后不再說明)具有非常多的水平(level:取值),我們可以把它們分布到不同的列,然后把它們“折疊”到不同的行中。當我們使用這種操作時,我們不能設置row變量。

attend = sns.load_dataset('attention').query('subject <= 12')g="sns.FacetGrid(attend," col='subject' ,="" col_wrap="4," height="2," ylim="(0," 10))g.map(sns.pointplot,="" 'solutions',="" 'score',="" color='.3' ,="" ci="None);/anaconda3/lib/python3.7/site-packages/seaborn/axisgrid.py:715:" userwarning:="" using="" the="" pointplot="" function="" without="" specifying="" `order`="" is="" likely="" to="" produce="" an="" incorrect="" plot.="">=>

150362355_9_20181224075204610

當我們已經使用FacetGrid.map()完成了繪圖,我們可能還想對圖形的某些方面做些調整。FacetGrid支持很多在更高層級調整圖形的方法,最常用的是FacetGrid.set(),還有一些更加具體的方法比如FacetGrid.set_axis_labels(),如圖:

with sns.axes_style('white'): g = sns.FacetGrid(tips, row='sex', col='smoker', margin_titles=True, height=2.5)g.map(plt.scatter, 'total_bill', 'tip', color='#334488', edgecolor='white', lw=.5);g.set_axis_labels('Total bill (US Dollars)', 'Tip');g.set(xticks=[10, 30, 50], yticks=[2, 6, 10]);g.fig.subplots_adjust(wspace=.02, hspace=.02);

150362355_10_20181224075204735

想要做更多定制的話,我們可以直接操作更底層的Figure和Axes對象,它們存儲在FacetGrid.fig和FacetGrid.axes中,其中,FacetGrid.axes是一個二維數組。假如我們沒有指定行和列,那么我們也可以直接使用FacetGrid.ax來操作那個唯一的坐標軸:

g = sns.FacetGrid(tips, col='smoker', margin_titles=True, height=4)g.map(plt.scatter, 'total_bill', 'tip', color='#338844', edgecolor='white', s=50, lw=1)for ax in g.axes.flat: ax.plot((0, 50), (0, .2 * 50), c='.2', ls='--')g.set(xlim=(0, 60), ylim=(0, 14));

150362355_11_20181224075204844

二、使用自定義繪圖函數

使用FacetGrid時,我們并非只能使用現成的matplotlib和seaborn繪圖函數。不過,如果想要正常工作,我們的自定義函數需要滿足一下規則:它必須是一個坐標軸級別的函數(僅對當前活躍的坐標軸進行繪圖)。在matplotlib.pyplot的命名空間中存在的函數都是符合要求的,我們也可以調用plt.gca()(get current axes)來獲取符合要求的坐標軸。

它必須支持以位置參數的方式接受數據傳入。FacetGrid內部會把我們傳遞給FacetGrid.map()的多組序列數據分別傳遞給這些位置參數。

它必須支持接受關鍵字參數color和label,另外,理想情況下,它還會利用這兩個參數做一些有用的事情。在大多數情況下,接受一個關鍵字參數(**kwargs)的字典并傳遞給底層的繪圖函數是很容易的。

我們來看一個符合最低條件的例子,這個繪圖函數僅接受一組來自某個分類(子數據集)的向量型數據:

from scipy import statsdef quantile_plot(x, **kwargs): qntls, xr = stats.probplot(x, fit=False) plt.scatter(xr, qntls, **kwargs) g = sns.FacetGrid(tips, col='sex', height=4)g.map(quantile_plot, 'total_bill');

150362355_12_20181224075204922

如果我們想要繪制一個二元圖,我們需要讓函數接受兩組數據,且x軸對應的數據在前邊,y軸對應的數據在后邊:

def qqplot(x, y, **kwargs): _, xr = stats.probplot(x, fit=False) _, yr = stats.probplot(y, fit=False) plt.scatter(xr, yr, **kwargs)g = sns.FacetGrid(tips, col='smoker', height=4)g.map(qqplot, 'total_bill', 'tip');

150362355_13_201812240752050

由于plt.scatter可以接受關鍵字參數color和label并且能正確處理它們,所以我們可以毫不費力地增加一個hue參數(因為它的原理就是給不同的分類數據傳入不同的顏色參數):

g = sns.FacetGrid(tips, hue='time', col='sex', height=4)g.map(qqplot, 'total_bill', 'tip')g.add_legend();

150362355_14_2018122407520578

我們還可以通過關鍵字參數控制額外的美學設計來區分hue變量的不同水平:

g = sns.FacetGrid(tips, hue='time', col='sex', height=4, hue_kws={'marker': ['s', 'D']})g.map(qqplot, 'total_bill', 'tip', s=40, edgecolor='w')g.add_legend();

150362355_15_20181224075205188

當然,有時我們完全不想處理color和label。這種情況下我們需要顯式地接受他們,然后用自己的邏輯去處理他們。比如下邊這個使用plt.hexbin的例子,在與FacetGridAPI搭配的過程中。如果我們沒有手動調整顏色處理方式的話,它們的表現會不太好:

def hexbin(x, y, color, **kwargs): cmap = sns.light_palette(color, as_cmap=True) plt.hexbin(x, y, gridsize=15, cmap=cmap, **kwargs)with sns.axes_style('white'): g = sns.FacetGrid(tips, hue='time', col='time', height=4)g.map(hexbin, 'total_bill', 'tip', extent=[0, 50, 0, 10]);

150362355_16_20181224075205313

三、展示變量間的兩兩(成對)關系

PairGrid也支持我們以同樣的方式快速繪制多個子圖。在PairGrid中,每行每列都被分配給一個不同的變量,所以最后生成的圖片可以展示數據集中所有的成對關系。這種風格的圖形有時被稱作“散點圖矩陣”,因為散點圖是表現兩兩關系最常用的方法。不過PairGrid并不會僅僅局限于散點圖。

了解FacetGrid和PairGrid之間的區別非常重要。在FacetGrid中,每張圖表現的都是同樣的變量關系,只是每張圖對應著不同的數據子集,數據子集的劃分是由我們指定的維度變量決定的(col、row和hue),這些變量相互交叉后產生一系列最小粒度的數據子集,每個子集就對應了一張子圖,也就是說,不管是多少行、多少列還是多少顏色,它們都對應著這些維度變量的取值(水平)。而在PairGrid中,每張子圖都代表了不同的兩個變量間的關系(當然,上三角和下三角會有鏡像的關系,因為它們相當于互換了x軸和y軸)。PairGrid可以對于我們數據集中的變量關系提供一個非常快速、整體(不深入)的總結。

它的基本使用方法與FacetGrid非常類似。首先我們初始化一個網格,然后把繪圖函數傳遞給map方法,它會將我們的繪圖函數在所有的子圖中調用。與PairGrid對應的函數是pairplot(),它失去了一些靈活性,但是讓我們的繪圖更加快捷。

iris = sns.load_dataset('iris')g = sns.PairGrid(iris)g.map(plt.scatter);

150362355_17_20181224075205422

我們可以在對角線上用不同的函數來展示單變量的分布情況。不過需要注意的是,軸上的刻度與分桶計數或者密度沒有關系(因為我們已經用軸刻度去展示數據的取值了)。

g = sns.PairGrid(iris)g.map_diag(plt.hist)g.map_offdiag(plt.scatter);

150362355_18_20181224075205563

在這種圖中,我們常常會對屬于不同分類的樣本標記上不同的顏色。比如,iris數據集中有三種不同的鳶尾花,其中每個樣本都有4個特征,因此我們可以看下它們的區別在哪里。

g = sns.PairGrid(iris, hue='species')g.map_diag(plt.hist)g.map_offdiag(plt.scatter)g.add_legend();

150362355_19_20181224075205719

默認情況下,數據集中所有的數值型變量都會被使用,不過我們也可以僅選用特定的列:

g = sns.PairGrid(iris, vars=['sepal_length', 'sepal_width'], hue='species')g.map(plt.scatter);

150362355_20_20181224075205860

我們也可以分別在上三角和下三角中使用不同的函數,用以強調關系的不同角度。

g = sns.PairGrid(iris)g.map_upper(plt.scatter)g.map_lower(sns.kdeplot)g.map_diag(sns.kdeplot, lw=3, legend=False);

150362355_21_20181224075205969

事實上,這種對稱的方形網格矩陣只是一個特例,我們可以在行和列上分別使用不同的變量。

g = sns.PairGrid(tips, y_vars=['tip'], x_vars=['total_bill', 'size'], height=4)g.map(sns.regplot, color='.3')g.set(ylim=(-1, 11), yticks=[0, 5, 10]);

150362355_22_2018122407520678

當然,設計(美學)屬性都是可以配置的。比如,我們可以使用不同的調色板、可以給繪圖函數傳遞關鍵字參數。

g = sns.PairGrid(tips, hue='size', palette='GnBu_d')g.map(plt.scatter, s=50, edgecolor='white')g.add_legend();

150362355_23_20181224075206188

PairGrid很靈活,但是想要快速觀察數據特點的話,使用pairplot()更容易。這個函數默認使用散點圖和直方圖,但是也支持一些其他類型(現在我們還可以在非對角位置上畫回歸圖、在對角位置上畫KDE圖),未來還會支持更多。

sns.pairplot(iris, hue='species', height=2.5);

150362355_24_20181224075206282

在pairplot()中我們也可以通過關鍵字參數調整設計風格(美學),并且它會返回一個PairGrid對象用于更多的調整。

g = sns.pairplot(iris, hue='species', palette='Set2', diag_kind='kde', height=2.5)

150362355_25_20181224075206438

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281950.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面對峰值響應沖擊,解決高并發的三大策略

2019獨角獸企業重金招聘Python工程師標準>>> 當前在互聯網的大潮下&#xff0c;眾所周知淘寶、京東這些交易系統每天產生的數據量都是海量的&#xff0c;每天的交易并發也是驚人的&#xff0c;尤其是“雙11”、“6.18”這些活動&#xff0c;對系統的峰值響應提出了非…

.NET 采用 SkiaSharp 生成二維碼和圖形驗證碼及圖片進行指定區域截取方法實現

在最新版的 .NET 平臺中&#xff0c;微軟在逐步放棄 System.Drawing.Imaging &#xff0c;給出的理由如下&#xff1a;System.Drawing命名空間對某些操作系統和應用程序類型有一些限制。在Windows&#xff0c; System.Drawing 依賴于GDI操作系統附帶的本機庫。 某些Windows SKU…

Linux運維人員必會開源運維工具體系

新手必會用深&#xff08;8-15k&#xff09;標記&#xff0c;老鳥必會深淺藍色(15-25K)標記操作系統&#xff1a;Centos,Ubuntu,Redhat,suse,Freebsd網站服務&#xff1a;nginx,apache,lighttpd,php,tomcat,resin數據 庫&#xff1a;MySQL,MariaDB,PostgreSQLDB中間件&#x…

unity讀取Text

sing UnityEngine;using System.Collections;using System.IO; //需要導入System.IO&#xff0c;主要使用它的File類public class TextTest : MonoBehaviour { private string Mytxt; //用來存放文本內容 void Start() { Mytxt ReadFile("C:\\Users\\Admin\\Desktop\\測試…

hibernate mysql 主從_MYSQL主從復制和寫分離

基礎篇https://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19845.htmlhttps://edu.51cto.com/course/19841.htmlhttps://edu.51cto.com/course/21197.htmlhttps://edu.51cto.com/course/19886.htmlhttps://edu.51cto.com/course/19887.htmlhttps://edu.51ct…

深入剖析Redis系列(五) - Redis數據結構之字符串

前言 字符串類型 是 Redis 最基礎的數據結構。字符串類型 的值實際可以是 字符串&#xff08;簡單 和 復雜 的字符串&#xff0c;例如 JSON、XML&#xff09;、數字&#xff08;整數、浮點數&#xff09;&#xff0c;甚至是 二進制&#xff08;圖片、音頻、視頻&#xff09;&am…

全新升級的AOP框架Dora.Interception[6]: 框架設計和實現原理

本系列前面的五篇文章主要介紹Dora.Interception的編程模式以及對它的擴展定制&#xff0c;現在我們來聊聊它的設計和實現原理。目錄一、調用鏈抽象二、基于約定的攔截器定義三、基于調用上下文的依賴注入容器四、攔截器的提供五、調用鏈的構建六、方法攔截的實現原理七、依賴注…

activemq 安全連接

一、定義用戶組1.1 simpleAuthenticationPlugin通過在activemq.xml中配置用戶組<plugins> <simpleAuthenticationPlugin> <users> <authenticationUser username"admin" password"password" groups"admins,publishers,consumer…

React Native在Android當中實踐(五)——常見問題

React Native在Android當中實踐&#xff08;一&#xff09;——背景介紹 React Native在Android當中實踐&#xff08;二&#xff09;——搭建開發環境 React Native在Android當中實踐&#xff08;三&#xff09;——集成到Android項目當中 React Native在Android當中實踐&#…

完成登錄與注冊頁面的前端

完成登錄與注冊頁面的HTMLCSSJS&#xff0c;其中的輸入項檢查包括&#xff1a; 用戶名6-12位 首字母不能是數字 只能包含字母和數字 密碼6-12位 注冊頁兩次密碼是否一致 JS&#xff1a; function fnLogin() {var uSer document.getElementById("user");var pAss do…

mysql505復位密碼_mysql5 如何復位根用戶密碼[官方文檔]

如何復位根用戶密碼如果你從未為MySQL設置根用戶密碼&#xff0c;服務器在以根用戶身份進行連接時不需要密碼。但是&#xff0c;建議你為每個賬戶設置密碼如果你以前設置了根用戶密碼&#xff0c;但卻忘記了該密碼&#xff0c;可設置新的密碼。下述步驟是針對Windows平臺的。在…

WPF效果第二百零一篇之實現合并單元格

早一段時間又一次出差青海省西寧市;回來又是總結又是各種瑣事,也沒顧得上去分享點東西;大周末的就在家分享一下,這二天再次基于ListBox實現的合并單元格的效果:1、ListBox嵌套ListBox的前臺布局:<ListBox ItemsSource"{Binding LCPListData}" x:Name"Manufac…

轉載 maven 詳解 http://www.cnblogs.com/binyue/p/4729134.html

--聲明規范 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <!--聲…

ASP.NET Core中使用EasyCaching作為緩存抽象層

簡介做后端開發&#xff0c;緩存應該是天天在用&#xff0c;很多時候我們的做法是寫個幫助類&#xff0c;然后用到的時候調用一下。這種只適合簡單層次的應用&#xff1b;一旦涉及到接口實現調整之類的&#xff0c;這種強耦合的做法很不合適。有些其他的功能又要去重復造輪子。…

mysql qps如何查看_mysql狀態查看 QPS/TPS/緩存命中率查看

運行中的mysql狀態查看對正在運行的mysql進行監控&#xff0c;其中一個方式就是查看mysql運行狀態。(1)QPS(每秒Query量)QPS Questions(or Queries) / uptimemysql > show global status like Question%;mysql > show global status like uptime%;(2)TPS(每秒事務量…

visual studio開啟多核編譯方法

先按http://blog.csdn.net/acaiwlj/article/details/50240625的方法進行了VS多線程的啟動。 原本以為按以下步驟設置就OK了&#xff0c;但是編譯中無意間發些了一個warning&#xff1a;“/Gm”與多處理不兼容&#xff1b;忽略 /MP 開關&#xff01;&#xff01;&#xff01;&am…

聊聊storm nimbus的LeaderElector

為什么80%的碼農都做不了架構師&#xff1f;>>> 序 本文主要研究一下storm nimbus的LeaderElector Nimbus org/apache/storm/daemon/nimbus/Nimbus.java public static void main(String[] args) throws Exception {Utils.setupDefaultUncaughtExceptionHandler();…

Android框架式編程之BufferKnife

BufferKnife作為框架式編程的重要組成部分&#xff0c;使用BufferKnife能夠極大的精簡View層面的代碼量&#xff0c;并為MVP/MVC方式提供輔助。 一、配置 compile com.jakewharton:butterknife:(insert latest version) annotationProcessor com.jakewharton:butterknife-compi…

如果我去深圳,你會見我嗎

▲圖/ 深圳夜景初次見易小姐&#xff0c;還是21年的春節回老家的時候。想來20年因為疫情沒有回家&#xff0c;家母幾次三番電話里頭表達的思念以及建議一些不靠譜的回家計劃&#xff0c;著實有些不忍&#xff0c;確實有似“兒行千里母擔憂”之理&#xff0c;索性拿著年假和加班…

CodeForces - 1059D(二分+誤差)

鏈接&#xff1a;CodeForces - 1059D 題意&#xff1a;給出笛卡爾坐標系上 n 個點&#xff0c;求與 x 軸相切且覆蓋了所有給出點的圓的最小半徑。 題解&#xff1a;二分半徑即可。判斷&#xff1a;假設當前二分到的半徑是 R &#xff0c;因為要和 x 軸相切&#xff0c;所以圓心…