#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. Спасибо за ваш ответ — это так близко к тому, что я искал — однако я хотел, чтобы это было немного больше похоже на приведенное ниже (сгруппированное по месяцам, чтобы каждый сайт для каждого месяца рядом друг с другом), поскольку значения для неорганических / органических уже указаны в процентах 🙂 Большое спасибо за вашу помощь!