Почему добавление `position =" dodge "` к моему `geom_bar` приводит к тому, что значения отображаются некорректно? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть фрейм данных:

df <- data.frame(human = c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
                 stage = c("A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4", "A1", "A2", "A3", "A4"),
                 class = c(0,1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0)
)

И хочу столбчатую диаграмму для каждого этапа по оси X:

ggplot(df, aes(x = stage, y = class, fill = as.factor(human))) + geom_bar(stat = "identity") + scale_y_continuous(limits = c(0,15))

enter image description here

выглядит хорошо, но я бы хотел, чтобы человеческие элементы располагались рядом, поэтому я добавляю position = "dodge":

ggplot(df, aes(x = stage, y = class, fill = as.factor(human))) + geom_bar(stat = "identity", position= "dodge") + scale_y_continuous(limits = c(0,15))

Хотя столбцы теперь рядом, по какой-то причине все классы = 1: enter image description here

Ответы [ 3 ]

4 голосов
/ 04 ноября 2019

Это потому, что ваши "идентификаторы" равны 0 или 1. Один из способов справиться с этим - summarize ваши данные перед тем, как вы их подготовите. Например:

library(tidyverse)

df %>% 
    group_by(human, stage) %>% 
    summarise(class = sum(class)) %>% 
    ggplot(aes(x = stage, y = class, fill = as.factor(human))) + 
    geom_bar(stat = "identity", position= "dodge")

enter image description here

0 голосов
/ 04 ноября 2019

Решение, которое позволяет избежать предварительной обработки dplyr для использования stat_summary:

ggplot(df, aes(x = stage, 
               y = class, 
               fill = as.factor(human))) + 
  stat_summary(geom = "bar", 
               position = "dodge", 
               fun.y = "sum")
0 голосов
/ 04 ноября 2019

Потому что вы используете stat = "identity". Тогда вам придется считать заранее.

library(tidyverse)
df %>%
  count(stage, class, human) %>%
  ggplot(aes(x = stage, y = n, fill = as.factor(human))) + 
  geom_bar(stat = "identity", position = "dodge")
...