ggplot2: объект 'y' не найден с stat=bin

Извините, что задаю вопрос, который был задан ранее на SO, но я пытаюсь построить некоторые простые данные в ggplot2 и у меня проблемы с бинированием данных по оси x. Мои данные состоят из визуальных элементов в старых книгах (диаграммы, гравюры и т. д.), и я могу построить график частоты появления каждого типа визуальных элементов в каждом году:

#this works
df <- read.table("cleaned_estc_visuals.txt",
                 header = F,
                 sep = "\t")

ggplot(data=df, aes(x=V1, y=V3)) + 
  geom_bar(aes(fill=V2),stat="identity") +
  labs(title = "Visuals in Early Modern Books",fill="") +
  xlab("Year") + 
  ylab("Titles") 

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

Чтобы сделать данные более разборчивыми, я хочу сгруппировать значения по оси x по десятилетию, но не могу понять правильный вызов:

#this doesn't
ggplot(data=df, aes(x=V1, y=V3)) + 
  geom_bar(aes(fill=V2),binwidth=10,stat="bin")

Запустив последний код, я получаю:

Mapping a variable to y and also using stat="bin".
  With stat="bin", it will attempt to set the y value to the count of cases in each group.
  This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
  If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
  If you want y to represent values in the data, use stat="identity".
  See ?geom_bar for examples. (Deprecated; last used in version 0.9.2)
Error in pmin(y, 0) : object 'y' not found

Кто-нибудь знает, как я могу сгруппировать по десятилетию по оси x? Буду признателен за любые советы, которые могут дать другие.


person duhaime    schedule 07.11.2014    source источник


Ответы (1)


В вашей ситуации мне проще выполнить некоторые манипуляции с данными перед вызовом ggplot(). Я лично предпочитаю эти пакеты: dplyr для управления данными и scales для работы с графикой, но вы можете сделать это и с помощью base функций.

library(dplyr)
library(scales)

df2 <- df %>%
  mutate(decade = floor(V1 / 10) * 10) %>% 
  group_by(decade, V2) %>%
  summarise(V3 = sum(V3)) %>%
  filter(decade != 1800)


ggplot(df2, aes(x = decade, y = V3)) +
  geom_bar(aes(fill = V2), stat = "identity") +
  labs(x = "Decade", y = "Titles", title = "Visuals in Early Modern Books") +
  scale_x_continuous(breaks = pretty_breaks(20)) # using scales::pretty_breaks()
person davechilders    schedule 07.11.2014
comment
Это выглядит великолепно, @DMC! Отредактированный код более разборчив; спасибо за эти изменения. Просто быстрый вопрос: есть ли простой способ удалить последнюю полосу? Я считаю, что это суммирование 1800:1810, и поскольку в этом диапазоне всего один год (1800), это может быть обманчивым. Буду ли я вызывать which при вызове df в строке 1 вашего кода? - person duhaime; 07.11.2014
comment
И эта последняя группа будет суммировать годы 1800-1809 (не 1800-1810). - person davechilders; 07.11.2014
comment
А, спасибо за разъяснение и за фильтр! Это очень полезно! - person duhaime; 07.11.2014