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

含重复实验数据的柱状图+散点图绘制问题求助

问题

数据如下:

groupconditionvalueSource
AHealth1.0000000Simulated
BHealth1.0000000Simulated
CHealth1.0000000Simulated
ADisease0.4589925Simulated
BDisease1.4905422Simulated
CDisease1.3422035Simulated
AHealth1.0000000Experimental
BHealth1.0000000Experimental
CHealth1.0000000Experimental
ADisease0.5158371Experimental
ADisease0.7559055Experimental
BDisease1.4153005Experimental
BDisease1.4000000Experimental
CDisease1.3300971Experimental
CDisease1.0000000Experimental

需求:绘制组合图,X轴为Group,Y轴为value;每个组包含两个柱状图(对应Health和Disease条件,使用Simulated数据),同时叠加Experimental数据的散点图。

此前当每个条件仅有一条Experimental数据时,使用以下代码实现:

pivoted<-data %>% pivot_wider(names_from =Source)
ggplot(pivoted, aes(x=group,fill=condition)) + 
  geom_col(aes(y=Simulated), position=position_dodge()) + 
  labs(x="Group", y="Value") + 
  geom_point(aes(y=Experimental), position = position_dodge(width=0.9), size=3)

但现在Experimental数据存在重复值,上述方法无法正常工作,寻求解决办法。

解决方案

你之前的代码失效是因为pivot_wider遇到重复的Experimental记录时,会自动生成多列(比如Experimental_1、Experimental_2),没法直接用y=Experimental映射。不需要转宽表,直接基于原始长表分别处理两类数据就行:

library(ggplot2)
library(dplyr)

ggplot() +
  # 绘制Simulated数据的柱状图
  geom_col(data = data %>% filter(Source == "Simulated"),
           aes(x = group, y = value, fill = condition),
           position = position_dodge(width = 0.9)) +
  # 绘制Experimental数据的散点,用position_jitterdodge实现对齐+防重叠
  geom_point(data = data %>% filter(Source == "Experimental"),
             aes(x = group, y = value, color = condition),
             position = position_jitterdodge(jitter.width = 0.1, dodge.width = 0.9),
             size = 3) +
  labs(x = "Group", y = "Value") +
  theme_minimal()

要点说明:

  • 给每个geom单独指定对应的数据子集,不用折腾宽表转换
  • position_jitterdodge既能让散点和同组同条件的柱子精准对齐,又能让重叠的散点稍微错开,方便看清所有实验数据
  • 给散点设置和柱状图不同的颜色,能增强两类数据的区分度,视觉效果更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:30:31