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

Я создал линейную диаграмму (график) в R с метками для каждой точки данных. Из-за большого количества точек данных график становится очень насыщенным с метками. Я хотел бы применить метки только для последних N (скажем, 4) точек данных. Я попробовал subset и tail в функции 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. Может быть, я пропустил что-то основное.

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


person user32556    schedule 07.01.2017    source источник
comment
Пожалуйста, приведите воспроизводимый пример или хотя бы покажите получившуюся цифру.   -  person Roman Luštrik    schedule 07.01.2017


Ответы (1)


Самый простой способ — настроить параметр 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)))

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

person dww    schedule 07.01.2017
comment
Спасибо, вы направили меня в правильном направлении. Однако я вижу, что показаны только последние точки данных 1 строки. Чтобы преодолеть это, я добавил список с версиями, которые я хочу построить, и использую подмножество в поле данных, чтобы отображать только их. Это путает функцию отталкивания, но в моем случае это не проблема. Большое спасибо! labels <- tail(data.trend$Version, 3) ..... geom_label_repel( data = subset(data.trend, data.trend$Version %in% labels), aes(Version, Value, fill = factor(KPI), label = sprintf('%0.1f%%', Value)), ... ) - person user32556; 07.01.2017