文章目錄
catplot(): 用分類型數據(categorical data)繪圖
在關係圖教程中,我們瞭解瞭如何使用不同的可視化表示來顯示數據集中多個變量之間的關係。在這些例子中,我們關注的主要關係是兩個數值變量之間的情況。如果其中一個主要變量是“分類”(分爲不同的組),那麼使用更專業的可視化方法可能會有所幫助。
-
下面所有函數的最高級別的整合接口:catplot()
-
Categorical scatterplots:
- stripplot() (with kind=“strip”; the default)
- swarmplot() (with kind=“swarm”)
-
Categorical distribution plots:
- boxplot() (with kind=“box”)
- violinplot() (with kind=“violin”)
- boxenplot() (with kind=“boxen”)
-
Categorical estimate plots:
- pointplot() (with kind=“point”)
- barplot() (with kind=“bar”)
- countplot() (with kind=“count”)
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
一、分類散點圖
“分類座標軸”
1.catplot(kind=“strip”)默認
tips= sns.load_dataset("tips")
print(tips.head())
print(tips.dtypes)
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
total_bill float64
tip float64
sex category
smoker category
day category
time category
size int64
dtype: object
當在同一個類別中出現大量取值相同或接近的觀測數據時,他們會擠到一起。seaborn中有兩種分類散點圖,分別以不同的方式處理了這個問題。
catplot()使用的默認方式是stripplot(),它給這些散點增加了一些隨機的偏移量,更容易觀察:
sns.catplot(x="day", y="total_bill", data=tips)
jitter參數控制着偏移量的大小,或者我們可以直接禁止他們偏移:
sns.catplot(x="day", y="tip", jitter=False,data=tips)
2、蜂羣圖:catplot(kind=“swarm”)
相當於swarmplot()
避免了散點之間的重合,提供更好的方式來呈現觀測點的分佈。
但僅適用於較小的數據集。
sns.catplot(kind="swarm", x="day", y="tip", data=tips)
hue參數:利用不同顏色區分
與關係圖類似,也可以通過hue來增加一個維度。BUT分類圖不支持size和style
sns.catplot(kind="swarm", x="day", y="tip", hue="sex", data=tips)
<seaborn.axisgrid.FacetGrid at 0x1e2b2eb8>
關於x(分類型數據)軸的分類值的順序,函數會自己推斷。
如果數據是pandas的Categorical類型,那麼默認的分類順序可以在pandas中設置;
如果數據看起來是數值型的(比如1,2,3…),那他們也會被排序。
即使我們使用數字作爲不同分類的標籤,它們仍然是被當做分類型數據按順序繪製在分類變量對應的座標軸上的:
# 注意,2和4之間的距離與1和2之間的距離是一樣的,它們是不同的分類,只會排序,但是並不會改變它們在座標軸上的距離
sns.catplot(x="size", y="tip", kind="swarm", data=tips.query("size!=3"))
order參數:指定分類值順序
sns.catplot(kind="swarm",x="size", y="tip", order=[6,5,4,3,2,1],data=tips.query("size!=3"))
sns.catplot(kind="swarm", x="smoker",y="tip", order=["No","Yes"], data=tips)
有些時候把分類變量放在垂直座標軸上會更有幫助(尤其是當分類名稱較長或者分類較多時)
只需要交換x和y分配的變量即可:
sns.catplot(x="total_bill", y="day", hue="time", kind="swarm", data=tips);
二、分類分佈圖
當數據量越來越大時,散點圖在表現不同分類的觀測值的分佈信息就越來越捉襟見肘了。
此時,有其他的方式:
- 箱線圖:catplot(kind=“box”)
- 小提琴圖:catplot(kind=“violin”)
1.箱線圖:catplot(kind=“box”)
展現了:離羣點、上界、上四分位數、均值、中位數、下四分位數、下界、離羣點
sns.catplot(kind="box", x="day", y="total_bill", data=tips)
增加一個維度的信息:
sns.catplot(kind="box", x="day", y="total_bill", hue="smoker", data=tips)#增加一個維度的信息
上面的圖中,默認了hue參數對應的變量smoker與座標軸上的分類變量day是相互嵌套的(如,週四吸菸、週四不吸菸),這種操作叫**“dodging”**。
如果不是這種情形,應該禁用dodging,看下面的例子:
hue的Weekend和day不是相互嵌套的:
× 錯誤的圖:
tips["Weekend"]= tips["day"].isin(["Sat","Sun"])
sns.catplot(kind="box", x="day", y="total_bill", hue="Weekend", data=tips)
√ 正確的圖(禁用dodge,dodge=False):
sns.catplot(kind="box", x="day", y="total_bill", hue="Weekend",dodge=False, data=tips)
box的進階:catplot(kind=“boxen”)
與箱線圖相似但是能展示更多關於數據分佈形狀的信息,它對大數據更加友好:
sns.catplot(kind="boxen", x="day", y="total_bill", data=tips)
2.小提琴圖:catplot(kind=“violin”)
它將箱線圖和核密度估計(kde: kernel density estimation)結合起來
sns.catplot(kind="violin", y="day", x="total_bill",hue="time", data=tips)
參數split=Ture
當一個額外的分類變量僅有2個水平時,我們也可以將它賦給hue參數,並且設置split=True,這樣我們可以更加充分地利用空間來表達更多信息:
sns.catplot(kind="violin", y="day", x="total_bill",hue="time",split=True, data=tips)
三、分類統計估計圖
在某些應用場景中,相對於展示每類的分佈情況,更像展示每類的數據的集中趨勢估計(統計量,如均值、中位數、方差等)。
有以下方式:
- 條形圖:catplot(kind=“bar”)
- 直方圖:catplot(kind=“count”)
- 點圖:catplot(kind=“point”)
1.條形圖:catplot(kind=“bar”)
在seaborn中,barplot()函數在整個數據集上運行,並且應用一個函數來獲得那些統計量(默認爲均值)。當每個分類中有多個觀測值時,它還可以通過自助採樣法計算出一個置信區間,並且通過誤差棒的方式繪製出來。
titanic = sns.load_dataset("titanic")
print(len(titanic))
titanic.head()
survived | pclass | sex | age | sibsp | parch | fare | embarked | class | who | adult_male | deck | embark_town | alive | alone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 3 | male | 22.0 | 1 | 0 | 7.2500 | S | Third | man | True | NaN | Southampton | no | False |
1 | 1 | 1 | female | 38.0 | 1 | 0 | 71.2833 | C | First | woman | False | C | Cherbourg | yes | False |
2 | 1 | 3 | female | 26.0 | 0 | 0 | 7.9250 | S | Third | woman | False | NaN | Southampton | yes | True |
3 | 1 | 1 | female | 35.0 | 1 | 0 | 53.1000 | S | First | woman | False | C | Southampton | yes | False |
4 | 0 | 3 | male | 35.0 | 0 | 0 | 8.0500 | S | Third | man | True | NaN | Southampton | no | True |
sns.catplot(kind="bar", x="sex", y="survived", hue="class", data=titanic)
可以清晰明瞭地看出來:
女性倖存者高於男性;
艙級高的倖存者高於艙級低的。
2、catplot(kind=“count”):展示每個分類下觀測值的數量
“屬於分類變量而非連續變量的直方圖”
想要展示每個分類下觀測值(樣本)的數量而非統計量。這就像是“屬於分類變量而非連續變量的直方圖”。
僅給一個軸哦(要水平方向畫就x:你的分類變量;垂直方向就y:你的分類變量),另一個軸默認爲count了:
如,展示買各個class票的人數:
sns.catplot(kind="count", x="class",data=titanic)
sns.catplot(kind="count", x="class", hue="alive",data=titanic)
#也可以將連續型變量當成分類型變量
sns.catplot(kind="count", y="size",data=tips,color='c')
使用子圖展示多重關係
仍然是參數row、col