Как выровнять сетку и усы прямоугольника с 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")
Не идеальное решение, но я думаю, что проблема заключается в выравнивании разрывов в данных с разрывами на графике. Я использовал данные примера из поста 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
пакет.