R:函数中需要有限的'ylim'值 [英] R: need finite 'ylim' values in function

查看:2030
本文介绍了R:函数中需要有限的'ylim'值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想绘制data.frame中的数据( ID ) 。如果在1946年之前的一年是一个团体,那么应该执行 plot 2 。如果年份在1946年至2014年之间,则应执行 plot1

I'd like to plot the data in data.frame xy for each group (defined by ID). When a year before 1946 is in a group, plot 2 should be executed. When the years are between 1946 and 2014, plot1 should be executed.

我的问题:没有NA值,工作正常,但由于我有数据差距,我依靠NAs来定义这些数据差距。这就是为什么我得到一个错误:plot.window中的错误(需要有限的'ylim'值)。我试图在y轴上放置 finite = T plot1 中,但是这给出了一个下标越界错误。有没有一种方法可以解决这个问题,并且图形是正确绘制的?

My problem: This works fine without NA values, but as I have data gaps I rely on NAs to define these data gaps. This is why I get an error: error in plot.window(need finite 'ylim' values). I tried to put finite=T in plot1 at the y-axis but this gives a subscript out of bounds error. Is there a way I could solve this and that the graphics are correctly plotted?

以下是我的代码:它很长,但大部分代码由<$

In the following is my code: It is long but most of the code consists of plot() options on which I rely.

# 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)))


推荐答案

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

In plot1, change y = range(x$VALUE) to y = range(x$VALUE, na.rm=TRUE) to remove NA missing values.

你还有一个问题,就是在这两个函数中你引用 ind [[i]] ,我假设在某些时候这个代码是循环的一部分。我的猜测是所有对的引用ind [[i]] 应该是 x

You have another problem, namely that in both functions you refer to ind[[i]], which I assume means at some point this code was part of a loop. My guess is all the references to ind[[i]] should be x.

这篇关于R:函数中需要有限的'ylim'值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