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

如何用ggplot2绘制带边缘分布的斜率图并调整小提琴图方向?

带半小提琴图的斜率图实现方案

需求概述

现有基于ggplot2的斜率图可展示每个id对应的x1、x2数据点及连线;需结合gghalves的半小提琴图展示分布,同时满足两个要求:

  • 保留id对应的斜率连线
  • 翻转x2对应的半小提琴图,让数据点位于内侧,分布图形向外侧展开

实现代码

# 加载所需包
library(tidyverse)
library(gghalves)

# 生成示例数据(设置随机种子保证结果可复现)
set.seed(123)
df <- tibble(
  id = 1:100,
  x1 = sample(1:50, 100, replace = TRUE),
  x2 = x1 + sample(1:50, 100, replace = TRUE)
) %>% 
  pivot_longer(
    cols = 2:3,
    names_to = "var",
    values_to = "val"
  )

# 绘制可视化图形
ggplot(df, aes(x = var, y = val)) +
  # x1的半小提琴图:左侧展示
  geom_half_violin(data = ~filter(.x, var == "x1"),
                   aes(group = var),
                   side = "l",
                   fill = "#69b3a2",
                   alpha = 0.5) +
  # x2的半小提琴图:右侧展示(实现翻转)
  geom_half_violin(data = ~filter(.x, var == "x2"),
                   aes(group = var),
                   side = "r",
                   fill = "#404080",
                   alpha = 0.5) +
  # 添加id对应的斜率连线
  geom_line(aes(group = id), color = "gray50", alpha = 0.7) +
  # 添加数据点
  geom_point(color = "black", size = 1.2) +
  theme_minimal() +
  labs(x = "变量", y = "数值")

关键实现细节

  • 翻转小提琴图:通过为x1和x2分别指定geom_half_violin的side参数,x1用side="l"(左侧显示分布),x2用side="r"(右侧显示分布),实现两个分布图形向外侧展开,数据点自然处于内侧区域。
  • 保留斜率连线:在geom_line中指定group = id,确保每个id的x1和x2点之间产生连线,补全斜率图的核心功能。
  • 图层顺序:先绘制半小提琴图(底层),再绘制连线,最后绘制点(顶层),避免元素被遮挡,保证视觉层次清晰。

内容的提问来源于stack exchange,提问作者David Ranzolin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:00:13