如何在密度图上居中放置文本标签

时间:2018-11-17 16:17:17

标签: r ggplot2

我正在尝试创建在特定点处带有注释的垂直线的密度图,但是遇到了为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在上限和下限之间的中间绘制文本,但是我不确定该怎么做。

2 个答案:

答案 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()

enter image description here

答案 1 :(得分:0)

通过创建绘图,使用ggplot_build提取y极限并取平均值以获得中间点,我设法提出了一个略为绕过的解决方案。

functions.php