ggplot 时间序列图错误:输入无效:time_trans 仅适用于 POSIXct 类的对象,但数据在 POSIXct 中

Posted

技术标签:

【中文标题】ggplot 时间序列图错误:输入无效:time_trans 仅适用于 POSIXct 类的对象,但数据在 POSIXct 中【英文标题】:ggplot Time Series Figure Error: Invalid input: time_trans works with objects of class POSIXct only BUT data is in POSIXct 【发布时间】:2022-01-13 17:13:39 【问题描述】:

我的数据集是一个数据框,其中包含过去 4 个夏天的每日最高水温。

     X site      DateTime            value Month Year  Day  
   <int> <fct>     <dttm>              <dbl> <int> <fct> <chr>
 1  6775 RAYNER_UP 2018-07-09 19:00:00  19.8     7 2018  07/10
 2  6776 RAYNER_UP 2018-07-10 19:00:00  21.2     7 2018  07/11
 3  6777 RAYNER_UP 2018-07-11 19:00:00  20.4     7 2018  07/12
 4  6778 RAYNER_UP 2018-07-12 19:00:00  20.1     7 2018  07/13
 5  6779 RAYNER_UP 2018-07-13 19:00:00  17.3     7 2018  07/14
 6  6780 RAYNER_UP 2018-07-14 19:00:00  19.5     7 2018  07/15
 7  6781 RAYNER_UP 2018-07-15 19:00:00  21.2     7 2018  07/16
 8  6782 RAYNER_UP 2018-07-16 19:00:00  21.0     7 2018  07/17
 9  6783 RAYNER_UP 2018-07-17 19:00:00  19.8     7 2018  07/18
10  6784 RAYNER_UP 2018-07-18 19:00:00  16.8     7 2018  07/19

我的目标是制作一个每年都有不同线条的折线图。到目前为止,在互联网的大力帮助下,我每年都做了一条线,但规模非常拥挤example。

我想重新调整时间序列中的 x 轴以显示月份中的日期。

到目前为止,在 ggplot 中使用 scale_x_datetime 和 scale_x_date 但均未成功。 我不断收到错误消息:输入无效:time_trans 仅适用于 POSIXct 类的对象,即使日期列在 POSIXct 中。

给出问题的代码示例:

test1 = ggplot() +
geom_line(data = Rayner_up_summer, aes(x=strftime(DateTime,format="%m/%d"),
                                  y=value, 
                                group = Year,
                                  color=strftime(DateTime,format="%Y")))+
                               # size=.1))+
 scale_color_discrete(name="Year")+
 labs(x="date")
 

有谁知道为什么即使我的 x 轴 (DateTime) 是 POSIXct 日期时间格式,我也无法使用 scale_x_datetime?如果您有任何建议,我将不胜感激

【问题讨论】:

您的代码运行良好。我只能猜测您在尝试将scale_x_date 添加到您的代码时遇到了错误?问题可能是您将DateTime 列(属于Date 类)转换为strftime(DateTime,format="%m/%d"),这是一个字符。因此,当添加scale_x_date 时会出现错误,只需使用aes(x = DateTime, ..)。如果你想设置标签的格式,你可以通过+ scale_x_date(date_labels = "%m/%d") 感谢您的回复斯特凡。 strftime(DateTime,format="%m/%d") 是我能够将年份全部绘制在相同的 4 个月范围内的唯一方法,以便它们相互重叠。另外,我错误地发布了错误数据框的示例,我已对其进行了更新,因此它将 DateTime 显示为 POSIXct。 【参考方案1】:

正如我在评论中所说,问题是您通过 strftime(DateTime,format="%m/%d") 将您的 DateTime 列转换为一个字符,这就是您的秤被严重挤在一起的原因,也是 scale_x_date 或 @987654325 的原因@ 将不起作用。

相反,实现您想要的结果的一种选择是

    在您使用同一年份的数据中添加帮助日期列。 将此助手日期列映射到x

注意:我稍微更改了您的数据集以考虑第二年。

Rayner_up_summer$DateTime <- as.Date(paste0("2018/", Rayner_up_summer$Day))

library(ggplot2)

ggplot() +
  geom_line(data = Rayner_up_summer, aes(
    x = DateTime,
    y = value,
    group = Year,
    color = factor(Year)
  )) +
  scale_x_date(date_labels = "%m/%d") +
  scale_color_discrete(name = "Year") +
  labs(x = "date")

数据

Rayner_up_summer <- structure(list(X = c(
  6775L, 6776L, 6777L, 6778L, 6779L, 6780L,
  6781L, 6782L, 6783L, 6784L, 6775L, 6776L, 6777L, 6778L, 6779L,
  6780L, 6781L, 6782L, 6783L, 6784L
), site = c(
  "RAYNER_UP", "RAYNER_UP",
  "RAYNER_UP", "RAYNER_UP", "RAYNER_UP", "RAYNER_UP", "RAYNER_UP",
  "RAYNER_UP", "RAYNER_UP", "RAYNER_UP", "RAYNER_UP", "RAYNER_UP",
  "RAYNER_UP", "RAYNER_UP", "RAYNER_UP", "RAYNER_UP", "RAYNER_UP",
  "RAYNER_UP", "RAYNER_UP", "RAYNER_UP"
), DateTime = structure(c(
  1531173600,
  1531260000, 1531346400, 1531432800, 1531519200, 1531605600, 1531692000,
  1531778400, 1531864800, 1531951200, 1531173600, 1531260000, 1531346400,
  1531432800, 1531519200, 1531605600, 1531692000, 1531778400, 1531864800,
  1531951200
), class = c("POSIXct", "POSIXt"), tzone = ""), value = c(
  19.8,
  21.2, 20.4, 20.1, 17.3, 19.5, 21.2, 21, 19.8, 16.8, 21.5740302174818,
  21.6853770664893, 18.4306976739317, 21.1522381303366, 20.208727594465,
  19.5954797456507, 20.6829415732063, 17.6733329861891, 20.2849614520092,
  20.5253239201847
), Month = c(
  7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
  7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L
), Year = c(
  2018,
  2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2018, 2019, 2019,
  2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019
), Day = c(
  "07/10",
  "07/11", "07/12", "07/13", "07/14", "07/15", "07/16", "07/17",
  "07/18", "07/19", "07/10", "07/11", "07/12", "07/13", "07/14",
  "07/15", "07/16", "07/17", "07/18", "07/19"
)), row.names = c(
  "1",
  "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "21", "31",
  "41", "51", "61", "71", "81", "91", "101"
), class = "data.frame")

【讨论】:

谢谢!我非常感谢您的帮助,斯特凡。这完美地回答了我的问题。

以上是关于ggplot 时间序列图错误:输入无效:time_trans 仅适用于 POSIXct 类的对象,但数据在 POSIXct 中的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误 [500310] [42703]: [Amazon](500310) 无效操作:events_20180626_temp 中不存在列“engagement_time_msec”;

使用 ggplot2 时持续出现无效的图形状态错误

日期:将用户输入转换为日期时间 shell 时的日期无效 [重复]

R语言gganimate包创建可视化gif动图:ggplot2可视化静态条形图(bar plot)gganimate包创建动态条形图(bar plot)动画基于transition_time函数

输入计算到无效时间:大查询中的 24:00:00

R语言gganimate包创建可视化gif动图可视化动图:ggplot2可视化静态散点图(scatter plot)gganimate包创建动态散点图动画基于transition_time函数