Ошибка по высоте для построения сгруппированной гистограммы в R - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь создать сгруппированную гистограмму по scenerio со следующими данными из моего листа Excel:

Scenerio Migration  Foraged Counter
1            0        741    1500
2            1        740    1500
3           200       475    1349
4           198       215    832
5           184       118    616
6           151        52    412
7           139        31    343
8           134        21    304
9           131        14    278

Моя ось x должна иметь тип scenerio, а ось y должна быть средней оценкой. , Сгруппированные столбцы должны быть миграционными и добываемыми. Я пытался запустить это несколькими различными способами, и я продолжаю получать эту ошибку 'height' must be a vector or a matrix. Как мне сгруппировать гистограмму с этим набором данных?

Вот лишь несколько попыток:

   1.  barplot(dat, col = c("darkblue", "red"), beside = TRUE, legend = rownames (dat))

   2.  barplot(dat, beside = T, ylim = c(0,1600), col = dat$Scenerio, axis.lty = "solid")

3. condition <- c(dat$Migration, dat$Foraged)
ggplot(dat, aes(x=dat$Scenerio, y=dat$Counter, fill=condition)) +geom_bar(position = position_dodge())

1 Ответ

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

Решение ggplot подразумевает поворот вашего фрейма данных в более длинный формат, такой как:

library(tidyr)
library(dplyr)
library(ggplot2)

df %>% pivot_longer(-Scenerio) %>%
  ggplot(aes(x = as.factor(Scenerio), y = value, fill = name))+
  geom_col(position = position_dodge())

enter image description here

Базовое решение r с использованием barplot подразумевает транспонирование вашего кадра данных и преобразование в виде матрицы следующим образом:

rownames(df) <- df$Scenerio
df <- t(df[,-1])
colnames(df) <- 1:9

barplot(df, beside = TRUE, legend = rownames(df), 
        xlab = "Scenario", ylab = "Score")

enter image description here


Воспроизводимый пример

structure(list(Scenerio = 1:9, Migration = c(0L, 1L, 200L, 198L, 
184L, 151L, 139L, 134L, 131L), Foraged = c(741L, 740L, 475L, 
215L, 118L, 52L, 31L, 21L, 14L), Counter = c(1500L, 1500L, 1349L, 
832L, 616L, 412L, 343L, 304L, 278L)), row.names = c(NA, -9L), class = c("data.table", 
"data.frame"))
...