Неправильная позиция уклоненных панелей ошибок, когда aes (группа = ...), но не aes (fill / shape = ...) - PullRequest
3 голосов
/ 27 мая 2019

Построение столбцов ошибок с position = "dodge" вызвало у меня много головных болей в последнее время ... Любопытно, что уклонение их от эстетики shape или fill (что не должно применяться к столбцам ошибок), похоже, работает хорошо.Однако уклонение от эстетики group ставит бары в неожиданные позиции.Мне было интересно, может ли это быть ошибкой ggplot2.

Мне нравится размещать пользовательские панели ошибок за гистограммами или коробками.Иногда я придаю особые цвета различным элементам моих сюжетов.По этой причине я часто включаю aes() не в функцию ggplot(), а в geoms или stats.

Вот пример «удачно размещенных» панелей ошибок:

library(ggplot2)
library(dplyr)

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0) 

Plot1

Это выдает предупреждение Warning: Ignoring unknown aesthetics: fill.Использование aes(shape = supp) печатает тот же график.

Я ожидал бы, что тот же график, но без предупреждений, заменив заливку / форму на «group» (aes(group = supp)).Это не дает никаких предупреждений, но очень неожиданный результат:

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)  

Plot2

Кто-нибудь может объяснить это поведение?Разве группировка с aes(group = ...) и aes(fill = ...) не должна вести себя одинаково на позиции уклонения?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

С ?aes_group_order (выделение добавлено):

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

С

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge")

Группа для столбцов ошибок автоматически устанавливается на взаимодействие дозы (которая была преобразована в фактор, то есть дискретную переменную) и supp (которая ужефактор в наборе данных роста зуба).Другими словами, каждая комбинация дозы c(0.5, 1, 1.5) и Supp c("OJ", "VJ") рассматривается как отдельная группа для целей расчета сводной статистики по коробочному графику.В результате отображаемые полосы ошибок идеально соответствуют слою коробочного графика, хотя заливка не относится к эстетике для geom_errorbar.

с

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge")

Группа для панелей ошибокявно установлено как supp и only supp.Это отменяет поведение по умолчанию, поэтому вместо 6 групп, как указано выше, у нас есть только две (одна для «OJ» и одна для «VJ»).Это приводит к несоответствию между слоем панелей ошибок и слоем boxplot.

Вы можете явно настроить отображение группы так, чтобы имитировать поведение по умолчанию:

p1 <- ToothGrowth %>%
  mutate(dose = factor(dose)) %>%
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = interaction(dose, supp)), geom = "errorbar", position = "dodge") +
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)
p1
layer_data(p1, 1L) # view data associated with error bar layer
layer_data(p1, 2L) # view data associated with boxplot layer

p2 <- ToothGrowth %>%
  mutate(dose = factor(dose)) %>%
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = interaction(supp, dose)), geom = "errorbar", position = "dodge")+
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)
p2
layer_data(p2, 1L) # view data associated with error bar layer
layer_data(p2, 2L) # view data associated with boxplot layer

Примечание: interaction(dose, supp) и interaction(supp, dose) приведут к тому же графику с точки зрения внешнего вида, хотя, если вы хотите сравнить базовые данные, связанные с каждым слоем, interaction(dose, supp) генерирует группы в том же порядке, что и по умолчанию, тогда как interaction(supp, dose)не.

0 голосов
/ 27 мая 2019

Код игнорирует неизвестную эстетику: fill

stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") 

Принимая во внимание, что код учитывает эстетику group = supp и выдает две панели ошибок каждый для OJ и VC .

stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge")

Полный код

library(ggplot2)
library(dplyr)

ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(fill = supp), geom = "errorbar", position = "dodge") +
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0) 

Warning: Ignoring unknown aesthetics: fill



ToothGrowth %>% 
  mutate(dose = factor(dose)) %>% 
  ggplot(aes(dose, len)) +
  stat_boxplot(aes(group = supp), geom = "errorbar", position = "dodge") + 
  geom_boxplot(aes(fill = supp), position = "dodge", coef = 0)  
...