У меня возникли проблемы с пониманием того, почему обработка дат, меток и разрывов не работает так, как я ожидал в R при попытке построить гистограмму с помощью ggplot2.
Я ищу:
%Yb
Я загрузил свои данные в 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
форматировать, поэтому я поискал и попробовал следующее, основываясь на этом 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.
Это дает мне этот график
Я проработал пример в документация ggplot2в разделе scale_x_date
и geom_line()
правильно разрывает, помечает и центрирует отметки, когда я использую ее с теми же данными по оси x . Я не понимаю, почему гистограмма отличается.
Первоначально я думал, что ответ 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))
График, основанный на подходе Edgester:
График на основе подхода Годена:
Обратите внимание на следующее:
table(dates$Date)
показывает, что в данных2009-12-01
и 26 экземпляров 2010-03-01
. ] график Эджстера начинается в апреле 2008 г. и заканчивается в мае 2012 г.Это правильно, исходя из минимального значения данных за 01 апреля 2008 г. и максимального значения за 01 мая 2012 г. По какой-то причине сюжет Годена начинается в марте 2008 года и каким-то образом умудряется закончиться в мае 2012 года. После подсчета бинов и чтения меток месяца, я не могу понять, на каком графике есть лишний или отсутствует бин на гистограмме!Есть какие-нибудь мысли о различиях здесь? метод Edgester для создания отдельного подсчета
Кроме того, вот другие места, где есть информация о датах и ggplot2 для прохожих, ищущих помощи:
format=
у меня не сработал.Date
как непрерывный и не думаю, что это сработало так хорошо. Было похоже, что он накладывал один и тот же текст этикетки снова и снова, поэтому буквы выглядели немного странно. Распределение вроде правильное, но есть странные разрывы. Моя попытка, основанная на принятом ответе, была такой ( результат здесь ).