如何在带分面的ggplot2折线图X轴叠加基于cluster_mass的rug plots?
分面折线图添加带颜色深浅的X轴Rug Plot实现
要实现仅在cluster_mass非NA位置显示、且颜色深浅由cluster_mass数值决定的X轴rug plot,只需在原ggplot代码中添加geom_rug()并做如下配置,分面布局会自动适配:
修改后的完整代码
df <- data.frame("Condition" = c("Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender", "Gender"), "Agreement" = c("Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement", "Non-Agreement"), "Time" = c(0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18), "Mean_Amplitude" = c(1.76, 1.78, 1.80, 1.83, 1.87, 1.75, 1.56, 1.65, 1.7, 1.9, 1.75, 1.75, 1.75, 1.85, 1.73, 1.85, 1.65, 1.7, 1.7, 1.8, 1.76, 1.78, 1.80, 1.83, 1.87, 1.75, 1.56, 1.65, 1.7, 1.9, 1.75, 1.75, 1.75, 1.85, 1.73, 1.85, 1.65, 1.7, 1.7, 1.8), "Group" = c("A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B"), "Language" = c("X", "X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X","X"), "cluster_mass" = c(NA, NA, NA, 141.2, 141.2, 141.2, 141.2,NA, 1000, 1000, NA, NA, NA, 141.2, 141.2, 141.2, 141.2,NA, 1000, 1000, NA, NA, NA, 141.2, 141.2, 141.2, 141.2,NA, 1000, 1000, NA, NA, NA, 141.2, 141.2, 141.2, 141.2,NA, 1000, 1000)) df %>% ggplot(aes(x = Time, y = Mean_Amplitude, color = Agreement, linetype = Agreement, size = Agreement)) + geom_line() + # 添加带颜色深浅的X轴rug plot geom_rug( data = ~subset(.x, !is.na(cluster_mass)), # 仅保留cluster_mass非NA的行 aes(x = Time, color = cluster_mass), # 映射颜色到cluster_mass数值 side = "b", # 在X轴底部绘制rug inherit.aes = FALSE, # 不继承全局的color映射 size = 1.5 # 调整rug线条粗细 ) + scale_color_manual(values = c("Non-Agreement" = "red", "Agreement" = "blue")) + # 为cluster_mass设置颜色渐变(浅到深) scale_color_gradient(low = "lightgray", high = "black") + scale_linetype_manual(values = c("Non-Agreement" = "solid", "Agreement" = "solid")) + scale_size_manual(values = c("Non-Agreement" = 0.4, "Agreement" = 0.6)) + theme_classic() + facet_wrap(~Group*Language, ncol = 2, labeller = label_wrap_gen(multi_line = FALSE)) + geom_vline(xintercept = 0, linetype = "dashed") + geom_hline(yintercept = 0, linetype = "dashed") + labs(x = "Time (ms)", y = expression(paste("Amplitude (", mu, "V)"))) + theme(axis.text = element_text(size = 12), axis.title = element_text(size = 16), legend.text = element_text(size = 12), legend.position = "bottom", strip.background = element_blank(), strip.text.x = element_text(size = 12), legend.title = element_blank())
关键配置说明
- 过滤数据:通过
data = ~subset(.x, !is.na(cluster_mass))筛选出cluster_mass不为空的观测,确保仅在对应Time位置绘制rug。 - 颜色映射:在
geom_rug的aes中单独指定color = cluster_mass,并通过scale_color_gradient()设置颜色渐变规则,数值越大颜色越深。 - 分面适配:由于数据本身包含
Group和Language分面变量,geom_rug会自动跟随分面布局,在每个子图的对应位置绘制rug。 - 避免继承冲突:设置
inherit.aes = FALSE,防止继承全局的color = Agreement映射,确保rug的颜色仅由cluster_mass决定。
内容的提问来源于stack exchange,提问作者user9974638
相关产品推荐
相关产品推荐

