Подтвердить что ты не робот

Ширина коробки в ggplot с перекрестными классифицированными группами

Я делаю boxplots с ggplot с данными, которые классифицируются по 2 факторным переменным. Я бы хотел, чтобы размеры ящиков отображали размер выборки через varwidth = TRUE, но когда я делаю это, поля перекрываются.

1) Некоторые выборочные данные с структурой 3 x 2

data <- data.frame(group1= sample(c("A","B","C"),100, replace = TRUE),group2= sample(c("D","E"),100, replace = TRUE) ,response = rnorm(100, mean = 0, sd = 1))

2) По умолчанию ящики: ggplot без переменной ширины

ggplot(data = data, aes(y = response, x = group1, color = group2)) + geom_boxplot()

enter image description here

Мне нравится, как показан первый уровень группировки.
Теперь я пытаюсь добавить переменную ширину...

3)... и что я получаю, когда varwidth = TRUE

ggplot(data = data, aes(y = response, x = group1, color = group2)) + geom_boxplot(varwidth = T)

enter image description here

Такое совпадение похоже на то, что я использую color = group2 или group = group2 как в главном вызове ggplot, так и в операторе geom_boxplot. Суета с position_dodge тоже не помогает.

4) Решение, которое мне не нравится визуально, состоит в том, чтобы создать уникальные факторы, объединив мои группы1 и group2

data$grp.comb <- paste(data$group1, data$group2)

ggplot(data = data, aes(y = response, x = grp.comb, color = group2)) + geom_boxplot()

enter image description here

Я предпочитаю группировать вещи, чтобы отразить перекрестную классификацию

5) Путь вперед: Я хотел бы либо a) выяснить, как либо сделать varwidth = TRUE не вызывать перекрытия ящиков, либо b) вручную скорректировать пространство между объединенными группами, чтобы поля в пределах 1-го уровня группировки были ближе друг к другу.

4b9b3361

Ответ 1

Я думаю, что ваша проблема может быть решена лучше всего, используя facet_wrap.

    library(ggplot2)
    data <- data.frame(group1= sample(c("A","B","C"),100, replace = TRUE), group2= 
    sample(c("D","E"),100, replace = TRUE) ,response = rnorm(100, mean = 0, sd = 1))

    ggplot(data = data, aes(y = response, x = group2, color = group2)) + 
      geom_boxplot(varwidth = TRUE) +
      facet_wrap(~group1)

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

Ответ 2

Недавнее обновление ggplot2 делает его таким, чтобы код, предоставленный @N Brouwer в (3), работал так, как ожидалось:

# library(devtools)
# install_github("tidyverse/ggplot2")

packageVersion("ggplot2") # works with v2.2.1.9000
library(ggplot2)
set.seed(1234)
data <- data.frame(group1= sample(c("A","B","C"), 100, replace = TRUE),
                   group2= sample(c("D","E"), 100, replace = TRUE),
                   response = rnorm(100, mean = 0, sd = 1))

ggplot(data = data, aes(y = response, x = group1, color = group2)) + 
  geom_boxplot(varwidth = T)

(Я новый пользователь и не могу отправлять изображения в строке) fig 1

Ответ 3

На этот вопрос ответили ggplot увеличить расстояние между ящиками

Ответ включает использование аргумента position = position_dodge() geom_boxplot().

В вашем примере:

data <- data.frame(group1= sample(c("A","B","C"),100, replace = TRUE),  group2= 
                 sample(c("D","E"),100, replace = TRUE) ,response = rnorm(100, mean = 0, sd = 1))

ggplot(data = data, aes(y = response, x = group1, color = group2)) + 
 geom_boxplot(position = position_dodge(1))

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