R:函数中需要有限的'ylim'值 [英] R: need finite 'ylim' values in function
问题描述
我想绘制data.frame中的数据( 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屋!