Desidero stampare i dati in data.frame xy
per ciascun gruppo (definito da ID
). Quando un anno prima del 1946 è in un gruppo, è necessario eseguire plot 2
. Quando gli anni sono compresi tra il 1946 e il 2014, è necessario eseguire plot1
.R: sono necessari i valori "ylim" finiti nella funzione
Il mio problema: Funziona bene senza valori NA, ma poiché ho lacune nei dati, mi baso su NA per definire queste lacune di dati. Questo è il motivo per cui viene visualizzato un messaggio di errore: error in plot.window(need finite 'ylim' values)
. Ho provato a inserire finite=T
in plot1
sull'asse y ma questo dà un errore subscript out of bounds
. C'è un modo per risolvere questo e che la grafica è tracciata correttamente?
Di seguito è riportato il mio codice: È lungo ma la maggior parte del codice è costituito dalle opzioni plot()
su cui faccio affidamento.
# 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)))
questo era esattamente! Grazie!! – kurdtc
in particolare, credo che sia 'range' che sta restituendo' NA' (e nient'altro). qualcosa come 'plot (1: 5, c (2,3, NA, 5, NA))' verrà eseguito correttamente. –
@CarlWitthoft Sì, è quando entrambi i valori dell'intervallo sono 'NA'. – Thomas