Основной вопрос
У меня возникли проблемы с пониманием того, почему обработка дат, меток и перерывов не работает, как я ожидал бы в R при попытке сделать гистограмму с ggplot2.
Я ищу:
- Гистограмма частоты моих дат
- Отметьте метки, центрированные под соответствующими столбцами
- метки даты в формате
%Y-b
- Соответствующие лимиты; минимизированное пустое пространство между краем сетки и внешними барами.
Я загрузил мои данные в pastebin, чтобы сделать это воспроизводимым. Я создал несколько столбцов, так как не был уверен, что это лучший способ:
> dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
> head(dates)
YM Date Year Month
1 2008-Apr 2008-04-01 2008 4
2 2009-Apr 2009-04-01 2009 4
3 2009-Apr 2009-04-01 2009 4
4 2009-Apr 2009-04-01 2009 4
5 2009-Apr 2009-04-01 2009 4
6 2009-Apr 2009-04-01 2009 4
Вот что я пробовал:
library(ggplot2)
library(scales)
dates$converted <- as.Date(dates$Date, format="%Y-%m-%d")
ggplot(dates, aes(x=converted)) + geom_histogram()
+ opts(axis.text.x = theme_text(angle=90))
Что дает этот график. Я хотел форматировать %Y-%b
, тем не менее, поэтому я охотился и пробовал следующее, основанное на this SO:
ggplot(dates, aes(x=converted)) + geom_histogram()
+ scale_x_date(labels=date_format("%Y-%b"),
+ breaks = "1 month")
+ opts(axis.text.x = theme_text(angle=90))
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
Это дает мне этот график
- Правильный формат метки оси x
- Частотное распределение изменило форму (проблема с пропускной способностью?)
- Отметки меток не отображаются по центру
- Изменены также xlims
Я работал над примером в документации ggplot2 в разделе scale_x_date
и geom_line()
, как представляется, разбился, был отмечен ярлыком и центром тикает правильно, когда я использую его с теми же данными оси x. Я не понимаю, почему гистограмма отличается.
Обновления, основанные на ответах от edgeter и gauden
Первоначально я думал, что ответ gauden помог мне решить мою проблему, но теперь я озадачен, посмотрев более внимательно. Обратите внимание на различия между результирующими графами ответов после кода.
Предположим, что для:
library(ggplot2)
library(scales)
dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
Основываясь на ответе @edgester ниже, я смог сделать следующее:
freqs <- aggregate(dates$Date, by=list(dates$Date), FUN=length)
freqs$names <- as.Date(freqs$Group.1, format="%Y-%m-%d")
ggplot(freqs, aes(x=names, y=x)) + geom_bar(stat="identity") +
scale_x_date(breaks="1 month", labels=date_format("%Y-%b"),
limits=c(as.Date("2008-04-30"),as.Date("2012-04-01"))) +
ylab("Frequency") + xlab("Year and Month") +
theme_bw() + opts(axis.text.x = theme_text(angle=90))
Вот моя попытка, основанная на ответе gauden:
dates$Date <- as.Date(dates$Date)
ggplot(dates, aes(x=Date)) + geom_histogram(binwidth=30, colour="white") +
scale_x_date(labels = date_format("%Y-%b"),
breaks = seq(min(dates$Date)-5, max(dates$Date)+5, 30),
limits = c(as.Date("2008-05-01"), as.Date("2012-04-01"))) +
ylab("Frequency") + xlab("Year and Month") +
theme_bw() + opts(axis.text.x = theme_text(angle=90))
Участок, основанный на приближении кромки:
Участок, основанный на методе gauden:
Обратите внимание на следующее:
- пробелы в гауденском заговоре за 2009 год-декабрь и 2010-Мар;
table(dates$Date)
показывает, что имеется 19 экземпляров2009-12-01
и 26 экземпляров2010-03-01
в данных График - начинается с 2008-Апр и заканчивается в 2012-мае. Это верно на основе минимального значения в данных за 2008-04-01 и максимальной даты 2012-05-01. По какой-то причине гауденский сюжет начинается в 2008-Мар и все еще каким-то образом заканчивается в 2012-мае. После подсчета ящиков и чтения по меткам месяца, для жизни я не могу понять, какой сюжет имеет дополнительный или отсутствует бин гистограммы!
Любые мысли о различиях здесь? рестрикционный метод создания отдельного счета
Ссылки по теме
В стороне, вот другие местоположения, которые имеют информацию о датах и ggplot2 для прохожих, ищут помощь:
- Начинается здесь в learnr.wordpress, популярном блоге R. Он заявил, что мне нужно, чтобы мои данные были в формате POSIXct, который теперь я считаю ложным и теряю время.
- Еще одно сообщение learnr воссоздает временной ряд в ggplot2, но на самом деле не применим к моей ситуации.
- r-bloggers имеет сообщение об этом, но он выглядит устаревшим. Простой параметр
format=
не работал у меня. - Этот вопрос SO обсуждается с перерывами и ярлыками. Я пробовал обрабатывать свой вектор
Date
как непрерывный и не думаю, что он работал так хорошо. Похоже, что он накладывал один и тот же текст над текстом снова и снова, поэтому буквы выглядели странно. Распределение является правильным, но есть нечетные разрывы. Моя попытка, основанная на принятом ответе, была такой ( результат здесь).