【问题标题】:R Language Error: "date_trans works with object of class Date only" (ggplot2)R 语言错误:“date_trans 仅适用于 Date 类的对象”(ggplot2)
【发布时间】:2023-03-08 01:25:01
【问题描述】:

我正在使用 R 编程语言。我使用了“rehsape”库中的 melt() 函数,因此我的数据看起来像这样:

library(dplyr)
library(ggplot2)
library(reshape2)
library(scales)
    

Table_1 <- data.frame(

"Col_A" = c("2002-01", "2002-01", "2002-01", "2002-02", "2002-02", "2002-02", "2002-03", "2002-03", "2002-03"),
"Col_B" = c("AAA", "AAB", "AAC", "AAA", "ABB", "AAC", "AAA", "AAB", "AAC"),
"Col_C" = c(111, 122.5, 9, 727, 66.4, 3, 992, 88, 12)
    
)

Col_A 是格式为:年-月的日期

表格中的列格式如下:

Table_1$Col_A = as.character(Table_1$Col_A)
Table_1$Col_B = as.factor(Table_1$Col_B)
Table_1$Col_C = as.numeric(Table_1$Col_C)

从这里开始,我使用了 melt() 函数:

melt = melt(Table_1, id = c("Col_A"))

现在,我想将这些数据绘制成以下形式:

p = ggplot(melt, aes(x = Col_A, y=value, group = 1)) + geom_line(aes(color=variable)) + facet_grid(variable ~., scales = "free_y")

我的真实数据有点复杂,我正在尝试修改日期(我有很多日期),以免它们显得杂乱无章。

我正在尝试:

 p = ggplot(melt, aes(x = Col_A, y=value, group = 1)) + geom_line(aes(color=variable)) + facet_grid(variable ~., scales = "free_y") + scale_x_date(date_labels = "m%-%y", date_breaks = '1 month') + theme(axis.text, x = element_text(angle = 45)) 

接着是:

final = p + scale_y_continuous(labels = comma)

但是,我收到了这个错误:Error: Invalid input: date_trans works with objects of class Date only

谁能告诉我我做错了什么? 谢谢

【问题讨论】:

  • 您没有任何日期值。 2002-01 应该是约会吗?它需要月、日、年作为日期。 R 作为日期的单独数据类型,因此您需要从字符转换为该数据类型。那些年/月?您想假设每个值都来自本月的第一天吗?
  • 我认为您的日期存储为字符而不是专用的日期/日期时间类,因此可能值得转换这些。

标签: r date ggplot2 data-visualization


【解决方案1】:

请注意,在使用 melt 时,您将数字和字符值组合在一起,这使 value 列成为字符,因此您看到的数字实际上是字符而不是数字。

要解决手头的问题,您需要将Col_A 列转换为日期类以使用scale_x_date

library(dplyr)
library(ggplot2)

melt %>%
  mutate(Col_A = as.Date(paste0(Col_A, '-01'))) %>%
  ggplot(aes(x = Col_A, y=value, group = 1)) + 
  geom_line(aes(color=variable)) + 
  facet_grid(variable ~., scales = "free_y") + 
  scale_x_date(date_labels = "%m-%y", date_breaks = '1 month') + 
  theme(axis.text = element_text(angle = 45)) 

【讨论】:

  • 谢谢,这似乎有效!您能否解释一下这行代码背后的逻辑: mutate(Col_A = as.Date(paste0(Col_A, '-01'))) %>% ... 为什么要“粘贴”?为什么是“-01”?谢谢!
  • @Noob paste0 只是将字符串连接在一起,因此paste0("stack", "overflow") 生成字符串"stackoverflow"。为了将字符串解释为日期,它们需要采用“YYYY-mm-dd”格式,但您的采用“YYYY-mm”格式,因此需要在末尾添加“-01”将它们转换为正确的日期格式。
  • 感谢您的回复!如果我的日期是字符格式(无论是 y-m-d、m-d、y-m 等),我可以总是使用“paste0”来解决这个问题吗?
  • 并非总是如此。您需要根据日期格式更改代码。在这里,您有标准格式 (Y-m-d) 的日期,因此在没有任何格式规范的情况下使用 as.Date 就足够了。但如果您有其他格式的日期,您可以将特定格式传递给as.Date。此外,lubridate中还有ymddmymdy等功能,可以帮助您轻松转换为日期。
  • 根据我自己的数据,我在运行您的代码时不断收到此错误。错误:至少一层必须包含所有分面变量:“变量”。情节缺少“变量”。第 1 层缺少“变量”。你知道什么可能导致这个问题吗?是否可以只添加一行代码来更改日期类型......然后我可以像以前一样使用 ggplot 吗?谢谢
猜你喜欢
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2020-05-03
相关资源
最近更新 更多