#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())