在关系图教程中,我们了解了如何使用不同的可视化表示来显示数据集中多个变量之间的关系。在这些例子中,我们关注的主要关系是两个数值变量之间的情况。如果其中一个主要变量是“分类”(分为不同的组),那么使用更专业的可视化方法可能会有所帮助。
下面所有函数的最高级别的整合接口:catplot()
Categorical scatterplots:
Categorical distribution plots:
Categorical estimate plots:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
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)
相当于swarmplot()
避免了散点之间的重合,提供更好的方式来呈现观测点的分布。
但仅适用于较小的数据集。
sns.catplot(kind="swarm", x="day", y="tip", data=tips)
与关系图类似,也可以通过hue来增加一个维度。BUT分类图不支持size和style
sns.catplot(kind="swarm", x="day", y="tip", hue="sex", data=tips)
关于x(分类型数据)轴的分类值的顺序,函数会自己推断。
如果数据是pandas的Categorical类型,那么默认的分类顺序可以在pandas中设置;
如果数据看起来是数值型的(比如1,2,3…),那他们也会被排序。
即使我们使用数字作为不同分类的标签,它们仍然是被当做分类型数据按顺序绘制在分类变量对应的坐标轴上的:
# 注意,2和4之间的距离与1和2之间的距离是一样的,它们是不同的分类,只会排序,但是并不会改变它们在坐标轴上的距离
sns.catplot(x="size", y="tip", kind="swarm", data=tips.query("size!=3"))
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);
当数据量越来越大时,散点图在表现不同分类的观测值的分布信息就越来越捉襟见肘了。
此时,有其他的方式:
展现了:离群点、上界、上四分位数、均值、中位数、下四分位数、下界、离群点
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)
与箱线图相似但是能展示更多关于数据分布形状的信息,它对大数据更加友好:
sns.catplot(kind="boxen", x="day", y="total_bill", data=tips)
它将箱线图和核密度估计(kde: kernel density estimation)结合起来
sns.catplot(kind="violin", y="day", x="total_bill",hue="time", data=tips)
当一个额外的分类变量仅有2个水平时,我们也可以将它赋给hue参数,并且设置split=True,这样我们可以更加充分地利用空间来表达更多信息:
sns.catplot(kind="violin", y="day", x="total_bill",hue="time",split=True, data=tips)
在某些应用场景中,相对于展示每类的分布情况,更像展示每类的数据的集中趋势估计(统计量,如均值、中位数、方差等)。
有以下方式:
在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)
可以清晰明了地看出来:
女性幸存者高于男性;
舱级高的幸存者高于舱级低的。
“属于分类变量而非连续变量的直方图”
想要展示每个分类下观测值(样本)的数量而非统计量。这就像是“属于分类变量而非连续变量的直方图”。
仅给一个轴哦(要水平方向画就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