Аннотировать фазовый график с помощью сгруппированных переменных - PullRequest
1 голос
/ 23 января 2020

Я бы хотел разместить номера наблюдений над фасетным блокпостом. Вот пример:

exmp = mtcars %>% as_tibble() %>%
  mutate(cartype = as.factor(row.names(mtcars))) %>% 
  group_by(cyl, am, gear) %>% 
  mutate(N = n())

ggplot(exmp, aes(x = am, fill = gear, y = wt)) +
  facet_grid(.~cyl) +
  geom_boxplot() +
  geom_text(aes(y = 6, label = N))

Итак, я уже создал столбец N, чтобы получить метку над каждым блоком в блокпосте (комбинация cyl, am и gear). Как мне нанести эти метки так, чтобы они находились над соответствующим полем? Обратите внимание, что количество уровней экипировки для каждого уровня am отличается специально .

Я действительно просмотрел много уроков по ggplot, и есть множество вопросов, касающихся аннотирования на фасетных графиках. Но никто не решил эту довольно распространенную проблему ... enter image description here

Ответы [ 3 ]

3 голосов
/ 23 января 2020

Одна небольшая проблема заключается в том, что вы печатаете значение N один раз для каждой точки данных, а не один раз для каждой комбинации цил / ам / редуктор. Поэтому вы можете захотеть добавить шаг фильтрации, чтобы избежать переполнения этого текста, что может выглядеть грязно на экране, снизить контроль над альфа-каналом и замедлить построение графиков в случаях с большими данными.

library(tidyverse)
exmp = mtcars %>% as_tibble() %>%
  mutate(cartype = as.factor(row.names(mtcars))) %>% 
  group_by(cyl, am, gear) %>% 
  mutate(N = n()) %>%
  ungroup() %>%
  mutate(am = as.factor(am),
         gear = as.factor(gear))

(Данные Приготовление выше было необходимо, чтобы график выглядел как ваш пример. Я использую tidyverse 1.2.1 и ggplot2 3.2.1)

ggplot(exmp, aes(x = am, fill = gear, y = wt, 
                 group = interaction(gear, am))) +
  facet_grid(.~cyl) +
  geom_boxplot() +
  geom_text(data = exmp %>% distinct(cyl, gear, am, N),
            aes(y = 6, label = N),
            position = position_dodge(width = 0.8))

enter image description here

Вот тот же график с оверплоттингом:

enter image description here

3 голосов
/ 23 января 2020

Вам нужно дать position_dodge() внутри geom_text, чтобы соответствовать положению ящиков, также определите аргумент data, чтобы получить distinct значение наблюдений:

ggplot(exmp, aes(x = as.factor(am), fill = as.factor(gear), y = wt)) +
  geom_boxplot() +
  facet_grid(.~cyl) + 
  geom_text(data = dplyr::distinct(exmp, N), 
            aes(y = 6, label = N), position = position_dodge(0.9))

enter image description here

1 голос
/ 23 января 2020

Возможно, использование position_dodge() в вашем geom_text() даст вам то, что вы хотите?

mtcars %>% as_tibble() %>%
  mutate(cartype = as.factor(row.names(mtcars))) %>% 
  group_by(cyl, am, gear) %>% 
  mutate(N = n()) %>% 
  ggplot(aes(x = as.factor(am), fill = as.factor(gear), y = wt)) +
  geom_boxplot() +
  geom_text(aes(y = 6, label = N), position = position_dodge(width = 0.7)) +
  facet_grid(.~cyl)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...