R ggplot: применять метку только к последним N точкам данных на графике

Я создал линейную диаграмму (график) в R с метками на каждой точке данных. Из-за большого количества точек данных, сюжет становится очень полно с метками. Я хотел бы применять метки только для последних N (скажем, 4) точек данных. Я пробовал подмножество и хвост в функции geom_label_repel, но не смог вычислить их или получил сообщение об ошибке. Мой набор данных состоит из 99 значений, распределенных по 3 группам (KPI).

У меня есть следующий код в R:

library(ggplot)
library(ggrepel)

data.trend <- read.csv(file=....)

plot.line <- ggplot(data=data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) +

  geom_line(aes(group = KPI), size = 1) +
  geom_point(size = 2.5) +


  # Labels defined here
  geom_label_repel(
    aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)),
    box.padding = unit(0.35, "lines"),
    point.padding = unit(0.4, "lines"),
    segment.color = 'grey50',
    show.legend = FALSE
  )

);

Я, честно говоря, я совсем новичок в R. Может быть, я упускаю что-то основное.

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

2 ответа

Решение

Самый простой подход - установить data = параметр в geom_label_repel чтобы включить только те точки, которые вы хотите пометить.

Вот воспроизводимый пример:

set.seed(1235)
data.trend <- data.frame(Version = rnorm(25), Value = rnorm(25), 
                         group = sample(1:2,25,T), 
                         KPI = sample(1:2,25,T))

ggplot(data=data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) +
  geom_line(aes(group = KPI), size = 1) +
  geom_point(size = 2.5) +
  geom_label_repel(aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)),
    data = tail(data.trend, 4),                 
    box.padding = unit(0.35, "lines"),
    point.padding = unit(0.4, "lines"),
    segment.color = 'grey50',
    show.legend = FALSE)

К сожалению, это немного портит алгоритм отталкивания, делая размещение меток неоптимальным по отношению к другим точкам, которые не помечены (на рисунке выше видно, что некоторые точки покрыты метками).

Таким образом, лучший подход заключается в использовании color а также fill просто сделать ненужные ярлыки невидимыми (установив цвет и заливку NA для ярлыков, которые вы хотите скрыть):

ggplot(data=data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) +
  geom_line(aes(group = KPI), size = 1) +
  geom_point(size = 2.5) +
  geom_label_repel(aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)),
                   box.padding = unit(0.35, "lines"),
                   point.padding = unit(0.4, "lines"),
                   show.legend = FALSE,
                   color = c(rep(NA,21), rep('grey50',4)),
                   fill = c(rep(NA,21), rep('lightblue',4)))

Если вы хотите показать только последнюю метку, можно использовать group_by и filter:

data = data.trend %>% group_by(KPI) %>% filter(Version == max(Version))

Полный пример:

      suppressPackageStartupMessages(library(dplyr))
library(ggplot2)
library(ggrepel)

set.seed(1235)
data.trend <- data.frame(Version = rnorm(25), Value = rnorm(25), 
                         group = sample(1:2,25,T), 
                         KPI = sample(1:2,25,T))

ggplot(data = data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) +
  geom_line(aes(group = KPI), size = 1) +
  geom_point(size = 2.5) +

  # Labels defined here
  geom_label_repel(
    data = data.trend %>% group_by(KPI) %>% filter(Version == max(Version)), 
    aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)),
    color = "black",
    fill = "white")

Или, если вы хотите показать 4 случайных метки для каждого KPI, data.trend %>% group_by(KPI) %>% sample_n(4):

      suppressPackageStartupMessages(library(dplyr))
library(ggplot2)
library(ggrepel)

set.seed(1235)
data.trend <- data.frame(Version = rnorm(25), Value = rnorm(25), 
                         group = sample(1:2,25,T), 
                         KPI = as.factor(sample(1:2,25,T)))

ggplot(data = data.trend, aes(x = Version, y = Value, group = KPI, color = KPI)) +
  geom_line(aes(group = KPI), size = 1) +
  geom_point(size = 2.5) +
  
  # Labels defined here
  geom_label_repel(
    data = data.trend %>% group_by(KPI) %>% sample_n(4), 
    aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value), fill = KPI),
    color = "black", show.legend = FALSE
    )
#> Warning: Duplicated aesthetics after name standardisation: fill

Создано 2021-08-27 пакетом REPEX (v2.0.1)

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