Условное затенение столбцов в ggplot для столбчатых диаграмм с несколькими рядами

#r #ggplot2 #bar-chart

#r #ggplot2 #столбчатая диаграмма

Вопрос:

Я создаю столбчатые диаграммы, которые показывают разницу между группами за отдельные периоды, однако я также хочу затенить определенные столбцы, которые не соответствуют определенным критериям (например, CV> 20 или Sample_size <30).

Может кто-нибудь, пожалуйста, помочь мне сделать это? Я приложил картинку в качестве примера того, как я хочу, чтобы выглядел мой результат (смоделированный в Excel), и некоторые примеры данных ниже.

Миллион благодарностей!!

Пример данных:

     structure(list(Group = c("A", "B", "C", "D", "E", "F", "G", "H", 
"I", "J", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J"), 
    Perc = c(38, 38, 46, 27, 18, 39, 43, 27, 38, 40, 39, 39, 
    50, 32, 33, 41, 52, 32, 43, 43), Lower_CI = c(36, 36, 36, 
    15, 8, 31, 30, 14, 18, 23, 38, 37, 40, 21, 15, 31, 40, 17, 
    24, 27), Upper_CI = c(39, 40, 57, 39, 27, 47, 55, 40, 58, 
    56, 41, 41, 60, 44, 51, 51, 64, 47, 63, 60), CV = c(2, 2, 
    11, 12, 28, 11, 15, 6, 18, 13, 2, 2, 10, 19, 5, 13, 12, 23, 
    14, 20), Sample_size = c(30, 15, 140, 40, 69, 75, 56, 256, 
    45, 536, 4852, 785, 36, 48, 315, 120, 83, 15, 123, 45), Period = c(1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))
  

Требуется пример столбчатой диаграммы

Ответ №1:

Вы можете попробовать dplyr ggplot2 конвейер и. Вы можете интегрировать новое значение для Period использования mutate() . После этого вы также можете сохранить тот же порядок для Group его форматирования в качестве фактора. Желаемый график — это график с уклоном. Используя ggplot2 функции, вы можете достичь этого. Наконец, переместите ось с помощью coord_flip() . Созданный дополнительный уровень можно удалить с помощью breaks inside scale_fill_manual() . Здесь код:

 library(ggplot2)
library(dplyr)
#Code
df %>%
  mutate(Period=ifelse(CV>20 | Sample_size<30,3,Period),
         Group=factor(Group,levels = rev(unique(Group)),ordered = T))%>%
  ggplot(aes(x=Group,y=Perc,fill=factor(Period))) 
  geom_bar(stat = 'identity',position = position_dodge(0.9)) 
  geom_errorbar(aes(x=Group,ymin=Lower_CI,ymax=Upper_CI,group=Period),
                position = position_dodge(0.9)) 
  scale_fill_manual(values=c('cornflowerblue','orange','gray'),
                    breaks=c('1','2')) 
  labs(fill='Period') 
  theme_bw() 
  coord_flip()
  

Вывод:

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

Некоторые используемые данные:

 #Data
df <- structure(list(Group = c("A", "B", "C", "D", "E", "F", "G", "H", 
"I", "J", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J"), 
    Perc = c(38, 38, 46, 27, 18, 39, 43, 27, 38, 40, 39, 39, 
    50, 32, 33, 41, 52, 32, 43, 43), Lower_CI = c(36, 36, 36, 
    15, 8, 31, 30, 14, 18, 23, 38, 37, 40, 21, 15, 31, 40, 17, 
    24, 27), Upper_CI = c(39, 40, 57, 39, 27, 47, 55, 40, 58, 
    56, 41, 41, 60, 44, 51, 51, 64, 47, 63, 60), `(-)` = c(2, 
    2, 10, 12, 10, 8, 13, 13, 20, 17, 1, 2, 10, 11, 18, 10, 12, 
    15, 19, 16), `( )` = c(1, 2, 11, 12, 9, 8, 12, 13, 20, 16, 
    2, 2, 10, 12, 18, 10, 12, 15, 20, 17), CV = c(2, 2, 11, 12, 
    28, 11, 15, 6, 18, 13, 2, 2, 10, 19, 5, 13, 12, 23, 14, 20
    ), Sample_size = c(30, 15, 140, 40, 69, 75, 56, 256, 45, 
    536, 4852, 785, 36, 48, 315, 120, 83, 15, 123, 45), Period = c(1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))
  

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

1. Большое вам спасибо, это именно то, что я хотел: D

2. @barnesybee Всегда рад!

Ответ №2:

Вы могли бы сделать что-то вроде этого:

 library(ggplot2)

#create variable for color/fill 
df$col <- df$Period
df$col[df$Sample_size < 30 | df$CV > 20] = 3
df$col <- as.factor(df$col)

#plot
ggplot(data = df, aes(x = Group, y = Perc, group = Period, 
                      color = col, fill = col))  
  geom_bar(stat = "identity", position = position_dodge())  
  geom_errorbar(aes(ymin = Lower_CI, ymax = Upper_CI), 
                position = position_dodge()) 
  scale_color_manual(values = c("blue", "orange", "grey"), 
                     breaks = c("1", "2"),)  
  scale_fill_manual(values = c("blue", "orange", "grey"), 
                    breaks = c("1", "2"))  
  coord_flip() 
  theme_bw()   theme(legend.title = element_blank())
  

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