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

R语言无需宽转长格式如何绘制并列分组点图

问题描述

当前使用的R数据框结构示例如下:

df = data_frame(
  A=c(sample(0:2,size=50,replace=TRUE)),
  A1=c(sample(0:50,size=50,replace=TRUE)),
  A2=c(sample(0:50,size=50,replace=TRUE))
)

需求为绘制以A列为分组变量、A1与A2为观测指标的分组点图,目标效果参考:
分组点图目标效果
此前通过宽格式转长格式、结合position_dodge参数实现目标效果的代码如下:

library(reshape2)
df2 <- melt(df, id.vars=c("A"))
现存问题

希望在不做宽长格式转换的前提下绘制等价图表,当前编写的ggplot2实现代码如下:

library(ggplot2)
ggplot(df,aes(x=as.factor(A)))+
    xlab("A") + 
    ylab("Score") +
    geom_dotplot (aes(y=A1), binaxis="y",binwidth=1, stackdir = "center",fill="#5ec962",colour="#5ec962") + 
    stat_summary(aes(y=A1),fun = median, fun.min = median, fun.max = median, geom = "crossbar", width = 0.2,colour="#5ec962") +
    geom_dotplot (aes(y=A2), binaxis="y",binwidth=1, stackdir = "center",fill="#3b528b",colour="#3b528b") + 
    stat_summary(aes(y=A2),fun = median, fun.min = median, fun.max = median, geom = "crossbar", width = 0.2,colour="#3b528b") +
    theme_classic()

运行上述代码后两组点图完全重叠,错误效果参考:
点图重叠的错误效果
需要找到无需转换数据格式即可实现两组点图并列排布的方法,方便后续开展多重比较分析,避免反复进行数据格式转换。

解决方案

无需做宽长格式转换,直接给两个指标对应的图层手动设置水平位置偏移即可实现并列排布:

  • 先定义统一的偏移宽度,建议取值0.3~0.4,让A1、A2两组分别向x轴分组刻度的左右偏移半个偏移宽度,避免重叠
  • 给所有和A1、A2相关的geom_dotplot、stat_summary图层都加上position_nudge参数匹配偏移量,保证点群和对应的中位数横线位置对齐

修正后的可运行代码如下:

library(ggplot2)
# 定义两组之间的避让间距
dodge_width <- 0.35

ggplot(df, aes(x = as.factor(A))) +
  xlab("A") + 
  ylab("Score") +
  # 绘制A1组点图+中位数线,向左偏移
  geom_dotplot(
    aes(y = A1),
    binaxis = "y", binwidth = 1, stackdir = "center",
    fill = "#5ec962", colour = "#5ec962",
    position = position_nudge(x = -dodge_width/2)
  ) +
  stat_summary(
    aes(y = A1),
    fun = median, fun.min = median, fun.max = median,
    geom = "crossbar", width = 0.2, colour = "#5ec962",
    position = position_nudge(x = -dodge_width/2)
  ) +
  # 绘制A2组点图+中位数线,向右偏移
  geom_dotplot(
    aes(y = A2),
    binaxis = "y", binwidth = 1, stackdir = "center",
    fill = "#3b528b", colour = "#3b528b",
    position = position_nudge(x = dodge_width/2)
  ) +
  stat_summary(
    aes(y = A2),
    fun = median, fun.min = median, fun.max = median,
    geom = "crossbar", width = 0.2, colour = "#3b528b",
    position = position_nudge(x = dodge_width/2)
  ) +
  theme_classic()

如果后续需要添加图例,只需要在两个图层的aes()内分别指定同名的填充、颜色映射,再通过scale_fill_manual、scale_colour_manual设置配色即可,全程不需要转换数据格式,不影响后续多重比较的代码流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:48:11