詳細的數據可視化庫之Seaborn教程(一)——relplot:關係圖(可視化統計量間的關係)

seaborn(一)——可視化統計量間的關係(relationship)

seaborn關注的是統計量之間的關係。
x,y一般爲數值型數據,關注兩個數值變量之間的關係

可以繪製出曲線圖和散點圖

sns.relplot()

  • relplot():
    • sns.replot(kind=“scatter”),相當於scatterplot() 用來繪製散點圖
    • sns.replot(kind=“line”),相當於lineplot() 用來繪製曲線圖

本例中,我們的數據集採用庫自帶的小費數據集tips。
tips小費數據集:
是一個餐廳服務員收集的小費數據集,包含了7個變量:
總賬單、小費、顧客性別、是否吸菸、日期、吃飯時間、顧客人數

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

tips= sns.load_dataset("tips")
tips.head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
tips.dtypes
total_bill     float64
tip            float64
sex           category
smoker        category
day           category
time          category
size             int64
dtype: object

replot常用參數
x: x軸
y: y軸
hue: 在某一維度上,用顏色區分
style: 在某一維度上, 用線的不同表現形式區分, 如 點線, 虛線等
size: 控制數據點大小或者線條粗細
col: 列上的子圖
row: 行上的子圖
kind: kind= ‘scatter’(默認值)
   kind='line’時候,可以通過參數ci:(confidence interval)參數,來控制陰影部分,如,ci=‘sd’ (一個x有多個y值)
   也可以關閉數據聚合功能(urn off aggregation altogether), 設置estimator=None即可
data

以下,結合具體使用效果來理解一下。

一、散點圖:relplot(kind=“scatter”)

replot出的圖默認爲散點圖。

sns.relplot(x='total_bill', y='tip', data=tips)

在這裏插入圖片描述
可視化後,可以看出:
給的小費大小集中在[0,6]
賬單集中在[7,36]

可以看出,消費高的小費多。


參數hue

hue
用不同的顏色區分出來
在smoker維度,smoker:取值有:No、Yes 藍yes橙no

sns.relplot(x='total_bill', y='tip',  data=tips, hue='smoker')
<seaborn.axisgrid.FacetGrid at 0x392c25f8>

在這裏插入圖片描述

圖上有3個維度的信息:
total_bill(x)、tip(y)、smoker(不同顏色)

hue+ hue_order

可以通過hue_order(一個list)來控制圖例中hue的順序。如果不設置的話,就會自動根據data來進行設定。
如果hue是數字型連續值,hue_order就沒有什麼關係了。


hue+palette

palette自定義顏色範圍

set(tips.day) #    {'Fri', 'Sat', 'Sun', 'Thur'}
sns.relplot(x='total_bill', y='tip',  data=tips, hue='day')

在這裏插入圖片描述

sns.relplot(x='total_bill', y='tip',  data=tips, hue="day", palette="ch:r=-.5,l=.75")

在這裏插入圖片描述

跟哪天吃飯好像沒什麼關係,看不出來一個漸變色的走勢。


參數style

style
不同的表示形狀上區分
性別維度上,不同的性別, 原點:Male 叉叉:Female

sns.relplot(x='total_bill', y='tip',  data=tips, style='sex')

png

圖上有3個維度的信息:
total_bill、tip、sex
x、y、不同形狀

可以看出,給小費的男性多,男性給的小費高一點,是不是?你還可以看出來什麼信息呢?


hue+style

hue+style
抽菸的女性:藍色+叉叉
抽菸的男性:藍色+原點
不抽菸的女性:橘色+叉叉
不抽菸的男性:橘色+原點

sns.relplot(x='total_bill', y='tip',  data=tips, hue='smoker', style='sex')

在這裏插入圖片描述

圖上有4個維度的信息了:
total_bill、tip、smoker、sex
x、y、不同顏色、不同形狀

看出了什麼?
給高小費的(超過5的),竟然大都是不抽菸的男性(橘色+原點)


參數size

控制點的大小或者線條粗細
巧妙引入size維度(顧客人數)信息

sns.relplot(x='total_bill', y='tip', data=tips, hue='smoker', style='sex', size='size')

在這裏插入圖片描述

圖上有5個維度的信息了

圖上可以看出,人多消費大,消費大小費高
你還看出了什麼呢?
展示的信息量太多了,太豐富了,這個圖反而太複雜而讓我們不好解析它了

sns.relplot(x='total_bill', y='tip', data=tips,size='size')

set(tips['size'])#size的取值(顧客數)有:1,2,3,4,5,6人

在這裏插入圖片描述

size+sizes

如用size=(20,200)控制size的範圍

sns.relplot(x='total_bill', y='tip', data=tips, size="size", sizes=(20, 200))

在這裏插入圖片描述



二、曲線圖:relplot(kind=“line”)

數據集爲fmri

fmri= sns.load_dataset("fmri")
fmri.head()
subject timepoint event region signal
0 s13 18 stim parietal -0.017552
1 s5 14 stim parietal -0.080883
2 s12 18 stim parietal -0.081033
3 s11 18 stim parietal -0.046134
4 s10 18 stim parietal -0.037970
fmri.dtypes
subject       object
timepoint      int64
event         object
region        object
signal       float64
dtype: object
set(fmri.region)  #    {'frontal', 'parietal'}

