Python数据可视化:创建小提琴图指南
小提琴图基础
小提琴图是一种强大的统计可视化方法,它结合了箱线图和密度图的特点,能够直观地展示数据分布的形状、中心趋势和离散程度。这种图表特别适合比较不同组别之间的数据分布差异。
环境准备
首先,我们需要确保已安装seaborn库。通过pip可以轻松完成安装:
pip install seaborn
导入必要的库
创建小提琴图需要导入seaborn和matplotlib库:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
数据准备
让我们创建一个示例数据集来演示小提琴图的绘制:
# 创建模拟数据
np.random.seed(42)
group1 = np.random.normal(0, 1, 200)
group2 = np.random.normal(3, 1.5, 200)
group3 = np.random.normal(-2, 0.8, 200)
# 构建DataFrame
import pandas as pd
df = pd.DataFrame({
'分组': ['组别A'] * 200 + ['组别B'] * 200 + ['组别C'] * 200,
'数值': np.concatenate([group1, group2, group3])
})
绘制基础小提琴图
使用seaborn的violinplot函数可以轻松创建小提琴图:
# 设置绘图风格
sns.set(style="whitegrid")
# 创建图形
plt.figure(figsize=(10, 6))
# 绘制小提琴图
sns.violinplot(x="分组", y="数值", data=df, palette="pastel")
# 添加标题和标签
plt.title("三组数据分布对比")
plt.xlabel("实验分组")
plt.ylabel("测量值")
# 显示图形
plt.show()
自定义小提琴图
我们可以进一步自定义小提琴图的显示效果:
# 创建图形
plt.figure(figsize=(12, 7))
# 绘制带内部箱线图的小提琴图
sns.violinplot(x="分组", y="数值", data=df,
palette="muted",
inner="box", # 添加内部箱线图
saturation=0.9)
# 添加标题和标签
plt.title("带箱线图的小提琴分布")
plt.xlabel("不同类别")
plt.ylabel("观测值")
# 调整布局
plt.tight_layout()
# 显示图形
plt.show()
水平小提琴图
有时,水平方向的小提琴图更适合展示数据:
# 创建图形
plt.figure(figsize=(8, 6))
# 绘制水平小提琴图
sns.violinplot(y="分组", x="数值", data=df,
palette="deep",
inner="quartile")
# 添加标题和标签
plt.title("水平方向小提琴图")
plt.xlabel("数值分布")
plt.ylabel("类别分组")
# 显示图形
plt.show()
多变量小提琴图
我们还可以结合其他变量创建更复杂的小提琴图:
# 添加子类别列
df['子类别'] = np.repeat(['子类1', '子类2'], 300)
# 创建图形
plt.figure(figsize=(14, 8))
# 绘制嵌套小提琴图
sns.violinplot(x="分组", y="数值", hue="子类别", data=df,
palette="colorblind",
split=True, # 分裂显示
inner="stick") # 显示数据点
# 添加标题和标签
plt.title("按子类别分组的小提琴图")
plt.xlabel("主要分组")
plt.ylabel("测量值")
# 调图例位置
plt.legend(title="子类别", loc="upper right")
# 显示图形
plt.show()
完整示例代码
以下是完整的示例代码,从数据生成到图形绘制:
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
# 设置随机种子保证结果可重现
np.random.seed(42)
# 生成模拟数据
group1 = np.random.normal(0, 1, 200)
group2 = np.random.normal(3, 1.5, 200)
group3 = np.random.normal(-2, 0.8, 200)
# 构建DataFrame
df = pd.DataFrame({
'分组': ['组别A'] * 200 + ['组别B'] * 200 + ['组别C'] * 200,
'数值': np.concatenate([group1, group2, group3])
})
# 添加子类别列
df['子类别'] = np.repeat(['子类1', '子类2'], 300)
# 设置绘图风格
sns.set(style="whitegrid")
# 创建图形
plt.figure(figsize=(14, 8))
# 绘制嵌套小提琴图
sns.violinplot(x="分组", y="数值", hue="子类别", data=df,
palette="colorblind",
split=True,
inner="stick")
# 添加标题和标签
plt.title("按子类别分组的小提琴图")
plt.xlabel("主要分组")
plt.ylabel("测量值")
# 调图例位置
plt.legend(title="子类别", loc="upper right")
# 调整布局
plt.tight_layout()
# 显示图形
plt.show()