You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用预先生成的密度值绘制geom_violin小提琴图?

用自定义加权核密度绘制小提琴图

geom_violin本身不支持直接传入外部计算的核密度结果,但可以用geom_polygon手动实现相同的小提琴图效果,核心是把你的KDE数据转换成对称的多边形坐标。

步骤1:处理KDE数据生成多边形坐标

先把你已经生成的Mean_Kernel_df转换成适合绘制对称多边形的格式:

library(dplyr)
library(ggplot2)

# 处理密度数据,生成小提琴图的左右对称坐标
violin_df <- Mean_Kernel_df %>%
  group_by(Type) %>%
  mutate(
    # 将分类Type转为数值中心坐标(Surge对应1,Plummet对应2)
    x_center = as.numeric(factor(Type)),
    # 缩放密度值,控制小提琴的宽度(系数可根据需求调整)
    density_scaled = y * 5,
    # 生成左右两边的x偏移坐标
    x_left = x_center - density_scaled,
    x_right = x_center + density_scaled
  ) %>%
  ungroup()

# 构造闭合多边形的点集:先取左侧点,再反向取右侧点(保证多边形闭合)
violin_poly_data <- bind_rows(
  violin_df %>% select(Type, x = x_left, y = x),
  violin_df %>% arrange(desc(x)) %>% select(Type, x = x_right, y = x)
)

步骤2:绘制自定义小提琴图

用geom_polygon绘制填充的小提琴形状,还可以叠加原始数据的散点或箱线图作为补充:

ggplot() +
  # 绘制小提琴的填充部分
  geom_polygon(
    data = violin_poly_data,
    aes(x = x, y = y, fill = Type),
    alpha = 0.7,
    color = "gray30" # 添加轮廓线
  ) +
  # 叠加原始数据的散点(可选)
  geom_jitter(
    data = Surge_vs_Plummet_Stats_df,
    aes(x = Type, y = Mean),
    width = 0.1,
    alpha = 0.3,
    color = "darkred"
  ) +
  # 调整坐标轴和主题
  labs(x = "类型", y = "均值") +
  theme_minimal()

关键说明

  • density_scaled的系数(示例中是5)用来调整小提琴的宽度,你可以根据自己的KDE结果大小灵活修改,让图形比例更协调。
  • 多边形的点顺序很重要,必须先按y值从小到大取左侧点,再从大到小取右侧点,这样才能形成闭合的对称形状。
  • 如果需要更贴近原生小提琴图的样式,可以调整填充色、透明度或添加更多细节(比如中位数线)。

内容的提问来源于stack exchange,提问作者James White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:20:18