Есть ли способ объединить столбцы из двух отдельных столбчатых графиков с накоплением в один график?

#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 снова спасает положение. Виртуального пива вам.