2014-09-16 14 views
6

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

risposta

4

In plot1, cambiare y = range(x$VALUE) per y = range(x$VALUE, na.rm=TRUE) rimuovere NA valori mancanti.

Si ha un altro problema, vale a dire che in entrambe le funzioni si fa riferimento a ind[[i]], che presumo significa che a un certo punto questo codice faceva parte di un ciclo. La mia ipotesi è che tutti i riferimenti a ind[[i]] dovrebbero essere x.

+0

questo era esattamente! Grazie!! – kurdtc

+2

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. –

+1

@CarlWitthoft Sì, è quando entrambi i valori dell'intervallo sono 'NA'. – Thomas

Problemi correlati