【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)

    作者:F_D_Z

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python】数据可视化之分布图

    发表回复