Понимание дат и построение гистограммы с помощью ggplot2 в R

Основной вопрос

У меня возникли проблемы с пониманием того, почему обработка дат, меток и разрывов не работает так, как я ожидал в 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.

Это дает мне этот график

  • Правильный формат метки оси X
  • Распределение частот изменило форму (проблема с шириной бина?)
  • Засечки не отображаются по центру под полосами
  • Xlims также изменились

Я проработал пример в документация ggplot2в разделе scale_x_dateи geom_line()правильно разрывает, помечает и центрирует отметки, когда я использую ее с теми же данными по оси x . Я не понимаю, почему гистограмма отличается.


Обновления, основанные на ответах Edgester и 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))

График, основанный на подходе Edgester:

edgester-plot

График на основе подхода Годена:

gauden-plot

Обратите внимание на следующее:

  • пробелы в графике Годена за декабрь 2009 г. и март 2010 г.; table(dates$Date)показывает, что в данных
  • есть 19 экземпляров 2009-12-01и 26 экземпляров 2010-03-01. ] график Эджстера начинается в апреле 2008 г. и заканчивается в мае 2012 г.Это правильно, исходя из минимального значения данных за 01 апреля 2008 г. и максимального значения за 01 мая 2012 г. По какой-то причине сюжет Годена начинается в марте 2008 года и каким-то образом умудряется закончиться в мае 2012 года. После подсчета бинов и чтения меток месяца, я не могу понять, на каком графике есть лишний или отсутствует бин на гистограмме!

Есть какие-нибудь мысли о различиях здесь? метод Edgester для создания отдельного подсчета


Связанные ссылки

Кроме того, вот другие места, где есть информация о датах и ​​ggplot2 для прохожих, ищущих помощи:

  • Начало здесьна Learner.wordpress , популярный блог R. В нем говорилось, что мне нужно перевести мои данные в формат POSIXct, который я теперь считаю ложным и зря потратил свое время.
  • Другой пост учащегосявоссоздает временной ряд в ggplot2, но он не совсем применим к моей ситуации.
  • У r-bloggers есть пост на эту тему, но он кажется устаревшим. Простой вариант format=у меня не сработал.
  • Этот SO-вопросиграет с разрывами и метками. Я пытался рассматривать свой вектор Dateкак непрерывный и не думаю, что это сработало так хорошо. Было похоже, что он накладывал один и тот же текст этикетки снова и снова, поэтому буквы выглядели немного странно. Распределение вроде правильное, но есть странные разрывы. Моя попытка, основанная на принятом ответе, была такой ( результат здесь ).
62
задан Community 23 May 2017 в 12:17
поделиться