Как создать столбчатую диаграмму с 2 числовыми переменными в R с помощью ggplot, сгруппированную по 1 факторной переменной?

#r #ggplot2

#r #ggplot2

Вопрос:

Я довольно новичок в R, и это мой первый вопрос здесь, поэтому прошу прощения, если я напишу его сбивающим с толку способом!

По сути, у меня есть фрейм данных с 4 столбцами, месяцем и сайтом, которые являются факторами, а также органические% и неорганические%, которые являются числовыми:

 df<-data.frame(month = c("Mar", "Apr", "May", "Jun", "Jul", "Mar", "Apr", "May", "Jun", "Jul"), site = c("Borth", "Borth", "Borth", "Borth", "Borth", "Clarach", "Clarach", "Clarach", "Clarach", "Clarach"), organic = c(10,20,30,40,50), inorganic = c(90,80,70,60,50))
  

Я хотел бы создать столбчатую диаграмму на ggplot, которая имеет «органический / неорганический%» по оси y, при этом органические и неорганические проценты укладываются друг на друга в каждом столбце, а столбцы сгруппированы по сайтам, с «месяцем» на оси x (таким образом, 2 сложенных столбца в месяц). Пока что из того, что я видел, stacked работает только с одной переменной, и вам нужно выбирать между grouped и stacked для позиции…

Я предполагаю, что график в конечном итоге будет содержать легенду с органическим% borth, органическим% clarach, неорганическим% borth, неорганическим% clarach.

Я не уверен, имеет ли смысл то, что я написал, но если бы кто-нибудь мог предложить какую-либо помощь, это было бы так здорово!

Ответ №1:

Это еще один способ, отличный от приведенного выше ответа, рассмотреть, как представить ваши данные. Использование facet_wrap позволяет вам группировать ваши данные:

 library(tidyverse)

# can also use library(dplyr); library(ggplot2); library(tidyr)

f %>% 
pivot_longer(c("organic", "inorganic")) %>% 
ggplot(aes(x = site, y = value, fill = name))   
geom_bar(position = "fill", stat = "identity")   
facet_grid(~month)       
scale_y_continuous(labels = scales::percent_format())
  

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

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

1. Удивительно! Большое вам спасибо. Есть ли какой-либо способ получить ось y от 0 до 100% вместо от 0 до 1?

2. @mbroadribb Для этого он обновлен. Не обновлял изображение, потому что оно сохранялось слишком долго (мой компьютер тупой)

Ответ №2:

Попробуйте это. Ваши данные в широком формате, поэтому вы можете изменить их для длительного использования pivot_longer() . Если вы хотите, чтобы легенда была объединена двумя переменными, вы можете создать общую переменную, содержащую эту информацию, а затем использовать в качестве fill опции в начальной aes() . Нужные вам столбцы в процентах, чтобы вы могли включить position=fill их для достижения желаемого графика. Здесь код:

 library(ggplot2)
library(dplyr)
library(tidyr)
#Code
df %>% mutate(month=factor(month,levels = unique(month),ordered = T)) %>%
  pivot_longer(-c(month,site)) %>%
  #Combine site and org/inorg
  mutate(Class=paste0(name,'.',site)) %>%
  ggplot(aes(x=month,y=value,fill=Class)) 
  geom_bar(stat = 'identity',color='black',position='fill') 
  scale_y_continuous(labels=scales::percent) 
  theme_bw() 
  theme(axis.text = element_text(color='black',face='bold'),
        axis.title = element_text(color='black',face='bold'),
        legend.title = element_text(color='black',face='bold'),
        legend.text = element_text(color='black',face='bold'))
  

Вывод:

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

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

1. Спасибо за ваш ответ — это так близко к тому, что я искал — однако я хотел, чтобы это было немного больше похоже на приведенное ниже (сгруппированное по месяцам, чтобы каждый сайт для каждого месяца рядом друг с другом), поскольку значения для неорганических / органических уже указаны в процентах 🙂 Большое спасибо за вашу помощь!