我正在尝试按周和月绘制时间序列数据;理想情况下,我认为,我想使用箱形图来显示按周分类的每日数据。虽然我可以使用scale_x_date
更改x轴上的标签和网格线,但这不会影响绘图中的点。
这是一个问题和我目前(笨拙)解决方案的演示。
library(zoo)
library(ggplot2)
d = as.Date(c(as.Date("2007-06-01"):as.Date("2008-05-31"))) # using zoo to reformat numeric
x = runif(366, min = 0, max = 100)
df = data.frame(d,x)
# PROBLEM #
p = ggplot(df, aes(d, x))
p + geom_point()
p + geom_boxplot() # more or less useless
# CURRENT FIX #
df$Year.Month <- format(df$d, "%Y-%m")
p = ggplot(df, aes(Year.Month, x))
p + geom_point(alpha = 0.75)
p + geom_boxplot() # where I'm trying to get to...
我确信在ggplot
内有更优雅的方法可以做到这一点。我是对的吗?
@ shadow的答案下面更整洁。但有没有办法使用binning来做到这一点?也许以某种形式使用stats
?
答案 0 :(得分:1)
您可以将日期视为R中的日期,并使用ggplot中的scale_x_date()来获取所需的x标签。
此外,我发现更容易创建一个名为“月”的新变量因子,以按月对箱图进行分组。在这种情况下,我使用了lubridate来完成任务。
如果您不想完成创建新变量“月”的麻烦,您的bloxplot将在该月的15日绘制,使得读数更加困难。
library(magrittr)
library(lubridate)
library(dplyr)
df %>%
mutate(Date2 = as.Date(paste0("2000-", month(d), "-", "01"))) %>%
mutate(Month = lubridate::month(d)) %>%
ggplot(aes(Date2, x, group=Month)) +
geom_boxplot() +
scale_x_date(date_breaks="1 month", date_labels = "%b")
如果您不创建变量“Month”,则箱线图将不会与x刻度线很好地对齐: