【问题标题】:Plotting multiple time series in 1 graph using GGPLOT2 and grouping dates by week OR month使用 GGPLOT2 在 1 个图中绘制多个时间序列并按周或月对日期进行分组
【发布时间】:2013-11-22 19:16:19
【问题描述】:

我喜欢 R,但简单的绘图让我发疯。我有 5 列数据。第一列数据的日期为“数字”格式,例如 20101101、20101102 等...我尝试从数字转换为日期,但没有成功。

我想用 col1、col2、col3 和 col4 以及 x 轴上的日期按周或月制作一个折线图。我不想每周或每月查看所有日期。你能帮忙吗?

这是我的 R 代码:

dates<-c(20101101,20101102,20101103,20101104,20101105,20101106,20101107,20101108,20101109,20101110,20101111,20101112,20101113,20101114,20101115,20101116,20101117,20101118,20101119,20101120)  <br/>
col1<-c(seq(from=1,to=20, by=1))<br/>
col2<-c(seq(from=11,to=30, by=1))<br/>
col3<-c(seq(from=21,to=40, by=1))<br/>
col4<-c(seq(from=31,to=50, by=1))<br/>
data<-cbind(dates, col1, col2, col3, col4)<br/>
class(dates)<br/>
data  #This is what my data looks like. NOTE: the "dates" field is type numeric so I TRY convert it below<br/><br/>

data[,1]<-as.Date(as.character(data[,1]), format("%Y%m%d"))#convert to date class<br/>
class(data[,1])  ### the conversion did not work. Help? The date column is still is numeric<br/>
现在我想使用 ggplot 显示一个包含 4 条线的折线图,x 轴上的日期按周或月显示


有什么帮助吗??

#####


谢谢。

【问题讨论】:

  • 普莱斯!停止在 HTML 中发布。删除所有&lt;br&gt;'s 真的很痛苦

标签: r


【解决方案1】:

正如@Dwin 指出的那样,使用data.frame 而不是矩阵,因为您的转换工作正常。

e.g. class(as.Date(as.character(data[,1]), format("%Y%m%d")) )
 #[1] "Date"

要使用ggplot2 绘制您想要的内容,您需要很长时间的数据,在这里使用melt() 然后scale_x_date() 来按周格式化轴。

data<-data.frame(dates=dates, col1=col1, col2=col2, col3=col3, col4=col4)
library(plyr)
data <- melt(data, id.vars="dates")
data[,1]<-as.Date(as.character(data[,1]), format("%Y%m%d"))
ggplot(data, aes(x=dates,y=value)) + geom_point(aes(colour=variable))  + 
      scale_x_date(breaks = date_breaks("weeks"), labels = date_format("%d-%b"))

【讨论】:

  • 别担心,如果您愿意,请记住为您认为不错的答案投票,并接受哪个答案真正回答了您的问题! :)
【解决方案2】:

您不能将 R 日期与矩阵中的数字列混合。只能在数据框中执行:

data <- as.data.frame(data)
data$dates <- as.Date(as.character(data$dates), format="%Y%m%d")
 head(data)
       dates col1 col2 col3 col4
1 2010-11-01    1   11   21   31
2 2010-11-02    2   12   22   32
3 2010-11-03    3   13   23   33
4 2010-11-04    4   14   24   34
5 2010-11-05    5   15   25   35
6 2010-11-06    6   16   26   36

我从来没有“得到” ggplot 的东西。似乎是graphics::matplot 的工作:

png("my.png")
matplot(x=data[[1]], y=data[-1], type="l", xaxt="n")
axis(1, at=data$dates,labels=as.character(data$dates))
dev.off()

我在 ggplot 上的失败尝试:

> p <- ggplot(data=data, aes(x=dates, y=data[,2:5]) )+geom_line()
> p
Don't know how to automatically pick scale for object of type data.frame. Defaulting to continuous
Error: Aesthetics must either be length one, or the same length as the dataProblems:data[, 2:5]

【讨论】:

  • 好的,谢谢。你能帮忙画图吗?我想在折线图中显示 4 行,日期为 by=week 或 by=month。我不想显示所有日期,因为如果它们都显示,您将无法阅读它们。谢谢!
  • 所以我在这里看到:
    sixhat.net/how-to-plot-multpile-data-series-with-ggplot.html

    df.melted
    ggplot(data= df.melted, aes(x=x, y=value))+geom_line()
    但它不起作用。
  • 我认为您可能比我更好地“获得”了 ggplot 范式。但是那个链接提出了一个我也不明白的问题。
  • +1 matplot 不需要重塑。另外@user3022875 我喜欢你忽略了 html 评论并继续将它们粘贴到你的 cmets...
  • @hadley 没有尝试在 aes() 功能中复制 matplot 的行为,这让我很困惑。或者也许他做到了,而我错过了备忘录。
猜你喜欢
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2018-07-05
  • 2017-10-17
  • 2013-01-16
  • 2022-01-09
  • 2023-04-08
  • 2017-01-25
相关资源
最近更新 更多