【问题标题】:Plotting POSIXct in ggplot manually scaling x-axis在ggplot中绘制POSIXct手动缩放x轴
【发布时间】:2020-04-21 21:15:57
【问题描述】:

我正在尝试绘制这个风速数据,x 轴上显示年份。数据框设置为

wsAvg<-data.frame(date=as.POSIXct(ws07$date[1224:1559]),u.1=(ws07$u[1224:1559]),stringsAsFactors = FALSE)
wsAvg<-rbind(wsAvg,c(date=as.POSIXct(ws08$date[1032:1367]),(ws08$u[1032:1367])))

下面使用 ggplot 绘制我的风速数据框。

ggplot(wsAvg,aes(x=date,y=as.numeric(u.1)))+geom_point(size=3,pch=2)+
  geom_smooth(method="lm",colour="black",se=FALSE)+
  #scale_x_datetime(limits=as.POSIXct(c('2006-09-01','2016-10-01')),breaks=date_breaks("1 year"),labels=date_format("%Y"))+ 

如果我的命令中没有 scale_x_datetime(),我会得到这些日期。当我添加 scale_x_datetime() 函数以手动缩放我的 x 轴以仅显示年份时。我所有的数据都排到 2007 年。有人知道这是为什么吗?

【问题讨论】:

  • 对我来说看起来是正确的,我们没有你的数据,但你的第一个情节只显示了两个月,而你的第二个情节显示了很多年。我认为这些功能工作正常。你期待什么?
  • @J_F 为简单起见,我没有粘贴整个数据集。两个地块的 2006-2016 年数据量相同。第一个图上的轴标签来自 ggplot 的默认值,不是我要找的
  • 你能给我们一个你的数据集的例子吗,例如一年一分?
  • @J_F 每个数据由一年中不同时间戳的 14 个点组成。因此,在创建 wsAvg 数据框的前两行之后,我还有 8 行代码,每一行都类似于 2009 年到 2016 年的第二行 rbind()
  • 请提供一个可重现的示例,其中包含足够的示例数据来说明问题。

标签: r ggplot2 posixct


【解决方案1】:

很难回答您的问题,因为我们无法清楚地了解您的任何数据。话虽如此,让我们看看您提供的信息,看看问题的可能根源在哪里。

该问题显然与您的“日期”列中的格式/数据有关。最好逐步查看并在每个步骤中进行测试,看看这里会出现什么问题:

  • 您的原始数据:您的基础数据可能没有错误,但我们不知道来自的“日期”向量的格式ws07$date[1224:1559]ws08$date[1032:1367]。您的原始数据来自两个数据帧,因此只需确认这两个向量的原始数据格式相同,但更重要的是,它是否已经格式化为日期?class(ws08$date) 是什么?此外,如果您从该数据集取样,数据会是什么样子? (例如ws07$date[sample(1224:1559, 20)])。

  • 转换为 POSIXct: 您显示的第一个代码包含 as.POSIXct(),但包含 format= 的参数。您可能需要也可能不需要指定这一点,但我会推荐consulting the documentation 以确保您正确使用该功能。您可以尝试仅使用 as.POSIXct(ws07$date[1224:1250]) 或类似的东西来转换一小部分数据。它是否为您提供格式正确的日期?如果没有,请尝试指定 format= 参数,直到它按您的预期“工作”。

  • 初始图和第二个图 数据分布在第一个图中,可能与您预期的一样。第一个图中的月/日组合怎么样 - 它们是否正确?如果它们是正确的,则可能表明年份被读错了,因为显然所有日期都集中在 2007 年 5 月和 6 月左右。比较第一个和第二个图,scale_x_datetime() 这里没有明显问题。这两个图与 x 值 = 日期范围为 2007 年 5 月至 6 月的数据一致。

底线:很难准确判断哪里出了问题,但很可能是 (1) 使用 as.POSIXct 从您的 ws07ws08 数据集转换到日期,或者 (2) 的格式ws07$datews08$date 被错误地导入/转换。解决方案是在您使用的日期转换/导入函数中使用format= 参数,以确保格式正确并相应导入年/月/日。

【讨论】:

  • 感谢您的深入分析。我设法找出问题所在。当我设置我的数据框时,我必须使用 data.frame() 来接受数据,而不是使用 c() 函数。我不确定 c() 不起作用而 data.frame() 起作用的逻辑或原因。
  • 哦,当我第一次看到你的问题时,我没有明白这一点。是的,当您创建数据时,您正在将数据框与实际上是数据框的向量绑定,因此 'c()' 在那里不起作用。
【解决方案2】:

对我有用的代码。当我绑定来自其他数据集的数据时,我不得不使用 data.frame() 将其他年份添加到 wsAvg 数据框中,而不是使用 c() 函数。

wsAvg<-data.frame(date=as.POSIXct(ws07$date[1224:1559]),u.1=(ws07$u[1224:1559]),stringsAsFactors = FALSE)
wsAvg<-rbind(wsAvg,data.frame(date=as.POSIXct(ws08$date[1032:1367]),u.1=(ws08$u[1032:1367])))          

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多