「日拱一码」155 小提琴图

目录

什么是小提琴图?

数学原理

[核密度估计(Kernel Density Estimation, KDE)](#核密度估计(Kernel Density Estimation, KDE))

带宽选择的影响

小提琴图的优势

代码示例

[1. 基础小提琴图](#1. 基础小提琴图)

[2. 水平小提琴图](#2. 水平小提琴图)

[3. 分组小提琴图](#3. 分组小提琴图)

[4. 小提琴图与箱型图对比](#4. 小提琴图与箱型图对比)


什么是小提琴图?

小提琴图是箱形图与核密度图的结合,它能够同时显示:

  • 数据的分布形状(通过核密度估计)
  • 统计摘要信息(中位数、四分位数等)

数学原理

核密度估计(Kernel Density Estimation, KDE)

小提琴图的形状基于核密度估计,公式为:

其中:

  • K 是核函数(通常使用高斯核)
  • h 是带宽参数,控制平滑程度
  • n 是样本数量
  • xi 是样本点

带宽选择的影响

  • 小带宽:密度曲线波动大,显示细节但可能过拟合
  • 大带宽:曲线平滑,可能掩盖重要特征

小提琴图的优势

  1. 信息丰富:比箱形图展示更多分布信息
  2. 直观可视化:清晰显示数据的密度分布
  3. 多组比较:便于比较不同组别的数据分布

代码示例

1. 基础小提琴图

python 复制代码
## 1. 基础小提琴图
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

np.random.seed(42)
data1 = np.random.normal(0, 1, 200)
data2 = np.random.normal(5, 1.5, 200)
data3 = np.random.normal(10, 0.8, 200)

# 创建DataFrame
df = pd.DataFrame({
    'Value': np.concatenate([data1, data2, data3]),
    'Category': ['Group A'] * 200 + ['Group B'] * 200 + ['Group C'] * 200
})

# 使用matplotlib绘制小提琴图
plt.figure(figsize=(10, 6))
plt.violinplot([data1, data2, data3], showmeans=True, showmedians=True)
plt.xticks([1, 2, 3], ['Group A', 'Group B', 'Group C'])
plt.title('Basic Violin Plot using Matplotlib')
plt.ylabel('Values')
plt.grid(alpha=0.3)
plt.show()


# 使用Seaborn绘制(更美观)
plt.figure(figsize=(10, 6))
sns.violinplot(data=df, x='Category', y='Value',
               palette='Set2', inner='quartile')
plt.title('Violin Plot using Seaborn')
plt.show()

2. 水平小提琴图

python 复制代码
## 水平小提琴图
plt.figure(figsize=(8, 6))
sns.violinplot(data=df, y='Category', x='Value',
               palette='pastel', inner='box')
plt.title('Horizontal Violin Plot')
plt.show()

3. 分组小提琴图

python 复制代码
## 分组小提琴图
# 创建分组数据
np.random.seed(42)
df_grouped = pd.DataFrame({
    'Value': np.concatenate([
        np.random.normal(0, 1, 100),
        np.random.normal(1, 1, 100),
        np.random.normal(0, 1.5, 100),
        np.random.normal(1, 1.5, 100)
    ]),
    'Category': ['A'] * 200 + ['B'] * 200,
    'Subcategory': ['X'] * 100 + ['Y'] * 100 + ['X'] * 100 + ['Y'] * 100
})

# 分组小提琴图
plt.figure(figsize=(12, 6))
sns.violinplot(data=df_grouped, x='Category', y='Value', hue='Subcategory',
               palette='Set2', split=True, inner='quartile')
plt.title('Grouped Violin Plot')
plt.legend(title='Subcategory')
plt.show()

**4.**小提琴图与箱型图对比

python 复制代码
## 小提琴图与箱型图对比
# 对比小提琴图和箱形图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 小提琴图
sns.violinplot(data=df, x='Category', y='Value', ax=ax1)
ax1.set_title('Violin Plot')

# 箱形图
sns.boxplot(data=df, x='Category', y='Value', ax=ax2)
ax2.set_title('Box Plot')

plt.tight_layout()
plt.show()
相关推荐
鶴哥只手遮天40 分钟前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天42 分钟前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 13 章 MCP 客户端:传输、工具聚合与命名冲突
java·人工智能·开源