Добавление метки к линии ggplot, а не к точке - PullRequest
0 голосов
/ 12 июля 2020

У меня есть фреймворк частот видов. Я рисую график численности с течением времени и хочу обозначить наиболее распространенные виды. У меня есть фреймворк со следующими пятью столбцами - дата, вид, частота, сайт, лечение. В настоящее время я делаю что-то вроде:

df %>%
  mutate(majorSpp = ifelse(frequency > 0.4, as.character(species), "")) %>% 
  ggplot(aes(x = date, y = frequency, colour = species, group = species)) +
    geom_line() +
    facet_grid(type ~ treatment)
    geom_label_repel(aes(label=majorSpp))

Однако этот подход означает, что если вид имеет частоту> 0,4 ​​в несколько дат, линия помечается в каждой из нескольких точек, а не один раз. Что мне нужно, так это присвоить название вида majorSpp только для той точки, где частота этого вида самая высокая за все даты, когда он был измерен. Но я не могу понять, как встроить этот logi c в функцию mutate.

Я открыт для других решений маркировки, таких как directlabel, если это легко сделать из коробки в некоторых другой пакет.

EDIT:

Пример данных:

df <- data.frame(date = c(01-02-2020, 01-02-2020, 04-04-2020, 04-04-2020), 
                 species = c("cat", "dog", "cat", "dog"), 
                 frequency = c(0.1, 0.5, 0.6, 0.5),
                 site = c('a', 'a', 'a', 'a'),
                 treatment = c(1, 1, 1, 1))

Если я создаю метку для любой частоты выше 0,4, я получаю две метки создан для "собаки". Причина, по которой я хочу это сделать, заключается в том, что у меня около 50 видов, но большинство из них большую часть времени имеют нулевую частоту. Поэтому использование чего-то вроде цвета и легенды бесполезно.

Частичное решение:

df %>%
  mutate(majorSpp = ifelse(frequency > 0.4, as.character(species), "")) -> temp
temp$majorSpp[duplicated(temp$majorSpp)] <- NA
temp %>%
    ggplot ...

С этим есть две проблемы: если вы фасетите дополнительные столбцы, тогда будет отображаться только каждый majorSpp один раз, по всему графику, тогда как в идеале он должен отображаться один раз в каждом аспекте, где он имеет частоту выше 0,4. Во-вторых, что не очень важно, это нарушает хороший поток в трубе.

Я приложил изображение графика, созданного с помощью этого частичного решения ниже: введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Я не уверен, может ли это помочь, но если я понимаю, вы ищете что-то подобное? Сообщите мне, как это подходит для вашей проблемы:

#Data
mdf <- structure(list(date = c(-2021, -2021, -2020, -2020, -2021, -2021, 
-2020, -2020), species = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 
1L, 2L), .Label = c("cat", "dog"), class = "factor"), frequency = c(0.1, 
0.5, 0.6, 0.5, 0, 0, 0, 0), a_bunch_of_other_cols = structure(c(2L, 
3L, 4L, 1L, 2L, 3L, 4L, 1L), .Label = c("a", "x", "y", "z"), class = "factor")), row.names = c(NA, 
-8L), class = "data.frame")

#Code
mdf %>%
  mutate(majorSpp = ifelse(frequency > 0.4, as.character(species), "")) %>% 
  ggplot(aes(x = date, y = frequency, colour = species, group = species)) +
  geom_point() +
  geom_line()+
  geom_label_repel(aes(label=majorSpp),show.legend = F)+
  facet_wrap(~a_bunch_of_other_cols)

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

0 голосов
/ 17 июля 2020

Секретный соус, которого мне не хватало, был "group_by". Обратите внимание, что summarize избавляется от группировки, поэтому вам нужно повторно добавить его.

df %>%
  filter(morphology != "inanimate") %>%
  group_by(type, date, treatment, species) %>%
  summarise(av = mean(presence), morphology = unique(morphology)) %>%
  group_by(treatment, type) %>%
  mutate(majorSpp = ifelse(av > 0.6, as.character(species), "")) %>%
  mutate(majorSpp = ifelse(duplicated(majorSpp), '', majorSpp)) %>%
  ungroup(treatment, type) %>%
  ggplot(aes(x = date, y = av, colour = morphology, group = species)) +
    geom_line() +
    facet_grid(treatment ~ type) +
    geom_label_repel(aes(label=majorSpp), size=2)

произведено:

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

...