#r #ggplot2 #bar-chart
#r #ggplot2 #столбчатая диаграмма
Вопрос:
Я хочу создать единый столбчатый график с накоплением, в котором указано, сколько исследований (ось Y) было запрошено и завершено для каждого проекта (ось X) по категориям исследований. Каждый проект будет иметь два столбчатых столбца с накоплением, один для запрошенных исследований, а другой для завершенных исследований.
Вот пример того, что я использую для обработки данных:
Я могу разделить его на один набор данных для запрошенных исследований и один набор для завершенных, и я придумал это (игнорируйте нелепые цвета и названия):
И это код, который я использую:
data<-read.csv("table56req.csv")
data
library(ggplot2)
ggplot(data=data, aes(x=proj, y=req, fill=cat))
geom_bar(stat="identity", position="stack")
labs(title="Type of Study by Project", x="Project", y="Number of Studies")
theme(plot.title = element_text(size=30,hjust = 0.5))
theme(panel.background = element_rect(fill = 'white'))
theme(axis.line = element_line(color="black", size = 0.5))
theme(axis.text.x= element_text(size=10,color = "black"))
theme(axis.text.y = element_text(size=12, color = "black"))
scale_y_continuous(breaks=seq(0,20,5))
scale_x_discrete(labels=c("Bowersock","Dorena","Holtwood","Jackson","Milford","Nisqually","Smoky Mtn"))
theme(axis.title.x = element_text(face="bold", size=12,vjust=-0.5,hjust=0.5))
theme(axis.title.y = element_text(face="bold", size=12,vjust=2,hjust=.5))
scale_fill_discrete(name = "Categories", labels = c("Biota and Biodiversity","Connectivity and Fragmentation","Geomorphology","Landcover","Water Quality","Water Quantity"))
theme(panel.border = element_rect(colour = "black", fill=NA),legend.box.background = element_rect(colour = "black"), legend.background = element_rect(linetype = "solid", colour = "black"))
theme(legend.title.align=0.5)
Кто-нибудь знает, возможно ли это вообще?
Комментарии:
1. Да, полезно повторное представление фактических данных, а не их изображение.
2. Извините, утенок, я сделаю это в следующий раз.
Ответ №1:
Да, это возможно, но вам, вероятно, потребуется использовать фасеты. Это не огромная проблема, поскольку фасеты легко скрыть.
В вашем вопросе было изображение данных, а не что-либо, что можно скопировать и вставить, поэтому я создал простой воспроизводимый пример со структурой, аналогичной вашему фрейму данных:
df <- data.frame(cat = factor(paste("cat ", rep(letters[1:5], each = 4))),
proj = factor(paste("proj", rep(LETTERS[1:4], 5))),
req = c(0, 10, 10, 11, 7, 11, 11, 1, 2, 3,
2, 2, 1, 0, 0, 2, 0, 1, 2, 1),
comp = c(0, 12, 11, 15, 6, 15, 15, 1, 2, 3,
2, 1, 1, 1, 0, 1, 2, 1, 2, 1))
df
#> cat proj req comp
#> 1 cat a proj A 0 0
#> 2 cat a proj B 10 12
#> 3 cat a proj C 10 11
#> 4 cat a proj D 11 15
#> 5 cat b proj A 7 6
#> 6 cat b proj B 11 15
#> 7 cat b proj C 11 15
#> 8 cat b proj D 1 1
#> 9 cat c proj A 2 2
#> 10 cat c proj B 3 3
#> 11 cat c proj C 2 2
#> 12 cat c proj D 2 1
#> 13 cat d proj A 1 1
#> 14 cat d proj B 0 1
#> 15 cat d proj C 0 0
#> 16 cat d proj D 2 1
#> 17 cat e proj A 0 2
#> 18 cat e proj B 1 1
#> 19 cat e proj C 2 2
#> 20 cat e proj D 1 1
Нам нужно изменить форму данных так, чтобы они были в длинном формате (т. Е. все значения находятся в одном столбце, и есть новый столбец факторов, определяющий, является ли значение req
или comp
). Для этого вы можете использовать tidyr::pivot_longer
.
pivot_longer(df, cols = c("req", "comp")) %>%
ggplot(aes(name, value, fill = cat))
geom_col()
facet_grid(~proj, switch = "x")
scale_x_discrete(expand = c(0.5, 0.5))
scale_fill_viridis_d()
labs(x = "Project")
theme_classic()
theme(panel.spacing = unit(0, "points"),
strip.placement = "outside",
strip.background = element_blank())
Комментарии:
1. Я думаю, что если бы я зашел на этот веб-сайт и спросил, как я могу использовать R для открытия фонтана молодости, в течение 10 минут у кого-нибудь был бы ответ. Аллан, ты понятия не имеешь, насколько это мне помогает. Большое вам спасибо!!
2. еще один вопрос — есть ли способ сделать так, чтобы запрашиваемый столбец был первым?
3. @MatthewAldrovandi да. Вставьте эту строку
mutate(name = factor(name, levels = c("req", "comp"))) %>%
междуpivot_longer
строкой иggplot
строкой4. Ааааа И @Allan Cameron снова спасает положение. Виртуального пива вам.