Как выровнять сетку и усы прямоугольника с ggplot2?

Я строю почасовые данные, сгруппированные по номеру недели на основе этого ответа: /questions/3742962/ggplot2-boxplots-po-nedelyam/3742974#3742974

Мой пример показывает первые две недели 2016 года, начиная с понедельника 01-04-2016 00:00 и заканчивая воскресением 01-17-2016 23:00

Как я могу выровнять основную сетку и соответствующие метки оси X с усами графиков?

ggplot(table, aes(x=as.Date(datetime_hour), y=count_hour, group=format(as.Date(datetime_hour),"%W"))) + geom_boxplot() + scale_x_date(date_breaks = "week", date_labels="%W") + labs(x = "week number")

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

2 ответа

Решение

IIUC - просто передайте вычисленный номер недели в аргументах x и group aes:

ggplot(table, aes(x = format(as.Date(table$datetime_hour),"%W"), y = count_hour, 
                  group = format(as.Date(table$datetime_hour),"%W"))) + 
  geom_boxplot() + labs(x = "week number")

Или создайте его как новую переменную:

table$week_num <- format(as.Date(table$datetime_hour),"%W")

ggplot(table, aes(x = week_num, y = count_hour, group = week_num)) + 
  geom_boxplot() + labs(x = "week number")

Для демонстрации на случайных данных (для воспроизводимости):

set.seed(6776)

table <- data.frame(
  datetime_hour = Sys.Date() - seq(30),
  count_hour = rnorm(30, mean = 100, sd = 50)
)

table$week_num <- format(as.Date(table$datetime_hour),"%W")

ggplot(table, aes(x = week_num, y = count_hour, group = week_num)) + 
  geom_boxplot() + labs(x = "week number")

Выход GGPlot

Не идеальное решение, но я думаю, что проблема заключается в выравнивании разрывов в данных с разрывами на графике. Я использовал данные примера из поста SO, на который вы ссылались, и добавил переменную, в которой я сократил даты на недели. Это дает фактор, который я использовал в качестве ввода х в ggplotи использовал scale_x_discrete отформатировать метки с помощью функции.

library(ggplot2)

# From linked SO post

df <- data.frame(
    value = rnorm(62), 
    my.date = seq(as.Date("2013-12-01"), as.Date("2014-01-31"), by="1 day")
    )

# Cut dates into weeks

df$date_brk <- cut(df$my.date, breaks = "week")

ggplot(df, aes(x = date_brk, y = value)) +
    geom_boxplot() +
    scale_x_discrete(labels = function(x) format(as.Date(x), "%W")) +
    theme(panel.grid.minor.x = element_blank())

Создано 2018-04-04 пакетом представлением (v0.2.0).

Там также может быть лучший способ использования lubridate пакет.

Другие вопросы по тегам