代码之家  ›  专栏  ›  技术社区  ›  Tina

情节不考虑NA值的zoo打印行

  •  1
  • Tina  · 技术社区  · 6 年前

    我正在用每天的降雨量数据和每4天的水温测量值绘制一个动物园对象。在合并数据时,我在两天之间得到了一些NA数据,因此这条线没有连接点。这里有一个(非常)简单的布局糟糕的例子:

    install.packages('zoo')
    library(zoo)
    
    Datum<-as.Date(c("2017-07-01", "2017-07-02", "2017-07-03", "2017-07-04"))
    data<-as.data.frame(Datum)
    data$Rain<-c(3,5,6,7)
    data$Temperature<-c(10, NA, 11, 12)
    data.zoo<-read.zoo(data, by=Datum)
    
    plot(data.zoo, type=c("h", "o"), lwd=c(5,1), col=c("blue", "red"))
    

    我需要的是温度数据点之间的一条线。我几乎在这里找到了答案 Plotting xts objects works with points but not with lines . 然而,插入etc数据是不可能的(或有意义的),我知道连接准时数据在科学上是不正确的,但如果我不这样做,那么这些图实际上并不直观,并且很难在25个图之间进行光学比较。这就是为什么我想在点之间画线。

    不合并数据并因此不生成NA实际上是不可能的,否则代码块将不再工作。代码块有点复杂(对于我的编码级别),例如,降雨量数据和温度数据在同一屏幕上,有花哨的轴标签,并且包含一个for循环,用于自动打印每组的pdf等。

    提前非常感谢, 蒂娜

    1 回复  |  直到 6 年前
        1
  •  0
  •   G. Grothendieck    6 年前

    1) 屏幕 绘制两次温度曲线,一次作为直线,使用 na.approx 填充空NAs以防止线路断开,并再次使用点以使点可见。使用 screens= 指定要在同一面板上叠加线和点的步骤。

    plot(cbind(data.zoo, na.approx(data.zoo$Temperature)), 
      screens = c("Rain", "Temperature", "Temperature"), 
      type = c("h", "p", "l"),
      lwd = c(5, 1, 1), 
      col = c("red", "blue", "blue"),
      main = "Temperature and Rain")
    

    2) 面板 也可以使用自定义面板功能执行此操作:

    my.panel <- function(x, y, ..., pf = parent.frame()) {
      if (pf$panel.number == 1) {
            lines(x, y, type = "h", col ="red", lwd = 5)
      } else {
            lines(x, na.approx(y), col = "blue")
            points(x, y, col = "blue")
      }
    }
    
    plot(data.zoo, panel = my.panel, main = "Temperature and Rain")
    

    这两种方法中的任何一种都会产生以下输出:

    screenshot