отображение boxplot для некоторой переменной x с точечной диаграммой

#r #ggplot2

#r #ggplot2

Вопрос:

Я пытаюсь отобразить прямоугольную диаграмму для некоторой переменной x, например, здесь для продолжительности 4 и 5 я должен отобразить boxplot и наложить его на диаграмму рассеяния. Также я должен переименовать ось x. Я использую приведенный ниже код. Проблема в том, что ось x смещается, как .11,12 становится перед 3,4.

 ggplot(data=data_1,aes(x=DUR,y=val)) 
  geom_boxplot(data=subset(data_1[,c("val","ID","DUR")],data_1$DUR %in% c(4,5)), aes(DUR,val)) 
  geom_jitter(data=subset(data_1, !is.na(DUR)),aes(x=DUR,y=val),position=position_jitter(width=.1, height=0),alpha=0.5,size=4,color='grey') 
  labs(y = "val", x = "Duration",title='val data%') 
  stat_compare_means(comparisons = comparison_1, label.y =  c(56,57,59)) 
  stat_compare_means(size=5,label.y = 50,method ="anova") theme(
    axis.text.x = element_text(size=16,angle=0,vjust = 0.5),
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank()) 
  theme(axis.ticks=element_line(colour = "black"),
        panel.border =  element_rect(colour = "black", fill=NA, size=0.5),panel.background = element_blank()) 
  theme(legend.position = "none") 
  scale_x_discrete(name = 'DUR',breaks = c('3','4', '5', '6', '7', '9','11','12'), 
                   labels = c('Exp-3nDur 6','Exp-4nDur 7', 'Exp-5nProcess 8', 'Exp-6nDur 9', 'Exp-7nDur 10', '9','11','12')) 
  theme(axis.text.x = element_text(face = c('bold', 'bold', 'bold', 'bold', 'bold','plain', 'plain','plain'),size = c('11','11','11','11','11','9','9','9')))

  

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

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

1. Попробуйте запустить data_1$DUR <- as.numeric(as.character(data_1$DUR)) , а затем повторить свой код графика. Трудно понять, в чем проблема, не видя ваших данных.

2. я сделал это перед запуском ggplot data1$DUR<-as.numeric(as.character(data1$DUR)) data1$DUR<-as.factor(as.numeric(data1$DUR)) . Проблема где-то возникает, когда я использую подмножество для boxplot и выбираю дни 4 и 5, в то время как для scatter я рассматриваю все дни

3. Пожалуйста, включите воспроизводимый пример, чтобы мы могли вам легче помочь.

4. вы можете видеть рисунок. Я использую функцию подмножества для получения дней 4,5 в boxplot и использую все дни в режиме дрожания, но после построения графика ось x смещается. перед Exp3 / Dur6 отображаются 11 и 12 дней. эти 2 должны быть в конце после 9-го дня. Я использовал коэффициент для выравнивания дней.

Ответ №1:

Пожалуйста, замените breaks на limits in scale_x_discrete . Это должно сделать это. В качестве примера я запустил его mtcars ниже. При breaks этом вы получите 11 до 4 x-axis , как в вашем случае.

   data1 <- mtcars %>% select(mpg, cyl, carb) %>% rename(val=mpg, ID=cyl, DUR=carb)
  data1$DURN <- data1$DUR   3
  data_1 <- data1
  data_1$DUR <- as.character(data1$DURN)
  
  p <- ggplot(data=data_1,aes(x=DUR, y=val)) 
    geom_boxplot(data=subset(data_1[,c("val","ID","DUR")],data_1$DUR %in% c(4,5)), aes(DUR,val)) 
    geom_jitter(data=subset(data_1, !is.na(DUR)),aes(x=DUR,y=val),position=position_jitter(width=.1, height=0),alpha=0.5,size=4,color='grey') 
    labs(y = "mpg", x = "carb plus three",title='mpg data%')   
    # stat_compare_means(comparisons = comparison_1, label.y =  c(56,57,59)) 
    # stat_compare_means(size=5,label.y = 20,method ="anova")  
    theme(
      axis.text.x = element_text(size=12,angle=0,vjust = 0.5),
      panel.grid.major.x = element_blank(),
      panel.grid.minor.x = element_blank(),
      axis.ticks=element_line(colour = "black"),
      panel.border =  element_rect(colour = "black", fill=NA, size=0.5),
      panel.background = element_blank())  
    theme(legend.position = "none")  
    scale_x_discrete(name = 'DURATION', limits = c('4', '5', '6', '7', '9','11'),
                     labels = c('Exp-4nDur 7', 'Exp-5nProcess 8', 'Exp-6nDur 9', 'Exp-7nDur 10', '9','11')
                     )   
    theme(axis.text.x = element_text(face = c( 'bold', 'bold', 'bold', 'bold','plain', 'plain'),size = c('11','11','11','11','9','9')))
  

ОБНОВЛЕНИЕ: добавление некоторых пользовательских аннотаций внизу красным цветом.

   ### create a dataframe to pass in textGrob
  xc <- c('4', '5', '6', '7', '9', '11')
  x_axis <- c(1:6)
  y_axis <- rep(10,6)
  dfx <- data.frame(xc, x_axis, y_axis)
  
  #Add annotations
  for (i in 1:length(unique(dfx$xc))){
    p <- p   annotation_custom(textGrob(label = paste0('n=',dfx$xc[i]),
                               # rot = 90,  ## if you wish to rotate
                               gp = gpar(fontsize = 10, col="red")),
      xmin = dfx$x_axis[i],
      xmax = dfx$x_axis[i],
      ymin = dfx$y_axis[i],
      ymax = dfx$y_axis[i]
    )
  }
  p
  

вывод

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

1. Спасибо @YBS за помощь. У меня есть еще одно требование, где мне нужно отметить количество дней в верхней части графика. как и для EXP-4, существует n = 7, EXp-5, n = 9, Exp-6 n = 3. Эти n значений мне нужно поместить сверху для каждого значения x.

2. Спасибо @YBS. Я подумал спросить здесь, поскольку это было продолжение вопроса. Мне просто нужно каждый день указывать количество ячеек сверху. Я не смог понять, как добавить еще одну функцию scale_x_discrete.