Как добавить метку geom_text, содержащую данные, в правом верхнем углу ggplot - PullRequest
1 голос
/ 17 апреля 2020

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

d <- data.frame(USArrests)
nrow(d)
d$predictor <- factor(c(rep(c(1, 2), times = 25)))

label <- d %>% 
  group_by(predictor) %>%
  filter(Assault == max(Assault))
label$measure1 <- c(1.45, 5.67)
label$measure2 <- c(4.55, 6.11)

library(ggplot2)
ggplot(d, aes(x=UrbanPop, y=Assault, fill=predictor)) +
  geom_col(position=position_dodge(width = 0, preserve = "single"), width = 5) +
  geom_text(data = label, aes(label = UrbanPop)) +
  geom_text(data = label, aes(label = measure), hjust="right", vjust="top")

Я хочу, чтобы вторая метка в правом верхнем углу говорила красным «мера1 = 1,45», затем на новой строке «мера2 = 4,55», затем под ней зеленым «мера1 = 5.67 "и в новой строке" measure2 = 6.11 ". Очевидно, что «меры» - это динамические c объекты, поэтому я не хочу просто вставлять заголовок stati c. Любая помощь высоко ценится!

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Это немного неуклюже, но вы можете создать полные метки в data.frame и заставить их находиться в разных строках с \n.

d <- data.frame(USArrests)
d$predictor <- factor(c(rep(c(1, 2), times = 25)))

label <- d %>% 
  group_by(predictor) %>%
  filter(Assault == max(Assault))
label$measure1 <- c(1.45, 5.67)
label$measure2 <- c(4.55, 6.11)

label2 <- label %>%
  pivot_longer(measure1:measure2, 'measure', 'value') %>%
  mutate(label = case_when(
    predictor == 1 & measure == 'measure1' ~ paste0(measure, ' = ', value),
    predictor == 1 & measure == 'measure2' ~ paste0('\n', measure, ' = ', value),
    predictor == 2 & measure == 'measure1' ~ paste0('\n\n', measure, ' = ', value),
    predictor == 2 & measure == 'measure2' ~ paste0('\n\n\n', measure, ' = ', value)
  ))

ggplot(d, aes(x=UrbanPop, y=Assault, fill=predictor)) +
  geom_col(position=position_dodge(width = 0, preserve = "single"), width = 5) +
  geom_text(data = label, aes(label = UrbanPop)) +
  geom_text(data = label2, 
            aes(x = Inf, y = Inf, label = label, color = predictor), 
            hjust="right", vjust="top")

enter image description here

0 голосов
/ 17 апреля 2020

Например, используйте x и y = Inf. В вашем примере, огранка имеет смысл, потому что вы передаете метку различным наборам данных.

library(tidyverse)
d <- data.frame(USArrests)

d$predictor <- factor(c(rep(c(1, 2), times = 25)))

label <- d %>% 
  group_by(predictor) %>%
  filter(Assault == max(Assault))
label$measure1 <- c(1.45, 5.67)
label$measure2 <- c(4.55, 6.11)

ggplot(d, aes(x=UrbanPop, y=Assault, fill=predictor)) +
  geom_col(position=position_dodge(width = 0, preserve = "single"), width = 5) +
  geom_text(data = label, aes(label = UrbanPop)) +
  geom_text(data = label, aes(x = Inf, y = Inf, label = measure2), hjust="right", vjust="top")+
  facet_grid(~predictor)
#> Warning: position_dodge requires non-overlapping x intervals

#> Warning: position_dodge requires non-overlapping x intervals

Создано в 2020-04-17 пакетом Представить (v0.3.0)

...