【Python】数据可视化之分布图
分布图主要用来展示某些现象或数据在地理空间、时间或其他维度上的分布情况。它可以清晰地反映出数据的空间位置、数量、密度等特征,帮助人们更好地理解数据的内在规律和相互关系。
目录
单变量分布
变量关系组图
双变量关系
核密度估计
山脊分布图
单变量分布
distplot() 函数是 Seaborn 库中用于绘制单变量分布图的一个非常有用的函数。值得注意的是,从 Seaborn 的较新版本(特别是从0.11.0版本开始)开始,distplot() 函数已经被标记为弃用(deprecated),并建议使用更具体和灵活的绘图函数,如 histplot() 用于直方图,kdeplot() 或 displot()用于更复杂的分布可视化。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(style="darkgrid")
# 创建一个2行2列的子图,每个子图的大小为8x8,不共享x轴和y轴
f, axes = plt.subplots(2, 2, figsize=(8, 8), sharex=False, sharey=False)
sns.despine(left=True)
# 创建一个随机数生成器,种子为10
rs = np.random.RandomState(8)
# 生成一个包含1000个随机数的数组
d = rs.normal(size=1000)
# 绘制简单的直方图,kde=False不绘制核密度估计图,下列其他图类似
sns.distplot(d, kde=False, color="r", ax=axes[0, 0])
# 使用seaborn库绘制d的分布图,不绘制直方图,绘制rug图,颜色为黄色,绘制在axes[0, 1]上
sns.distplot(d, hist=False, rug=True, color="y", ax=axes[1, 0])
# 使用seaborn库绘制d的分布图,不绘制直方图,颜色为蓝色,kde_kws参数设置阴影为True,绘制在axes[1, 0]上
sns.distplot(d, hist=False, color="b", kde_kws={"shade": True}, ax=axes[0, 1])
# 使用seaborn库中的distplot函数绘制直方图,参数d为数据,color为颜色,ax为坐标轴
sns.distplot(d, color="g", ax=axes[1, 1])
# 设置坐标轴的y轴刻度
plt.setp(axes, yticks=[])
plt.tight_layout()
变量关系组图
pairplot是Seaborn库中的一个强大且多功能的绘图函数,它主要用于绘制数据集中所有可能的成对关系图。这个函数通过生成一个网格图,每个单元格展示一个变量对的分布图(如散点图、直方图或核密度估计图),非常适合于初步的数据探索和可视化。
- data:指定要绘制的数据集,通常是一个pandas的DataFrame对象。
- vars:可选参数,用于指定要绘制哪些变量的关系图。如果不指定,则默认绘制数据集中所有数值型变量的关系图。
- hue:可选参数,用于指定一个分类变量,根据该变量的不同值对数据进行分组展示。
- kind:控制非对角线上图表类型的参数,可选"scatter"(散点图)和"reg"(回归图)等。但需要注意的是,pairplot的kind参数可能不如其他Seaborn图表那样灵活,因为它主要关注于成对关系的展示。
- diag_kind:控制对角线上图表类型的参数,可选"hist"(直方图)和"kde"(核密度估计图)等。
- markers:控制散点图中数据点的标记类型,用于区分不同的数据点或组别。
df = sns.load_dataset("iris")
sns.pairplot(df)
可以控制指定位置的图表类型,比如对角线使用核密度估计图
sns.pairplot(df, diag_kind="kde")
也可以对数据进行分组展示
sns.pairplot(iris, hue="species")
双变量关系
双变量关系(Bivariate Relationship)是统计学和数据分析中的一个基本概念,它指的是两个变量之间的关联或相互作用。在这种关系中,一个变量的变化可能会影响到另一个变量的变化,但这并不意味着一个变量是另一个变量的原因。双变量关系可以是线性的,也可以是非线性的,它可以是正相关、负相关,或者根本没有明确的关联,即零相关。
jointplot是Seaborn库中的一个强大工具,用于可视化两个变量的联合分布及其关系。它结合了多种图表类型,如散点图、直方图、核密度估计图(KDE)等,提供了对数据分布和关系的深入理解。jointplot能够同时展示两个变量的联合分布以及它们各自的边缘分布,从而帮助用户全面理解变量之间的关系和分布情况。
- x, y:指定要绘制的两个变量,分别作为x轴和y轴的数据。
- data:包含x和y变量的数据集,通常是一个pandas的DataFrame对象。
- kind:指定绘制图表的类型,如
'scatter'
(散点图)、'kde'
(核密度估计图)、'hex'
(蜂窝图)等。 - color:设置图表中元素的颜色。
- size:设置图表的大小(正方形)。
- ratio:设置中心图与侧边图的比例。
- joint_kws, marginal_kws:分别用于自定义联合图和边缘图的样式。
# 创建一个随机数生成器,种子为8
rs = np.random.RandomState(8)
# 生成1000个服从Gamma分布的随机数
x = rs.gamma(8, size=1000)
# 生成1000个服从正态分布的随机数,并乘以-0.5
y = -.5 * x + rs.normal(size=1000)
# x和y为数据,kind参数指定图形类型为六边形,color参数指定颜色为红色
sns.jointplot(x=x, y=y, kind="hex", color="r")
# 加载tips数据集
tips = sns.load_dataset("tips")
# ,x轴为total_bill,y轴为tip,数据为tips,类型为线性回归,x轴范围为0到50,y轴范围为0到12,颜色为绿色,高度为6
g = sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg",xlim=(0, 50), ylim=(0, 12), color="g", height=6)
核密度估计
核密度估计(Kernel Density Estimation, KDE)是一种在概率论中用来估计未知的密度函数的非参数检验方法,由Rosenblatt(1955)和Emanuel Parzen(1962)提出,又称为Parzen窗(Parzen window)。核密度估计的基本思想是,对于给定的数据样本,通过核函数(通常是对称且非负的密度函数,如高斯函数)来拟合数据点的局部密度,进而估计整个数据的密度函数。具体来说,对于数据集中的每一个点,都以其为中心放置一个核函数,然后对所有核函数进行加权平均(或求和),得到的结果即为整个数据集的密度估计。
# 设置绘图风格为暗色
sns.set(style="dark")
# 创建一个随机数生成器,种子为8
rs = np.random.RandomState(8)
# 生成随机数的数组
x, y = rs.randn(2, 1000)
# 绘制x和y的核密度估计图
sns.kdeplot(x=x, y=y,color="r")
# 调整布局,使图形更加紧凑
f.tight_layout()
# 设置绘图风格为darkgrid
sns.set(style="darkgrid")
# 加载iris数据集
iris = sns.load_dataset("iris")
# 查询出species为setosa的数据
setosa = iris.query("species == 'setosa'")
# 查询出species为virginica的数据
virginica = iris.query("species == 'virginica'")
# 创建一个8x8的绘图区域
f, ax = plt.subplots(figsize=(8, 8))
# 设置绘图区域的纵横比为1:1
ax.set_aspect("equal")
# 绘制setosa数据的密度图,使用Blues颜色映射,并设置阴影和最低值阴影
ax = sns.kdeplot(x=setosa.sepal_width, y=setosa.sepal_length,cmap="Blues", shade=True, shade_lowest=False)
# 绘制virginica数据的密度图,使用Reds颜色映射,并设置阴影和最低值阴影
ax = sns.kdeplot(x=virginica.sepal_width, y=virginica.sepal_length,cmap="Reds", shade=True, shade_lowest=False)
# 获取Reds颜色映射的倒数第二个颜色
red = sns.color_palette("Reds")[-2]
# 获取Blues颜色映射的倒数第二个颜色
blue = sns.color_palette("Blues")[-2]
# 在绘图区域中添加文本,显示species为virginica的数据
ax.text(2.5, 8.2, "virginica", size=16, color=blue)
# 在绘图区域中添加文本,显示species为setosa的数据
ax.text(3.8, 4.5, "setosa", size=16, color=red)
山脊分布图
山脊分布图,也称为山脊图(Ridge Plot)或Joy Plot,是一种数据可视化的方法,主要用于展示一个或多个组的数据分布情况。山脊图通过平滑的密度曲线来表示每个组的数据分布,这些曲线沿垂直轴堆叠排列,形成类似山脊的视觉效果。制作基于核密度估计(Kernel Density Estimation, KDE),这是一种估计概率密度函数的非参数方式。通过KDE,可以对每个组的数据进行平滑处理,从而得到连续的密度曲线。
# 创建一个随机数生成器,种子为8
rs = np.random.RandomState(8)
# 生成500个随机数
x = rs.randn(500)
# 创建一个字符串,重复50次
g = np.tile(list("ABCDEFGHIJ"), 50)
# 创建一个DataFrame,包含x和g两列
df = pd.DataFrame(dict(x=x, g=g))
# 将g列中的字符转换为ASCII码
m = df.g.map(ord)
# 将m加到x列上
df["x"] += m
# 创建一个颜色调色板
pal = sns.cubehelix_palette(10, rot=-.5, light=.7)
# 创建一个FacetGrid,按g列进行分面,hue参数设置为g,aspect参数设置为15,height参数设置为0.5,palette参数设置为pal
g = sns.FacetGrid(df, row="g", hue="g", aspect=15, height=.5, palette=pal)
# 在每个分面上绘制核密度图,clip_on参数设置为False,shade参数设置为True,alpha参数设置为1,lw参数设置为1.5,bw参数设置为0.2
g.map(sns.kdeplot, "x", clip_on=False, shade=True, alpha=1, lw=1.5, bw=.2)
# 在每个分面上绘制核密度图,clip_on参数设置为False,color参数设置为白色,lw参数设置为2,bw参数设置为0.2
g.map(sns.kdeplot, "x", clip_on=False, color="w", lw=2, bw=.2)
# 在每个分面上绘制水平线,y参数设置为0,lw参数设置为2,clip_on参数设置为False
g.map(plt.axhline, y=0, lw=2, clip_on=False)
# 定义一个函数,用于在每个分面上添加标签
def label(x, color, label):
# 获取当前的坐标轴
ax = plt.gca()
# 在坐标轴上添加文本,字体加粗,颜色为color,文本内容为label,水平对齐方式为左对齐,垂直对齐方式为居中对齐,坐标轴变换为ax.transAxes
ax.text(0, .2, label, fontweight="bold", color=color,ha="left", va="center", transform=ax.transAxes)
# 在每个分面上调用label函数
g.map(label, "x")
# 调整子图之间的间距
g.fig.subplots_adjust(hspace=-.5)
# 设置标题为空
g.set_titles("")
# 设置y轴刻度为空
g.set(yticks=[])
# 去掉底部和左边的边框
g.despine(bottom=True, left=True)