【Python】数据可视化之分类图

目录

条形图

箱形图

散点图

分簇散点图

小提琴

分簇小提琴


条形图

条形图是一种直观的图表形式,它通过不同长度的矩形条(即"条形")来展示数值变量的中心趋势估计值,其中每个矩形的高度直接对应于该组数据的某个中心量度(如均值、中位数等)。此外,为了向观众传达关于这些中心趋势估计值可靠性的额外信息,条形图上常附有误差线。这些误差线提供了关于估计值周围不确定性的视觉指示,帮助理解数据的变异性或抽样误差可能如何影响这些中心趋势的估计。

也可以表示标准误差(Standard Error, SE)、置信区间(Confidence Interval, CI)或其他统计度量,它们均反映了估计值的不确定性范围。例如,一个95%的置信区间误差线会展示一个范围,该范围在多次重复相同研究的情况下,有95%的机会包含真实的中心趋势值。这样的表示不仅展示了数据的中心位置,还通过误差线直观地揭示了围绕这一中心位置的不确定性程度。

复制代码
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
crashes = sns.load_dataset("car_crashes").sort_values("total", ascending=False)
# 初始化画布大小
f, ax = plt.subplots(figsize=(15, 15))
# 绘出总的交通事故
sns.set_color_codes("pastel")
# 绘制条形图,x轴为alcohol,y轴为abbrev,数据为crashes,标签为Total,颜色为r
sns.barplot(x="total", y="abbrev", data=crashes, label="Total", color="r")
# 设置颜色代码
sns.set_color_codes("bright")
# 绘制条形图,x轴为alcohol,y轴为abbrev,数据为crashes,标签为Alcohol-involved,颜色为r
sns.barplot(x="alcohol", y="abbrev", data=crashes, label="Alcohol-involved", color="r")
# 设置图例,每行2列,位置在右下角,边框显示
ax.legend(ncol=2, loc="lower right", frameon=True)
# 设置x轴范围,y轴标签为空,x轴标签为"Automobile collisions per billion miles"
ax.set(xlim=(0, 24), ylabel="",xlabel="Automobile collisions per billion miles")

箱形图

箱形图,亦称为盒须图、盒式图或箱线图,是一种在统计学和数据可视化领域广泛应用的图形工具,用于直观地展示和比较一组或多组数据的分布特征。通过紧凑而富有信息量的方式,将数据的最大值、最小值、中位数、以及上四分位数和下四分位数等重要统计量呈现在简洁的图形之中。广泛应用于各种领域,如质量控制、经济学、生物学、医学研究等,帮助研究人员和分析师快速识别数据中的模式、异常值和分布特征,为进一步的统计分析和决策制定提供有力支持。

  • 中位数(Median):箱形图中的中心线代表数据集的中位数,即将数据集排序后位于中间的数值,反映了数据的中心趋势。

  • 四分位数(Quartiles)

    • 下四分位数(Q1):位于数据集25%处的数值,即至少有25%的数据小于或等于这个值。
    • 上四分位数(Q3) :位于数据集75%处的数值,即至少有75%的数据小于或等于这个值。
      四分位数与中位数一起,将数据集分为四个等量的部分,反映了数据的分布范围。
  • 箱体(Box):由下四分位数和上四分位数构成的矩形区域,表示数据的主要集中范围。箱体的高度反映了数据的中间50%的离散程度。

  • 须(Whiskers):从箱体的上下两端延伸出的线段,通常表示数据的最小值和最大值(或根据特定规则调整后的值,如使用1.5倍四分位距来排除异常值)。须的长度显示了数据分布的极端值范围。

  • 异常值(Outliers):通常定义为超出须范围的数据点,以单独的点或符号表示,它们可能由于测量错误、数据录入错误或极端事件而产生。

    加载tips数据集

    tips = sns.load_dataset("tips")

    绘制嵌套的箱线图,按日期和时间显示账单

    x轴为日期,y轴为账单,hue为是否吸烟,颜色分别为m和g

    sns.boxplot(x="day", y="total_bill", hue="smoker", palette=["r", "b"], data=tips)

    去除图表的边框,偏移量为10,去除多余的边框

    sns.despine(offset=10, trim=True)

散点图

