geom_rain()绘图线条未连接数据点的问题解决咨询
解决geom_rain()线条未准确连接数据点的问题
问题说明
复制ggrain官网示例代码绘制rain图时,出现部分线条未准确连接对应数据点的问题(如左下角数据点无线条连接),同时触发Duplicated aesthetics after name standardisation: alpha警告。运行代码如下:
set.seed(42) # the magic number iris_subset <- iris[iris$Species %in% c('versicolor', 'virginica'),] iris.long <- cbind(rbind(iris_subset, iris_subset, iris_subset), data.frame(time = c(rep("t1", dim(iris_subset)[1]), rep("t2", dim(iris_subset)[1]), rep("t3", dim(iris_subset)[1])), id = c(rep(1:dim(iris_subset)[1]), rep(1:dim(iris_subset)[1]), rep(1:dim(iris_subset)[1])))) # adding .5 and some noise to the versicolor species in t2 iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t2"] <- iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t2"] + .5 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t2"]), sd = .2) # adding .8 and some noise to the versicolor species in t3 iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t3"] <- iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t3"] + .8 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t3"]), sd = .2) # now we subtract -.2 and some noise to the virginica species iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t2"] <- iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t2"] - .2 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t2"]), sd = .2) # now we subtract -.4 and some noise to the virginica species iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t3"] <- iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t3"] - .4 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t3"]), sd = .2) iris.long$Sepal.Width <- round(iris.long$Sepal.Width, 1) # rounding Sepal.Width so t2 data is on the same resolution iris.long$time <- factor(iris.long$time, levels = c('t1', 't2', 't3')) ggplot(iris.long[iris.long$time %in% c('t1', 't2'),], aes(time, Sepal.Width, fill = Species)) + geom_rain(alpha = .5, rain.side = 'f2x2', id.long.var = "id") + theme_classic() + scale_fill_manual(values=c("dodgerblue", "darkorange")) + guides(fill = 'none', color = 'none') #> Warning: Duplicated aesthetics after name standardisation: alpha
问题原因
rain.side参数不匹配:'f2x2'是为4组(2×2)对比场景设计的布局逻辑,当前仅使用t1和t2两个时间点,搭配Species分组后实际是2组对比,用该参数会导致连线逻辑错误,部分数据点无法匹配。- 重复美学映射:
geom_rain内部已处理alpha美学,外部单独传入alpha = .5会触发重复映射警告。
解决方案
修正步骤
- 替换
rain.side为适配2组对比的参数,如'both'(双向连线)、'left'或'right'(单向连线); - 将
alpha整合到填充颜色的透明度设置中,避免重复美学映射; - 保留
id.long.var = "id"确保每个个体的时间序列数据正确关联。
修正后代码
set.seed(42) # the magic number iris_subset <- iris[iris$Species %in% c('versicolor', 'virginica'),] iris.long <- cbind(rbind(iris_subset, iris_subset, iris_subset), data.frame(time = c(rep("t1", dim(iris_subset)[1]), rep("t2", dim(iris_subset)[1]), rep("t3", dim(iris_subset)[1])), id = c(rep(1:dim(iris_subset)[1]), rep(1:dim(iris_subset)[1]), rep(1:dim(iris_subset)[1])))) # adding .5 and some noise to the versicolor species in t2 iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t2"] <- iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t2"] + .5 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t2"]), sd = .2) # adding .8 and some noise to the versicolor species in t3 iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t3"] <- iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t3"] + .8 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'versicolor' & iris.long$time == "t3"]), sd = .2) # now we subtract -.2 and some noise to the virginica species iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t2"] <- iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t2"] - .2 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t2"]), sd = .2) # now we subtract -.4 and some noise to the virginica species iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t3"] <- iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t3"] - .4 + rnorm(length(iris.long$Sepal.Width[iris.long$Species == 'virginica' & iris.long$time == "t3"]), sd = .2) iris.long$Sepal.Width <- round(iris.long$Sepal.Width, 1) # rounding Sepal.Width so t2 data is on the same resolution iris.long$time <- factor(iris.long$time, levels = c('t1', 't2', 't3')) # 修正后的绘图代码 ggplot(iris.long[iris.long$time %in% c('t1', 't2'),], aes(time, Sepal.Width, fill = Species)) + geom_rain(rain.side = 'both', id.long.var = "id") + theme_classic() + scale_fill_manual(values=c(alpha("dodgerblue", 0.5), alpha("darkorange", 0.5))) + guides(fill = 'none', color = 'none')
效果说明
rain.side = 'both'会让每个个体的t1和t2数据点双向连线,确保所有点都被正确连接;- 通过
alpha()函数设置填充色透明度,既保留半透明效果,又避免了重复美学映射的警告; id.long.var确保同一id的个体数据被正确关联,不会出现连线错位。
内容的提问来源于stack exchange,提问作者Goru
相关产品推荐
相关产品推荐

