我正在尝试创建在特定点处带有注释的垂直线的密度图,但是遇到了为geom_text指定y值的问题。
如果我指定y值,代码可以正常运行,但是如果数据集发生更改,则y限制也会更改,从而导致文本放置在错误的位置。例如:
data(iris)
library(ggplot2)
library(dplyr)
all_data <- iris[, c("Sepal.Length", "Species")]
setosa_data <- filter(all_data, Species == "setosa")
labels <- data.frame(label_text = c("label_1", "label_2"), label_position = c(4.75, 5.5))
ggplot(setosa_data, aes(x=Sepal.Length)) +
geom_density() +
geom_vline(xintercept = labels$label_position) +
geom_text(data = labels, aes(x=label_position, y = 0.8), label = labels$label_text, vjust=-0.5, size=4, angle = 90)
ggplot(all_data, aes(x=Sepal.Length)) +
geom_density() +
geom_vline(xintercept = labels$label_position) +
geom_text(data = labels, aes(x=label_position, y = 0.8), label = labels$label_text, vjust=-0.5, size=4, angle = 90)
在以上示例中,我将y = 0.8设置为第一个数据集很好,但是在第二个数据集上太高了。
我认为我想指定y作为y限制的函数,所以我可以告诉geom_text在上限和下限之间的中间绘制文本,但是我不确定该怎么做。
答案 0 :(得分:0)
一种快速而肮脏的方法:
ggplot(all_data, aes(x = Sepal.Length)) +
geom_density() +
geom_vline(xintercept = labels$label_position, lty = 2, colour = "gray50") +
geom_text(
data = labels,
aes(x=label_position, y = median(density(all_data$Sepal.Length)$y)),
label = labels$label_text, vjust = -0.5, hjust = 0,
size = 4, angle = 90, colour = "gray50"
) +
ggthemes::theme_few()
答案 1 :(得分:0)
通过创建绘图,使用ggplot_build提取y极限并取平均值以获得中间点,我设法提出了一个略为绕过的解决方案。
functions.php