文章目錄
- seaborn(一)——可視化統計量間的關係(relationship)
- sns.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')
圖上有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)
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)
size: 可用來控制線條寬度
也可以用size表達coherence
相關性越大,線條越粗
sns.relplot(x="time", y="firing_rate", size="coherence", style="choice", kind="line", data=dots)
用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()#日期的排列根據圖像的大小自適應
三、使用子圖展示多重關係
參數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)
sns.relplot(x="total_bill", y="tip", row="smoker", data=tips)
sns.relplot(x="total_bill", y="tip", row="smoker", col="sex", data=tips)
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)