我想在month
中使用day
多年时,在时间序列图的x轴上同时包含facet
和ggplot2
。我的MWE如下:
set.seed(12345)
Date <- seq(as.Date("2010/1/1"), as.Date("2014/1/1"), "week")
Y <- rnorm(n=length(Date), mean=100, sd=1)
df <- data.frame(Date, Y)
df$Year <- format(df$Date, "%Y")
df$Month <- format(df$Date, "%b")
df$Day <- format(df$Date, "%d")
df$MonthDay <- format(df$Date, "%d-%b")
p <- ggplot(data=df, mapping=aes(x=MonthDay, y=Y, shape=Year, color=Year)) + geom_point() +geom_line(aes(group = 1))
p <- p + facet_grid(facets = Year ~ ., margins = FALSE) + theme_bw()
print(p)
我尝试使用以下命令控制x轴标签
p + scale_y_continuous() + scale_x_date(labels = date_format("%d-%b"))
但它会抛出以下错误消息。
Error: Invalid input: date_trans works with objects of class Date only
答案 0 :(得分:20)
你非常接近。您希望x轴可以衡量一年中的位置,但是您可以将其作为字符向量,因此每个单点都会被标记。如果您改为将连续变量表示为此,则可以获得更好的结果。一个连续变量将是一年中的一天。
df$DayOfYear <- as.numeric(format(df$Date, "%j"))
ggplot(data = df,
mapping = aes(x = DayOfYear, y = Y, shape = Year, colour = Year)) +
geom_point() +
geom_line() +
facet_grid(facets = Year ~ .) +
theme_bw()
可以使用适当的标签功能将轴格式化为更像日期,但仍然无法以日期识别方式找到中断。 (除此之外,还存在NA
问题。)
ggplot(data = df,
mapping = aes(x = DayOfYear, y = Y, shape = Year, colour = Year)) +
geom_point() +
geom_line() +
facet_grid(facets = Year ~ .) +
scale_x_continuous(labels = function(x) format(as.Date(as.character(x), "%j"), "%d-%b")) +
theme_bw()
为了获得漂亮的日期中断的好处,可以使用不同的变量。与原始数据具有相同日期的一年,但只有一年。在这种情况下,2000年是闰年。这个问题主要与闰日有关,但如果你不关心这一点(非闰年的3月1日将与闰年的2月29日等一致),你可以使用:< / p>
df$CommonDate <- as.Date(paste0("2000-",format(df$Date, "%j")), "%Y-%j")
ggplot(data = df,
mapping = aes(x = CommonDate, y = Y, shape = Year, colour = Year)) +
geom_point() +
geom_line() +
facet_grid(facets = Year ~ .) +
scale_x_date(labels = function(x) format(x, "%d-%b")) +
theme_bw()
答案 1 :(得分:6)
坚持使用您的代码@ MYaseen208来创建数据。
当您绘制它时使用x = Date
并使用下面的
p <- ggplot(data = df, aes(x = Date, y = Y, shape = Year, color = Year)) +
geom_point() + geom_line(aes(group = 1))
#adding facet and using facet_wrap with free x scales
p <- p + facet_wrap(~Year,ncol=1, scales = "free_x") + theme_bw()+
scale_y_continuous() +
scale_x_date(labels = date_format("%d-%b"), breaks = date_breaks("2 weeks")) +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, size = 8))
我使用了facet_wrap来获得免费的x_axis比例。当您将数据分开时,我们无法获得每年相同的日月组合。
答案 2 :(得分:2)
修改@Brian Diggs保留原始日期和月份的方法(3月1日保留为3月1日而不是2月29日)是将日期强制转换为字符串,然后替换年份:
library(lubridate)
library(stringr)
df$CommonDate <- ymd(paste0("2000-",str_sub(as.character(df$Date),-5)))
然后您可以继续:
ggplot(data = df,
mapping = aes(x = CommonDate, y = Y, shape = Year, colour = Year)) +
geom_point() +
geom_line() +
facet_grid(facets = Year ~ .) +
scale_x_date(labels = function(x) format(x, "%d-%b")) +
theme_bw()