无法使用scales包格式化x轴

3

我有这些数据,并试图使用ggplot2和scales来格式化x轴,包括日期和时间。

dput(head(pp))
structure(list(DateTime = structure(c(1362405600, 1362409200, 
1362412800, 1362416400, 1363006800, 1363010400), class = c("POSIXct", 
"POSIXt"), tzone = ""), Day = structure(c(1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("Fri", "Mon", "Sat", "Sun", "Thu", "Tue", "Wed"
), class = "factor"), Total_Logins = c(818832L, 801771L, 787508L, 
731672L, 748872L, 727140L), Unique_Logins = c(732152L, 713380L, 
701348L, 647321L, 672848L, 649453L), Date = structure(c(15768, 
15768, 15768, 15768, 15775, 15775), class = "Date")), .Names = c("DateTime", 
"Day", "Total_Logins", "Unique_Logins", "Date"), row.names = c(1498L, 
1499L, 1500L, 1501L, 1666L, 1667L), class = "data.frame")

library(ggplot2)
library(scales)

ggplot(subset(pp, Day=="Fri"), aes(DateTime, Total_Logins, group=1)) + 
    geom_line() + 
    geom_smooth(method="loess", se=T, size=1) + 
    scale_x_date(breaks = "1 day", labels=date_format("%b-%d-%Y %H"))

我遇到了这个错误:

错误:无效输入:date_trans仅适用于Date类的对象

我的DateTime列已经格式化为Date。你有什么想法,我在这里做错了什么吗?

enter image description here

1个回答

5

由于列DateTime包含了日期和时间(类POSIXct),而且您还想在x轴标签中显示小时,因此您应该使用scale_x_datetime()而不是scale_x_date()

+scale_x_datetime(breaks = "1 day", labels=date_format("%b-%d-%Y %H"))

要更改显示x轴刻度线的断点,您可以将breaks="1 day"更改为例如breaks="6 hours"。另一种可能性是仅在实际值可用的位置显示断点。如果有太多轴文本项,则可以更改文本的方向。

+scale_x_datetime(breaks = unique(pp$DateTime), labels=date_format("%b-%d-%Y %H"))+
        theme(axis.text.x=element_text(angle=90,vjust=0.5))

我正在使用这个,但仍然遇到某些问题。我有9、10、11、12小时的数据。我需要按日期和时间在x轴上显示它们。当我使用上述scale_x_datetime时,小时数只显示00。我需要显示我拥有数据点的时间。 - user1471980
@user1471980,然后您需要决定希望多久看一次您的值 - 如果是定期的话,请使用breaks="..小时",如果是不规律的话,则提供您自己的休息时间。 - Didzis Elferts
我需要在数据框中为每个日期显示9、10、11、12的数据点。 - user1471980
正如上图所示,数据点是垂直的。它不应该是垂直的。 - user1471980
@user1471980 它们不是垂直的 - 尝试将您的图表拉宽,您会发现它们不是垂直的。如果您的数据仅适用于某些小时,则以这种方式查看它们。也许您可以将时间转换为因子(这将消除两个日期之间的点之间的空格),但这不是最好的方法。 - Didzis Elferts
将日期转换为因子已经完成了我的任务,非常感谢。 - user1471980

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接