#如何將object轉成category類型:
fmri['region']=fmri['region'].astype('category')

fmri.region.dtype
CategoricalDtype(categories=[u'frontal', u'parietal'], ordered=False)

先用散點圖看一下它的數據分佈情況:

sns.relplot(x="timepoint", y="signal", data=fmri)

在這裏插入圖片描述

kind=“line”

kind=“line” 就是lineplot()

一個x有多個y,怎麼聚合呢?默認的是aggregate the multiple measurements at each x value by plotting the mean and the 95% confidence interval around the mean:

sns.relplot(x="timepoint", y="signal", data=fmri, kind="line")

在這裏插入圖片描述

ci=None 控制不顯示聚合的陰影

sns.relplot(x="timepoint", y="signal", data=fmri, kind="line", ci=None)

在這裏插入圖片描述

ci=“sd” 控制聚合的算法

sns.relplot(x="timepoint", y="signal", data=fmri, kind="line", ci="sd")

在這裏插入圖片描述

關閉聚合:estimator= None

展示其數據最原始的情形,“曲線版的散點圖”:

sns.relplot(x="timepoint", y="signal", data=fmri, kind="line",estimator=None)

在這裏插入圖片描述

hue:利用顏色區分

sns.relplot(x="timepoint", y="signal", data=fmri, kind="line",hue="event")

在這裏插入圖片描述

style:利用形狀區分

sns.relplot(x="timepoint", y="signal", style="region", kind="line", data=fmri)

在這裏插入圖片描述

hue+ style

sns.relplot(x="timepoint", y="signal", hue="event", style="region", kind="line", data=fmri)

在這裏插入圖片描述

style結合dashes+markers可設置不同分類的標記樣式

sns.relplot(x="timepoint", y="signal", hue="event", style="region", kind="line", dashes=False, markers=True, data=fmri)

在這裏插入圖片描述

units: ??我沒有明白這個

當有多次的採樣單位時,可以單獨繪製每個採樣單位,而無需通過語義區分它們。這可以避免使圖例混亂。
說了這麼多還是沒有明白。。。。。

set(fmri.subject)
sns.relplot(kind="line",data=fmri.query("event=='stim'"), x="timepoint", y="signal", hue="region", units="subject",estimator=None)

png

lineplot色調和圖例的處理還取決於hue是分類型數據or連續型數據

hue爲連續型數值

dots= sns.load_dataset("dots").query("align== 'dots'")
print(dots.head())
print(dots.dtypes)
  align choice  time  coherence  firing_rate
0  dots     T1   -80        0.0    33.189967
1  dots     T1   -80        3.2    31.691726
2  dots     T1   -80        6.4    34.279840
3  dots     T1   -80       12.8    32.631874
4  dots     T1   -80       25.6    35.060487
align           object
choice          object
time             int64
coherence      float64
firing_rate    float64
dtype: object

相關性coherence是連續型數值
看看圖例看看顏色:
顏色越重的相關性越強

sns.relplot(x="time", y="firing_rate", hue="coherence", style="choice", kind="line", data=dots)

png

size: 可用來控制線條寬度

也可以用size表達coherence
相關性越大,線條越粗

sns.relplot(x="time", y="firing_rate", size="coherence",  style="choice", kind="line", data=dots)

png


用date數據畫圖

data.head()
date date_block_num shop_id item_id item_price item_cnt_day
0 2013-01-02 0 59 22154 999.00 1.0
1 2013-01-03 0 25 2552 899.00 1.0
2 2013-01-05 0 25 2552 899.00 -1.0
3 2013-01-06 0 25 2554 1709.05 1.0
4 2013-01-15 0 25 2555 1099.00 1.0

seaborn結合matplotlib的xlim()和ylim()設置座標範圍

g= sns.relplot(x="date", y="item_cnt_day", data=data)

#設置x軸 y軸範圍:
plt.xlim("2014-01","2014-12")
plt.ylim(0,600)
#設置x軸 y軸刻度:
#plt.xticks=

g.fig.autofmt_xdate()#日期的排列根據圖像的大小自適應

png

三、使用子圖展示多重關係

參數col、row可以幫助我們實現。
col=“sex” 有幾種sex,就有幾列圖(2種male和female,2列圖)
row=“smoker” 有幾種smoker,就有幾行圖
col=“subject”, col_wrap=3 subject特別多,可以控制顯示的圖片的行數

sns.relplot(x="total_bill", y="tip", col="sex", data=tips)

png

sns.relplot(x="total_bill", y="tip", row="smoker", data=tips)

png

sns.relplot(x="total_bill", y="tip", row="smoker", col="sex", data=tips)

png

sns.relplot(x="timepoint", y="signal", 
            hue="event", style="event",
            col="subject", col_wrap=3, 
            data=fmri.query("region=='frontal'"), 
            kind="line",
            linewidth=2.5,
            aspect=1, #長寬比,該值越大圖片越方
            height=3)

png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章