ggplot2 не добавит легенду на боксплот с несколькими слоями - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь добавить легенду к своему блокпосту с данными этого примера

    BM  math  loginc
    1    2     1.4523
    0    3     2.3415
    1    1     0.6524
    1    3     2.4562
    0    1     3.5231
    0    2     2.4532

По сути, у меня есть две группы BM = 0 и BM = 1, 3 категории в каждой группе (математика = 1, 2 или 3) и значение логина c.

boxcolors=c('gray70','orange','red','gray70','orange','red')

bothboxplot=ggplot(both, aes(x=math,y=loginc))+
  geom_boxplot(fill=boxcolors)+
  stat_summary(fun.y=mean,color=line,geom = "point",shape=3,size=2)+
  scale_x_discrete(name='Site Category')+
  scale_y_continuous(name='Log(Incidence/100,000)')+
  facet_grid(.~BM)

  bothboxplot

Это приводит к следующему графику: Boxplot

Этот график является полностью правильным, кроме из-за отсутствия легенды. Я поиграл с расположением aes (), и это не сработает. Когда aes () помещается в ggplot (), а не в geom_plot (), моя инструкция fill выдает ошибку («Ошибка: эстетика должна иметь длину 1 или совпадать с данными (187): fill».

В идеале у легенды, которую я хотел бы иметь, должны быть имена 1,2,3 математических категорий, их соответствующие цвета и символ (+) в каждом поле, помеченный как «Среднее».

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Дело в том, что вы не сопоставляете переменную с заливкой aestehti c, то есть сопоставляете math с fill и устанавливаете цвет заливки вручную с помощью scale_fill_manual:

library(tidyverse)

both <- tibble(
  BM = sample(0:1, 100, replace = TRUE),
  math = sample(1:3, 100, replace = TRUE),
  loginc = runif(100))

bothboxplot <- ggplot(both, aes(factor(math), loginc, fill = factor(math)) +
  geom_boxplot() +
  stat_summary(fun.y = mean, geom = "point", shape = 3, size = 2)+
  scale_fill_manual(values = c('gray70','orange','red')) +
  scale_x_discrete(name = 'Site Category')+
  scale_y_continuous(name = 'Log(Incidence/100,000)')+
  facet_grid(.~BM)

bothboxplot
0 голосов
/ 03 марта 2020

Вам нужно передать столбец для fill в эстетику c:

df <- 
  tibble(
    loginc = rnorm(n = 12, mean = 0, sd = 1),
    BM = rep(c(0, 1), each = 6),
    math = rep(1:3, 4)
  ) %>% 
  mutate(math = factor(math))

df %>% 
  ggplot(aes(x = math, y = loginc, group = math, fill = math)) +
  geom_boxplot() +
  stat_summary(fun.y = mean, geom = "point", shape=3, size=2) +
  facet_grid(~ BM)

enter image description here

...