Использовать geom_boxplot с переменной типа double по оси x

#r #ggplot2

#r #ggplot2

Вопрос:

Мой набор данных выглядит следующим образом:

 df = tibble (
    gender = rep(c("fem","mal"),each=10),
    C = rep(rep(c(0,1), each=5),2),
    r = rep(c(0,1,2,3,4),4),
    value = rnorm(n = 20,mean = 5,sd = 1)
)
  

И у меня возникла проблема при построении ее с:

 df %>% ggplot()   geom_boxplot(aes(x=C,y=value,fill=gender))
  

Поскольку графики не разделены значениями моей переменной C, я полагаю, потому, что она имеет тип double. На самом деле, если я напишу aes(x=factor(C), ...) , проблема исчезнет.

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

Комментарии:

1. Проблема с scale_x_discrete заключается в том, что, например, для более широкого диапазона значений моей переменной, x=C если я ее установлю breaks=c(0.0,0.5,1.0) , она не получит полный диапазон (фактически она показывает только «0.5» по оси x). Возможно, более естественно решить эту проблему в том же масштабе, в каком должна быть исходная переменная

2. В комментарии я имел в виду «более широкий диапазон значений моей переменной x=C «. Данные в исходном сообщении призваны воспроизвести проблему, но реальные данные, конечно, имеют больше значений, включая значения для переменной по этой оси.

3. Вы можете добавить group = interaction(gender, C) в свой aes

4. @kath На самом деле это работает так, как ожидалось, хотя я не знаю, что именно делает. Если вы можете сформулировать это в виде ответа, я приму его. Спасибо!

Ответ №1:

Добавление группы в вашу эстетику решает проблему. Я добавил scale_x_continuous — вызов, чтобы продемонстрировать, что это работает, а также показать, как вы можете захотеть управлять шириной ваших коробочных графиков с помощью width и position_dodge .

 ggplot(df)  
  geom_boxplot(aes(x = C, y = value, fill = gender, group = interaction(gender, C)), 
               position = position_dodge(0.1), width = 0.1)   
  scale_x_continuous(breaks = seq(0, 1, 0.2))
  

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

Что такое interaction(gender, C) и почему это работает?
interaction создает специальную множительную переменную, вставляя значения gender и C вместе. Мы можем видеть, как это работает, если представить его как fill эстетичный:

 ggplot(my.df)  
  geom_boxplot(aes(x = C, y = value, fill = interaction(gender, C)))
  

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

Когда она добавляется как group эстетическая, она сообщает ggplot, какие группы boxplot вы хотели бы иметь.