点图作为一种数据可视化工具,核心在于展示数值变量在不同分类级别上的中心趋势估计。通过点的位置,能够直观地把握各分类下的数值分布情况。此外,点图还巧妙地运用误差线来标示这些中心趋势估计的不确定性范围,提供了更为全面的数据解读视角。与条形图相比,点图在聚焦于分类变量不同级别之间的比较时往往更具优势。它们不仅能够清晰地展示各分类下的数值水平,还能够在有限的空间内容纳更多的信息点,适合于展示较为复杂的数据集。

点图在展现交互作用方面表现出色。它们能够直观地揭示一个分类变量的各个层次如何随着第二个分类变量的变化而变化,这种变化关系通过点图中点的位置及其连线得以生动展现。特别是当使用不同色调来区分不同组别时,连接相同色调等级点的线条能够清晰地显示出斜率的变化,从而更容易地捕捉到不同组别间交互作用的微妙差异。

复制代码
import pandas as pd
import seaborn as sns
# 设置图形风格
sns.set(style="ticks")
# 加载iris数据集
iris = sns.load_dataset("iris")
# 将数据格式调整
iris = pd.melt(iris, "species", var_name="measurement")
# 初始化图形
f, ax = plt.subplots()
# 移除图形的底部和左侧的边框
sns.despine(bottom=True, left=True)
# 绘制条形图
# 使用seaborn库中的stripplot函数绘制散点图
# x参数指定x轴的数据,y参数指定y轴的数据,hue参数指定颜色映射,data参数指定数据集
# dodge参数指定是否在x轴上分散,jitter参数指定是否在y轴上抖动,alpha参数指定透明度,zorder参数指定绘图顺序
sns.stripplot(x="value", y="measurement", hue="species",
              data=iris, dodge=True, jitter=True,
              alpha=.5, zorder=1)
# 显示条件平均数
# 使用seaborn库中的pointplot函数绘制点图
# x参数指定x轴的数据,y参数指定y轴的数据,hue参数指定颜色映射,data参数指定数据集
# dodge参数指定点之间的间隔,join参数指定是否连接点,palette参数指定颜色调色板
# markers参数指定点的形状,scale参数指定点的大小,ci参数指定置信区间
sns.pointplot(x="value", y="measurement", hue="species",
              data=iris, dodge=.532, join=False, palette="dark",
              markers="s", scale=1, ci=True)
# 图例设置
handles, labels = ax.get_legend_handles_labels()
# 设置图例的位置和样式
# 添加图例,handles为图例的句柄,labels为图例的标签,title为图例的标题
# handletextpad为图例文本与句柄之间的距离,columnspacing为图例列之间的距离
# loc为图例的位置,ncol为图例的列数,frameon为是否显示图例的边框
ax.legend(handles[3:], labels[3:], title="species",
          handletextpad=0.05, columnspacing=0.05,
          loc="upper left", ncol=1, frameon=True)

分簇散点图

分簇散点图Swarmplot,是一种用于展示分类变量和数值变量之间关系的数据可视化图表类型,特别适用于探索多个分类级别下数据的分布情况,简单说就是数据点不重叠的分类散点图swarmplot()作为可视化的工具,不仅能够单独使用来展现数据的分类特征,还常作为箱形图(Boxplot)或小提琴图(Violin Plot)的补充手段。箱形图虽然能概括数据的四分位数范围,但无法展示所有具体数据点;小提琴图则通过密度估计展示了数据分布的形状,但在数据点较少时可能不够直观。而Swarmplot则巧妙地填补了这一空白,它直接展示所有数据点,同时通过其独特的布局方式保留了数据的基本分布特征,使得用户能够同时获得宏观与微观的数据洞察。

复制代码
import pandas as pd
import seaborn as sns
# 设置绘图风格和调色板
sns.set(style="whitegrid", palette="bright")
# 加载数据集
iris = sns.load_dataset("iris")
# 处理数据集,将species列作为索引,var_name为measurement
iris = pd.melt(iris, "species", var_name="measurement")
# 绘制分类散点图,x轴为measurement,y轴为value,hue为species,调色板为b、c、y
sns.swarmplot(x="measurement", y="value", hue="species", palette=["b", "c", "y"], data=iris)

小提琴

小提琴图(Violin Plot)是一种高级的数据可视化工具,它巧妙地展示了定量数据在单个或多个分类变量不同层级上的分布情况,并允许对这些分布进行直观的比较。与箱形图(Box-plot)不同,小提琴图不仅仅依赖于几个关键统计量(如中位数、四分位数)来描绘数据分布,而是采用了更为细腻的方法------核密度估计(Kernel Density Estimation, KDE),来描绘数据的潜在分布形态。

