【问题标题】:R: need finite 'ylim' values in functionR:在函数中需要有限的“ylim”值
【发布时间】:2014-11-10 08:26:37
【问题描述】:

我想在 data.frame xy 中为每个组(由 ID 定义)绘制数据。当 1946 年之前的一年在一个组中时,plot 2 应该被执行。当年份在 1946 年和 2014 年之间时,应执行 plot1

我的问题:如果没有 NA 值,这可以正常工作,但是由于我有数据间隙,我依靠 NA 来定义这些数据间隙。这就是我收到错误消息的原因:error in plot.window(need finite 'ylim' values)。我试图将finite=T 放在y 轴上的plot1 中,但这会产生subscript out of bounds 错误。有没有办法可以解决这个问题并且正确绘制图形?

以下是我的代码:它很长,但大部分代码由我所依赖的plot() 选项组成。

# read in sample data and split it up by group (defined by ID)
xy <- data.frame(NAME=c("NAME2","NAME2","NAME2","NAME2","NAME2","NAME3","NAME3","NAME3","NAME3","NAME5","NAME5","NAME5","NAME5"), ID=c(48,48,48,48,48,32,32,32,32,67,67,67,67),YEAR=c(1981,1983,1984,1988,1989,1984,1984,1988,1988,1899,1933,1948,1958),VALUE=c(0,205,-570,0,-310,-3680,-3680,NA,-3680,0,NA,13,-98))
ind <- split(x = xy,f = xy[,'ID'])

# Plot Scenario 1: if only years between 1946 and 2014 are present for each group do this:
  plot1 <- function(x) {
  fname <- paste0(x[1, 'ID'], '.png')
  png(fname, width=1679, height=1165, res=150)
  par(mar=c(6,8,6,5))
  plot(x = c(1946, 2014),
       y = range(x$VALUE),
       type='n',
       main=x[1, 'NAME'],
       xlab="Time [Years]",
       ylab="Value")
  axis(2, at = seq(-100000, 100000, 500), cex.axis=1, labels=FALSE, tcl=-0.3)
  points(ind[[i]][,c('YEAR','VALUE')], type="l", lwd=2)
  points(ind[[i]][,c('YEAR','VALUE')], type="p", lwd=1, cex=1,   pch=21, bg='white')
  abline(h=0)
  dev.off()
}

# Plot Scenario 2 if years under 1946 are present do this:
plot2 <- function(x) {
  fname <- paste0(x[1, 'ID'], '.png')
  png(fname, width=1679, height=1165, res=150)    
  par(mar=c(6,8,6,5))
  plot(x[,c('YEAR','VALUE')],
       type='n',
       main=x[1, 'NAME'],
  xlab="Time [Years]",
  ylab="Value [mm]")
axis(2, at = seq(-100000, 100000, 500), cex.axis=1, labels=FALSE, tcl=-0.3)
points(ind[[i]][,c('YEAR','VALUE')], type="l", lwd=2)
points(ind[[i]][,c('YEAR','VALUE')], type="p", lwd=1, cex=1,   pch=21, bg='white')
abline(h=0)
dev.off() 
}

# Execute functions
    lapply(ind, function(x) ifelse(any(x$YEAR < 1946 & x$YEAR < 2014), plot2(x), plot1(x)))

【问题讨论】:

    标签: r function plot range na


    【解决方案1】:

    plot1 中,将y = range(x$VALUE) 更改为y = range(x$VALUE, na.rm=TRUE) 以删除NA 缺失值。

    您还有另一个问题,即在两个函数中您都引用了ind[[i]],我认为这意味着在某些时候该代码是循环的一部分。我的猜测是所有对ind[[i]] 的引用都应该是x

    【讨论】:

    • 就是这样!谢谢!!
    • 具体来说,我相信它是range,它正在返回NA(仅此而已)。 plot(1:5,c(2,3,NA,5,NA)) 之类的东西会成功执行。
    • @CarlWitthoft 是的,范围内的两个值都是NA
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多