如何为多组小提琴图添加对应水平参考线?
为分类分组的小提琴图添加组特定水平参考线
当x轴是分类变量时,geom_hline无法直接指定对应分组,因为它会绘制贯穿整个绘图区域的水平线。以下两种方法可以解决这个问题:
方法1:使用annotate手动绘制单组参考线
ggplot将分类变量的底层数值设为1、2、3(对应你指定的level顺序:versicolor=1,setosa=2,virginica=3)。你可以用annotate("segment")为每个分组绘制限定在该分组x范围内的水平线段:
library(tidyverse) data <- iris ggplot(data, aes(x = factor(Species, level = c("versicolor", "setosa", "virginica")), y = Sepal.Length, fill = Species)) + geom_violin(fill = "lightgray") + geom_boxplot(width = .02, fill= "black") + # 第一组(versicolor)参考线 annotate("segment", x = 0.8, xend = 1.2, y = 0.44, yend = 0.44, color = "red", size = 1) + # 第二组(setosa)参考线 annotate("segment", x = 1.8, xend = 2.2, y = 0.413, yend = 0.413, color = "red", size = 1) + # 第三组(virginica)参考线 annotate("segment", x = 2.8, xend = 3.2, y = 0.375, yend = 0.375, color = "red", size = 1) + xlab("Species")
方法2:创建参考线数据集,批量绘制
如果需要扩展到更多分组,推荐先创建包含分组信息和参考线参数的数据集,再用geom_segment批量绘制:
library(tidyverse) data <- iris # 定义参考线参数:分组名、参考y值、x范围 ref_lines <- tibble( species = c("versicolor", "setosa", "virginica"), y_ref = c(0.44, 0.413, 0.375), x_start = c(0.8, 1.8, 2.8), x_end = c(1.2, 2.2, 3.2) ) ggplot(data, aes(x = factor(Species, level = c("versicolor", "setosa", "virginica")), y = Sepal.Length, fill = Species)) + geom_violin(fill = "lightgray") + geom_boxplot(width = .02, fill= "black") + geom_segment(data = ref_lines, aes(x = x_start, xend = x_end, y = y_ref, yend = y_ref), color = "red", size = 1, inherit.aes = FALSE) + xlab("Species")
注意事项
你提供的iris数据中Sepal.Length的数值远大于示例中的0.44、0.413等,因此实际运行时参考线会处于图表底部。你可以替换为符合自身数据集的y值,或通过ylim()调整y轴范围以显示参考线。
内容的提问来源于stack exchange,提问作者Joao Queiroz
相关产品推荐
相关产品推荐

