【问题标题】:Strange dashed lines in zoo plot动物园情节中奇怪的虚线
【发布时间】:2013-01-10 13:34:24
【问题描述】:

我有以下非常简单的 R 脚本,它使用 zoo 在时间线上可视化每日数字:

# Small script to plot daily number of added users to database
library(zoo)

data <- read.csv("search_history.csv", header=FALSE)
# last line will be cut because it might be incomplete
zoodata <- data[1:(length(data$V2)-1), ]
series <- zoo(zoodata$V2, zoodata$V1)

par(mar=c(7, 6, 4, 2), 
    lab=c(5, 6, 5), 
    mgp = c(4, 1, 0))

plot(series,
     main="Number of users added to database over time", 
     xlab="Date", 
     ylab="Number of users",
     las=2,
     lwd=2,
     col="red",
     cex.axis=0.7)

search_history.csv 的内容:

"2012-12-27","458","4728"
"2012-12-28","239","6766"
"2012-12-29","193","8189"
"2012-12-30","148","7698"
"2012-12-31","137","7370"
"2013-01-01","119","6324"
"2013-01-02","122","7016"
"2013-01-03","115","7986"
"2013-01-04","112","8222"
"2013-01-05","112","6828"
"2013-01-06","124","7318"
"2013-01-07","121","8228"
"2013-01-08","120","8158"
...

我想可视化第一列 (V1) 和第二列 (V2)。我基本上有两个问题: first 和明显的一个是 y 位置 ~50 和 ~450 处的虚线。我怎样才能删除它们,为什么它们甚至包括在内?

第二个问题是将 2013-01-26 包含在 x 轴中。如您所见,我删除了包含此数据的数据集的最后一行(就像业余爱好者一样,也许有更好的方法来做到这一点)。所以情节不应该包括最后日期。我不明白为什么它甚至知道这个日期,因为它需要zoodata 作为输入,而不是data

【问题讨论】:

  • 好吧,你太快了,已经发布了答案.. ;-) 成功了,谢谢。你可以回答这个问题,我会接受。很高兴对 stringsAsFactors 进行解释,但并没有真正理解手动解释。最后一件事:通过这些设置,我现在只有 4 个 x-label 刻度(12 月 27 日到 1 月 21 日)。我怎样才能增加这个数字,也许到 8?参数“lab”似乎没有按预期工作,或者我真的不明白。
  • 你的意思是?factor 没有意义吗?这是反对使用 stringsAsFactors=TRUE (stackoverflow.com/a/1368460/967840) 的论据。
  • 查看这篇文章 stackoverflow.com/a/4355118/967840 了解如何使用不同的 x-label 刻度

标签: r plot statistics time-series zoo


【解决方案1】:

你可以使用read.zoo

## double quotes were removed but they could have been left in
series <- read.zoo(text = '
2012-12-27,458,4728
2012-12-28,239,6766
2012-12-29,193,8189
2012-12-30,148,7698
2012-12-31,137,7370
2013-01-01,119,6324
2013-01-02,122,7016
2013-01-03,115,7986
2013-01-04,112,8222
2013-01-05,112,6828
2013-01-06,124,7318
2013-01-07,121,8228
2013-01-08,120,8158', sep =',')

然后使用你的情节指令,

plot(series,
     main="Number of users added to database over time", 
     xlab="Date", 
     ylab="Number of users",
     las=2,
     lwd=2,
     col="red",
     cex.axis=0.7)

您可以直观地比较 2 个 Times 系列...

【讨论】:

  • @agstudy,你为什么要删除所有的引号?它使您看起来需要做一些实际上并不需要做的额外手工工作。
  • @GSee 看起来是这样,但不是......因为我用read.zoo(text=.. 而不是read.zoo(file=.. 测试它。你的回答很好,因为他处理了他的问题,我只是为了告诉他read.zoo 的存在。我用引号对其进行了测试,它也可以工作,但我认为将简单的引号和双引号放在一起并不是一个好主意......谢谢你的收获。
  • @wnstnsmth,如果你还没有看过的话,这里有一个完整的 Reading Data in zoo 小插图。
【解决方案2】:

两件事:您的字符串被视为因素,并且您正在通过字符向量而不是日期来索引您的 zoo 对象。

如果您在您的 read.csv 调用中包含 stringsAsFactors=FALSE 并为您的 zoo 对象提供一个 Date 索引,它将看起来更像您的预期。

library(zoo)    
data <- read.csv(text='"2012-12-27","458","4728"
                 "2012-12-28","239","6766"
                 "2012-12-29","193","8189"
                 "2012-12-30","148","7698"
                 "2012-12-31","137","7370"
                 "2013-01-01","119","6324"
                 "2013-01-02","122","7016"
                 "2013-01-03","115","7986"
                 "2013-01-04","112","8222"
                 "2013-01-05","112","6828"
                 "2013-01-06","124","7318"
                 "2013-01-07","121","8228"
                 "2013-01-08","120","8158"', header=FALSE, 
                 stringsAsFactors=FALSE)

zoodata <- data[1:(length(data$V2)-1), ]
series <- zoo(zoodata$V2, as.Date(zoodata$V1))

par(mar=c(7, 6, 4, 2), 
    lab=c(5, 6, 5), 
    mgp = c(4, 1, 0))

plot(series,
     main="Number of users added to database over time", 
     xlab="Date", 
     ylab="Number of users",
     las=2,
     lwd=2,
     col="red",
     cex.axis=0.7)

产生:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2011-12-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    相关资源
    最近更新 更多