Сгруппированный столбец в r с 4 переменными - PullRequest
1 голос
/ 29 апреля 2020

Я новичок в r, и я пытался найти, как я могу построить этот график c.

У меня есть 4 переменные (% гравия,% песка,% ила в пяти местах). Я пытаюсь построить процентное соотношение этих 3 типов отложений (y) на каждой станции (x). Так что это пять групп по оси х и 3 бара на группу.


   Station   % gravel    % sand      % silt
1   PRA1    28.430000   70.06000    1.507000
2   PRA3    19.515000   78.07667    2.406000
3   PRA4    19.771000   78.63333    1.598333
4   PRB1    7.010667    91.38333    1.607333
5   PRB2    18.613333   79.62000    1.762000 

Я пытался построить групповую диаграмму с помощью

grao <- read_excel("~/Desktop/Masters/Data/grao.xlsx")
colors <- c('#999999','#E69F00','#56B4E9','#94A813','#718200')
barplot(table(grao$Station, grao$`% gravel`, grao$`% sand`, grao$`% silt`), beside = TRUE, col = colors)

Но это сообщение об ошибке продолжает появляться:

'height' должно быть вектором или матрицей

Я также пытался

ggplot(grao, aes(Station, color=as.factor(`% gravel`), shape=as.factor(`% sand`))) + 
geom_bar() + scale_color_manual(values=c('#999999','#E69F00','#56B4E9','#94A813','#718200')+ theme(legend.position="top")

Но это создает сумасшедший график c.

Может кто-нибудь помочь мне, пожалуйста? Я вот уже несколько недель застрял в этом.

Приветствия

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Я думаю, что это может быть то, что вы ищете:

#install.packages("tidyverse")
library(tidyverse)
df <-  data.frame(
  station = c("PRA1", "PRA3", "PRA4", "PRB1", "PRB2"),
  gravel = c(28.4, 19.5, 19.7, 7.01, 18.6),
  sand = c(70.06, 78.07, 78.63, 91, 79),
  silt = c(1.5, 2.4, 1.6, 1.7, 1.66)
)

df2 <- df %>% 
  pivot_longer(cols = c("gravel", "sand", "silt"), names_to = "Sediment_Type", values_to = "Percentage")

ggplot(df2) +
  geom_bar(aes(x = station, y = Percentage, fill = Sediment_Type ), stat = "identity", position = "dodge") +
theme_minimal() #theme_minimal() is from the ggthemes package

обеспечивает:

ggplot of data Вам необходимо "развернуть" ваш набор данных " больше». Частью аккуратного способа является обеспечение того, чтобы все столбцы представляли одну переменную. В исходном кадре данных вы заметите, что каждое имя столбца является переменной («Sediment_type»), а заполнение каждого столбца представляет собой только процент для каждого («Percentage»). Функция pivot_longer() берет набор данных и позволяет собрать все столбцы, а затем превратить их в два - тождество и значение.

После того, как вы это сделаете, ggplot позволит вам указать ось x, а затем группирующую переменную по «заливке». Вы можете переключить эти два. Если у вас много данных и группирующих переменных, вам также стоит посмотреть на фасетирование!

Надеюсь, это поможет,

Бреннан

0 голосов
/ 29 апреля 2020

barplot хочет "matrix", в идеале с обоими именами измерений. Вы можете преобразовать свои данные следующим образом (удалите первый столбец, используя его для имен строк):

dat <- `rownames<-`(as.matrix(grao[,-1]), grao[,1])

Вы увидите, что barplot уже выполняет табулирование для вас. Однако вы также можете использовать xtabs (table может не подходить для вашего подхода).

# dat <- xtabs(cbind(X..gravel, X..sand, X..silt) ~ Station, grao)  ## alternatively

Я бы посоветовал вам использовать правильные имена переменных, поскольку специальные символы не самые лучшие идея.

colnames(dat) <- c("gravel", "sand", "silt")
dat
#         gravel     sand     silt
# PRA1 28.430000 70.06000 1.507000
# PRA3 19.515000 78.07667 2.406000
# PRA4 19.771000 78.63333 1.598333
# PRB1  7.010667 91.38333 1.607333
# PRB2 18.613333 79.62000 1.762000

Тогда barplot знает, что происходит.

.col <- c('#E69F00','#56B4E9','#94A813')  ## pre-define colors
barplot(t(dat), beside=T, col=.col, ylim=c(0, 100),  ## barplot
        main="Here could be your title", xlab="sample", ylab="perc.")
legend("topleft", colnames(dat), pch=15, col=.col, cex=.9, horiz=T, bty="n")  ## legend
box()  ## put it in a box

enter image description here


Данные:

grao <- read.table(text="   Station   '% gravel'    '% sand'      '% silt'
1   PRA1    28.430000   70.06000    1.507000
2   PRA3    19.515000   78.07667    2.406000
3   PRA4    19.771000   78.63333    1.598333
4   PRB1    7.010667    91.38333    1.607333
5   PRB2    18.613333   79.62000    1.762000 ", header=TRUE)
...