Проблема с отрисовкой кода попеременно заштрихованным boxplot (ggplot2, R) - PullRequest
0 голосов
/ 02 июля 2019

Я хотел бы нарисовать альтернативные оттенки / прямоугольники на блокпосте, аналогично второму изображению в этом посте: Добавление альтернативных областей затенения для категориальной переменной в гистограмме в ggplot2

Ниже приведен мой код на примере mtcars. Я преобразовал карб и цил в фактор, чтобы лучше соответствовать моим реальным данным и коду

 library(ggplot2)
 odd_numbers <- seq(1,33,2)
 mtcars$carb <- as.factor(mtcars$carb)
 mtcars$cyl <- as.factor(mtcars$cyl)
 ggplot(mtcars) + 
   geom_boxplot(aes(x = carb, y = mpg, fill = cyl), position = position_dodge(0.9)) + 
   geom_rect(data = mtcars, aes(x = carb, y = mpg), 
             xmin= as.numeric(mtcars$carb[odd_numbers]) - 0.5, 
             xmax = as.numeric(mtcars$carb[odd_numbers]) + 0.5, 
             ymin = -Inf, 
             ymax = Inf, fill='grey', alpha=0.5)

Я думал, что проблема с числовой осью X была решена в коде, но есть проблема:

Предупреждение: игнорирование неизвестной эстетики: x, y

Ошибка: эстетика должна иметь длину 1 или совпадать с данными (32): xmin, xmax

Может кто-нибудь есть предложение, пожалуйста? Спасибо.

EDIT

Следуя комментариям, я отредактировал код, как показано ниже: - удалено [odd_numbers] - Поменялся порядок geom_boxplot и geom_rect

Код:

 library(ggplot2)
 odd_numbers <- seq(1,33,2)
 mtcars$carb <- as.factor(mtcars$carb)
 mtcars$cyl <- as.factor(mtcars$cyl)
 ggplot(mtcars) + 
   geom_rect(data = mtcars, aes(x = carb, y = mpg), 
         xmin= as.numeric(mtcars$carb) - 0.5, 
         xmax = as.numeric(mtcars$carb) + 0.5, 
         ymin = -Inf, 
         ymax = Inf, fill='grey', alpha=0.5) + 
   geom_boxplot(aes(x = carb, y = mpg, fill = cyl), position = position_dodge(0.9))

Это приводит к следующему, так что пока не совсем. Спасибо.

enter image description here

Желаемый результат похож на этот:

enter image description here

1 Ответ

1 голос
/ 02 июля 2019

Как я уже сказал в комментарии , аргумент data и другие аргументы должны совпадать по размеру.Так что извлекайте только odd_numbers из mtcars в вызове geom_rect.И нет необходимости устанавливать xmin и xmax путем поднабора mtcars$carb, использовать odd_numbers напрямую.
И поменять местами два geoms, чтобы иметь прямоугольники над серыми прямоугольниками.
Обратите внимание, что яизменили odd_numbers до 32, а не 33. Одно значение после nrow(mtcars) приведет к ошибке.

library(ggplot2)

mtcars$carb <- as.factor(mtcars$carb)
mtcars$cyl <- as.factor(mtcars$cyl)

odd_numbers <- seq(1, 32, 2)

ggplot(mtcars) + 
   geom_rect(data = mtcars[odd_numbers, ], 
             xmin = odd_numbers - 0.5, 
             xmax = odd_numbers + 0.5, 
             ymin = -Inf,
             ymax = Inf, fill = 'grey', alpha = 0.5) +
   geom_boxplot(aes(x = carb, y = mpg, fill = cyl), 
                position = position_dodge(0.9))

enter image description here

...