核密度估计是一种非参数方法,用于估计随机变量的概率密度函数。在小提琴图中,这一技术被用来绘制每个分类层级下数据的"密度轮廓",即数据点在不同值域上的相对频率或概率分布。这种表示方式不仅展示了数据的中心趋势(如中位数附近的密集区域),还揭示了数据的整体形状、对称性、多峰性以及可能的异常值区域,从而提供了比箱形图更为丰富和细致的数据分布信息。

小提琴图的优势在于其能够同时展示数据的分布形态和密度信息,使得观察者能够更全面地理解数据在不同分类层级下的变异性和相似性。此外,小提琴图还常常与箱形图结合使用,即在每个小提琴图内部绘制对应的箱形图组件(如中位数线、四分位数范围等),以提供额外的统计量参考和异常值标识。

复制代码
import numpy as np
import seaborn as sns
# 生成模拟数据集
# 创建一个随机数生成器,种子为0
rs = np.random.RandomState(0)
# 定义样本数量和特征数量
n, p = 40, 8
# 生成一个40行8列的随机正态分布矩阵,均值为0,标准差为2
d = rs.normal(0, 2, (n, p))
# 对矩阵中的每个元素进行操作,加上-5乘以特征索引再加10
d += np.log(np.arange(1, p + 1)) * -5 + 10
# 使用cubehelix获得自定义的顺序调色板
pal = sns.cubehelix_palette(p, rot=-.8, dark=.6)
# 使用小提琴图和圆点展现每种分布
sns.violinplot(data=d, palette=pal, inner="point")

分簇小提琴

分簇小提琴图(Clustered Violin Plot)是一种特殊的小提琴图变种,它结合了小提琴图的分布展示能力与分簇图的比较功能,用于在同一图表中比较多个组别或分类变量下的数据分布情况。其通过并排展示多个小提琴图(每个小提琴代表一个组别或类别),来同时比较不同组别下定量数据的分布形态和密度。每个小提琴的内部结构与标准小提琴图相同,包括核密度估计曲线、可能的箱线图元素(如中位数、四分位数等),以及表示数据密度的宽度变化。

复制代码
# 导入seaborn库
import seaborn as sns
# 加载tips数据集
tips = sns.load_dataset("tips")
# 绘制一个嵌套的小提琴图,并拆分小提琴以便于比较
# 使用seaborn库绘制小提琴图
# x轴为day,y轴为total_bill,根据smoker进行分组
# split参数为True,表示将不同组的数据分开绘制
# inner参数为"quart",表示在小提琴内部绘制四分位数
# palette参数为字典,表示不同组的数据使用不同的颜色
# data参数为tips,表示使用tips数据集
sns.violinplot(x="day", y="total_bill", hue="smoker",
               split=True, inner="quart",
               palette={"Yes": "g", "No": "y"},
               data=tips)
# 去除左边框
sns.despine(left=True)
相关推荐
尤超宇13 分钟前
基于卷积神经网络的 CIFAR-10 图像分类实验报告
人工智能·分类·cnn
大模型真好玩1 小时前
架构大突破! DeepSeek-V3.2发布,五分钟速通DeepSeek-V3.2核心特性
人工智能·python·deepseek
玩转C语言和数据结构1 小时前
Jupyter Notebook下载安装使用教程(附安装包,图文并茂)
ide·python·jupyter·anaconda·jupyternotebook·anaconda下载·anaconda安装包
2401_841495641 小时前
【自然语言处理】Universal Transformer(UT)模型
人工智能·python·深度学习·算法·自然语言处理·transformer·ut
CodeCraft Studio1 小时前
借助Aspose.Email,使用 Python 读取 Outlook MSG 文件
前端·python·outlook·aspose·email·msg·python读取msg文件
赵谨言1 小时前
基于python数据挖据的教学监控系统的设计与应用
开发语言·经验分享·python
哈基鑫2 小时前
深度学习之图像分类笔记
笔记·深度学习·分类
一只自律的鸡2 小时前
【python】从Hello World到数据类型
开发语言·python
鱼鱼说测试2 小时前
Selenium+python自动化1-环境搭建
python·selenium·自动化
元基时代3 小时前
专业的短视频发布矩阵哪家靠谱
大数据·人工智能·python·矩阵