我想生成一个具有日期列的数据框的散点图。 x轴应按月划分,或者在过去2年中每2个月划分一次。
数据框:
code_1000 <-
as.data.frame(cbind(
c("3", "3", "7", "7", "7", "7", "2", "2", "4", "4"),
c("344", "344", "73", "73", "71", "72", "21", "27", "42", "43"),
c("9-02-2017", "10-01-2016","9-02-2014", "25-03-2015", "9-02-2017",
"10-06-2017", "8-04-2017", "25-08-2016", "07-08-2017", "15-09-2016"
)
))
names(code_1000) <- c("number", "code", "date")
情节代码:
qplot(data=code_1000,
x=format(as.Date(date),"%b/%Y"),
y=code,
geom=c("point"),
na.rm=TRUE,
xlab="Emission date", ylab="Code",
size=1, col=2)+theme_bw()+theme(legend.position="none")
我想在y轴上绘制code
,在x轴上绘制date
。如何强制x轴按月划分?此外,当我运行我的绘图代码时,x轴格式看起来像mm / dddd,但我想要mm / yyyy。我为什么要这种格式?
我在Shiny应用程序中有大约50个数据框,如code_1000
。为了简单起见,我没有共享所有代码。
提前谢谢你们!
答案 0 :(得分:1)
我认为默认的日期解析器只是被您的DD-MM-YYY符号搞糊涂了。 如果使用lubridate解析日期,则x轴看起来更合理(尽管可能没有您想要的主要/次要刻度。)
我删除了你重新格式化qplot中的日期并添加了缩放功能。
library(lubridate)
library(scales)
# implicit in poster's question
library(ggplot2)
code_1000$date <- lubridate::dmy(as.character(code_1000$date))
qplot(
data = code_1000,
x = date,
y = code,
geom = c("point"),
na.rm = TRUE,
xlab = "Emission date",
ylab = "Code",
size = 1,
col = 2
) + theme_bw() + theme(legend.position = "none") + scale_x_date(
date_breaks = "1 year",
date_minor_breaks = "1 month",
labels = date_format("%m-%Y")
)
答案 1 :(得分:0)
我的解决方案最终与上面的@MarkMiller非常相似,只是我对lubridate的尝试失败了。我使用strptime
来转换日期。
code_1000$date <- strptime(code_1000$date, format = "%d-%M-%Y")
我发现ggplot
功能更灵活,更简洁,而不是qplot
。特别是在一个闪亮的应用程序中,qplot
可能会给出可变结果(?):
library(tidyverse)
library(scales) # needed for date_format()
ggplot(code_1000, aes(date, code)) +
geom_point(size=2, col="steelblue") +
theme_bw() +
labs(x="Emission Date", y="Code") +
scale_x_datetime(labels = date_format("%m/%Y"))
如果要在闪亮图表中设置限制一致,请设置特定时间限制:
limits <- strptime(c("01-01-2014", "01-01-2018"), format = "%d-%m-%Y")
ggplot(code_1000, aes(date, code)) +
geom_point(size=2, col="steelblue") + theme_bw() +
labs(x="Emission Date", y="Code") +
scale_x_datetime(labels = date_format("%m-%Y"), #minor_breaks = "1 month"
date_breaks = "1 year", limits = as.POSIXct(limits))
答案 2 :(得分:0)
非常感谢你的回答!
我很难在Shiny中为我的数据帧应用这种日期格式。
我有51个不同的数据框,而不是一个数据框code_1000
,从code_1000
到code_1050
命名。我想应用这种日期格式
code_1000$date <- lubridate::dmy(as.character(code_1000$date))
在这些数据框架中的所有date
列上。我试图使用for
来做,但它变得有点混乱,没有用。
for (m in 1:nrow(input)){
assign(paste0("code_",input$code.numbers[m])$date, lubridate::dmy(as.character(eval(parse(text=paste0("code_",input$code.numbers[m])))$date)))
}
input$code.numbers
是一个数据框,其中包含命名数据帧的数字(从1000到1050)。我收到以下错误:
Error in paste0("code_",input$code.numbers[m])$date :
$ operator is invalid for atomic vectors
我想了解如何使用for
和lapply()
函数执行此操作,因为我已经读过,在R lapply()
中,大多数情况下这是一种更简单的方法。