Как аннотировать линейный график стрелкой и максимальным значением?

Я пытаюсь комментировать линейный график со стрелкой, указывающей на самую высокую точку в линейном графике и отображающей стрелку и максимальное значение на графике. Я использую mtcars набор данных в качестве моей ссылки. Ниже мой код.

e <- df$mpg
ggplot(df, aes(x=e, y=df$hp)) + 
  geom_line() + 
  annotate("segment", color="blue", x=max(e), xend = max(e), y=max(df$hp), 
            yend=max(df$hp), arrow=arrow())

Заранее спасибо,

2 ответа

Решение

Вы ищете что-то вроде этого:

labels <- data.frame(mpg = mtcars[which(mtcars$hp == max(mtcars$hp)), "mpg"]+7, hp = mtcars[which(mtcars$hp == max(mtcars$hp)), "hp"],text = paste0("Max value at mpg = ", mtcars[which(mtcars$hp == max(mtcars$hp)), "mpg"], " and hp = ", max(mtcars$hp)))


ggplot(mtcars, aes(mpg, hp))+
    geom_line()+
    geom_text(data = labels, aes(label = text))+
    annotate("segment", 
        x=mtcars[which(mtcars$hp == max(mtcars$hp)), "mpg"]+2,
        xend=mtcars[which(mtcars$hp == max(mtcars$hp)), "mpg"]+.2, 
        y= mtcars[which(mtcars$hp == max(mtcars$hp)), "hp"],
        yend= mtcars[which(mtcars$hp == max(mtcars$hp)), "hp"], 
        arrow=arrow(), color = "blue")

Объяснение: Для того, чтобы комментировать с max, нам нужно найти позицию mpg, которая является максимальной для hp. Для этого мы используем mtcars[which(mtcars$hp == max(mtcars$hp)), "mpg"], which() оператор дает нам возможность строки этого максимума, чтобы мы могли получить правильное значение mpg. Далее мы аннотируем эту позицию, добавив немного места (то есть +2 и +.2), чтобы она выглядела лучше. Наконец, мы можем построить фрейм данных с одинаковыми позициями (но с разным смещением) и использовать geom_text() добавить метку данных.

Альтернативное решение с использованием пакетов "ggpmisc" и "ggrepel". (Этот код можно легко изменить, чтобы пометить более одного пика, отрегулировав значение диапазона.)

library(ggplot2)
library(ggpmisc)
library(ggrepel)

ggplot(mtcars, aes(mpg, hp))+
  geom_line()+
  stat_peaks(span = NULL,
             geom = "text_repel",
             mapping = aes(label = paste(..y.label.., ..x.label..)),
             x.label.fmt = "at %.0f mpg",
             y.label.fmt = "Max hp = %.0f",
             segment.colour = "blue",
             arrow = grid::arrow(length = unit(0.1, "inches")),
             nudge_x = 5)

введите описание изображения здесь

Другие вопросы по тегам