文章目录
- 可视化数据的分布
- 绘制单变量分布
- 绘制双变量分布
- 绘制成对的双变量分布
- 用分类数据绘图
- 类别散点图
- 通过stripplot()函数画散点图
- swarmplot()函数
- 类别内的数据分布
- 绘制箱型图
- 绘制提琴图
- 类别内的统计估计
- 绘制条形图
- 绘制点图
可视化数据的分布
绘制单变量分布
一般采用最简单的直方图描述单变量的分布情况。Seaborn中提供了displot()函数。
distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None,
hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None,
color=None, vertical=False, norm_hist=False, axlabel=None,
label=None, ax=None)
上述函数中常用的参数含义如下:
- a:表示要观察的数据,可以是Sries、一维数组或列表
- bins:用于控制条形的数量
- hist:接收布尔类型,表示是否绘制(标注)直方图
- kde:接收布尔类型,表示是否绘制高斯核密度估计曲线
- rug:接收布尔类型,表示是否在支持的轴的方向上绘制rugplot
通过distplot()函数绘制直方图:
import seaborn as sns
import numpy as npsns.set() # 显式调用set()获取默认绘图
np.random.seed(0) # 确定随机数生成器的种子
arr = np.random.randn(100) # 生成随机数组
ax = sns.distplot(arr, bins=10) # 绘制直方图
输出结果:
由图可得,直方图共有10个条柱,每个条柱的颜色为蓝色,并且拥有核密度估计曲线。核密度估计是在概率论中用来估计未知的密度函数,属于非参数检验方法之一,可以比较直观地看出数据样本本身的分布特征。
如果想要仅拥有核密度估计曲线,设置相关参数即可:
arr_random = np.random.randint(0, 100, 500) # 绘制包含500个位于[0, 100)之间的随机整数数组
sns. distplot(arr_random, hist=False, rug=True) # 绘制核密度估计曲线
输出结果:
绘制一条核密度估计曲线,并且在x轴的上方生成了观测数值的小细条。
注意:如果希望Seaborn用Matplotlib的默认样式,之前可以通过从Seaborn库中导入apionly模块解决这个问题,但是从2017年7月起这个方法已经被弃用了。因此,现在导入Seaborn时,需要显式地调用set()或set_style()、set_context()和set_palette()中的一个或多个函数,以获取Seaborn或者Matplotlib默认的绘图样式。
拟合并绘制核密度估计曲线还可以使用kedeplot()函数
绘制双变量分布
两个变量的二元分布可视化可以显示两个变量之间的双变量关系以及每个变量在单独坐标轴上的单变量分布。
jointplot(x, y, data=None, kind=“scatter”, stat_func=None,
color=None, height=6, ratio=5, space=.2,
dropna=True, xlim=None, ylim=None,
joint_kws=None, marginal_kws=None, annot_kws=None, **kwargs)
上述函数中常用参数的含义如下:
- kind:表示绘制图形的类型
- stat_func:用于计算有关关系的统计量并标注图
- size:用于设置图的大小(正方形)
- ratio:表示中心图与侧边图的比例。该参数的值越大,则中心图的占比会越大。
- space:用于设置中心图与侧边图的间隔大小。
- xlim,ylim:表示x、y轴的范围。
绘制散点图:
dataframe_obj = pd.DataFrame({"x": np.random.randn(500),"y": np.random.randn(500)}) # 创建DataFrame对象
sns.jointplot(x="x", y='y', data=dataframe_obj) # 绘制散点图
输出结果:
x轴的名称为“x”,y轴的名称为“y”,两轴的数据均为500个随机数。可以看到的是散点图的上方和右侧增加了直方图,便于观察x和y轴数据的整体分布情况,并且它们的均值都是0。
绘制二维直方图:
dataframe_obj = pd.DataFrame({"x": np.random.randn(500),"y": np.random.randn(500)}) # 创建DataFrame对象
sns.jointplot(kind='hex', data=dataframe_obj, x='x', y='y') # 绘制二维直方图
输出结果:
从六边形颜色的深浅,可以观察到数据密集的程度,图形的上方和右侧依然给出了直方图。
注意: 绘制二维直方图时最好是用白色背景以便观察六边形颜色深浅。
绘制核密度估计图形:
利用核密度估计同样可以查看二元分布,Seaborn中用等高线图来表示。
sns.jointplot(kind='kde', x='x', y='y', data=dataframe_obj) # 绘制核密度估计图形
输出结果:
绘制了核密度的等高线图,通过观察等高线的颜色深浅,可以看出哪个范围的数值分布的最多,哪个范围的数值分布的最少。同样的,在图形的上方和右侧给出了核密度曲线图。
绘制成对的双变量分布
要想在数据集中绘制成对的双变量分布,则可以使用pairplot()函数实现,该函数会创建一个坐标轴矩阵,并显示DataFrame对象中每对变量的关系。该函数亦可绘制每个变量在对角轴上的单变量分布。
代码如下:
通过load_dataset()函数加载了seaborn中内置的数据集,根据tips数据集绘制多个双变量分布。【如无法正确运行,则在这里下载zip文件,然后在电脑中,使用搜索功能找到seaborn-data文件夹,将zip文件解压到文件夹中,具体步骤如下图:】
dataset = sns.load_dataset("tips") # 加载seaborn中的数据集
sns.pairplot(dataset) # 绘制多个成对的双变量分布
输出结果:
用分类数据绘图
类别散点图
stripplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,
jitter=True, dodge=False, orient=None, color=None, palette=None,
size=5, edgecolor=“gray”, linewidth=0, ax=None, **kwargs)
上述函数中常用参数如下:
- x,y,hue:用于绘制长葛市数据的输入。
- data:用于绘制的数据集。如果x和y不存在,则它将作为宽格式,否则将作为长格式。
- order,hue_order:用于绘制分类的级别。
- jitteer:表示抖动的程度(仅沿类别轴)。当很多数据点重叠时,可以指定抖动的数量,或者设为True使用默认值。
通过stripplot()函数画散点图
代码如下:
tips = sns.load_dataset("tips")
sns.stripplot(x='day', y='total_bill', data=tips)
输出结果:
从图中可以看出,图标横坐标时分类的数据,而且一些数据点会互相重叠,不易于观察。可以在调用stripplot()函数时传入jitter参数,以调整横坐标的位置。
改变横坐标的位置:
tips = sns.load_dataset("tips")
sns.stripplot(x='day', y='total_bill', data=tips, jitter=True)
输出结果:
swarmplot()函数
亦可使用swarmplot()函数绘制散点图,该函数的好处是所有的数据点都不会重叠,可以很清晰地观察到数据的分布情况。
代码如下:
tips = sns.load_dataset("tips")
sns.swarmplot(x='day', y='total_bill', data=tips)
输出结果:
类别内的数据分布
由于散点图查看各个分类中的数据分布不够直观,故可利用下列两种图形查看:
- 箱型图:直观地查看数据的四分位分布(1/4分位,中位数,3/4分位以及四分位距)
- 提琴图:箱型图与核密度图地的结合,可以展示任意位置的密度,可以很直观地看到哪些位置的密度较高
绘制箱型图
boxplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,
orient=None, color=None, palette=None, saturation=.75,
width=.8, dodge=True, fliersize=5, linewidth=None,
whis=1.5, ax=None, **kwargs)
上述函数常用参数如下:
- orient:表示数据垂直或水平显示,取值为“v”|“h”
- palette:用于设置不同级别色相的颜色变量。
- saturation:用于设置数据显示的颜色饱和度。
代码如下:
tips = sns.load_dataset("tips")
sns.boxplot(x='day', y='total_bill', data=tips)
输出结果:
x轴的名称为day,刻度范围是Thur ~ Sun(周四至周日),y轴的名称为total_bill,刻度范围为10 ~ 50左右。
从图中可以看出,Thur列、Fri列中大部分数据都小于30,但Thur列有5个异常值大于30、Fri列中有1个异常值大于40;Sat列中有3个大于40的异常值;Sun列中有两个大于40的异常值。
绘制提琴图
violinplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,
bw=“scott”, cut=2, scale=“area”, scale_hue=True, gridsize=100,
width=.8, inner=“box”, split=False, dodge=True, orient=None,
linewidth=None, color=None, palette=None, saturation=.75,
ax=None, **kwargs)
代码如下:
tips = sns.load_dataset("tips")
sns.violinplot(x='day', y='total_bill', data=tips)
输出结果:
由图可得,Thur列中位于5 ~ 25之间的数值较多,Fri列中位于5 ~ 30之间的数值较多,Sat列中位于5 ~ 35之间的数值较多,Sun列中位于5 ~ 40之间的数值较多。
类别内的统计估计
想要集中查看每个分类的集中趋势可以使用条形图和点图进行展示。
- barplot()函数:绘制条形图
- pointplot()函数:绘制点图。
绘制条形图
默认情况下, barplot()函数会在整个数据集上使用均值进行估计。若每个类别中有多个类别时(使用了hue参数),则条形图可以使用引导来计算估计的置信区间(样本统计量构造的总体参数的估计区间),并使用误差条来表示置信区间。
代码如下:
tips = sns.load_dataset("tips")
sns.barplot(x='day', y='total_bill', data=tips) # 绘制条形图
输出结果:
绘制点图
该函数会用高度估计值对数据进行描述,而不是显示完整的条形,只绘制点估计和置信区间。
代码如下:
tips = sns.load_dataset("tips")
sns.pointplot(x='day', y='total_bill', data=tips) # 绘制点图
输出结果: