Domanda

Ho un barplot per il quale il secondo semestre dovrebbe adattarsi a questa formula: y~axexp(-b*x^2). Ora voglio tracciare l'intero barplot e visualizzare il modello montato sopra l'ultima parte del barplot quanto vale solo per quella parte. Tuttavia, non riesco a trovare un modo per visualizzare la linea-graph solo nella seconda metà. Se ho solo fare qualcosa di simile


submitted=c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 3L, 2L, 1L, 1L, 4L, 
3L, 2L, 11L, 6L, 2L, 16L, 7L, 17L, 36L, 27L, 39L, 41L, 33L, 42L, 
66L, 92L, 138L, 189L, 249L, 665L, 224L, 309L, 247L, 641L, 777L, 
671L, 532L, 749L, 506L, 315L, 292L, 281L, 130L, 137L, 91L, 40L, 
27L, 34L, 19L, 1L)
x=seq(0:(length(submitted)-1))
y1=rs$submitted[30:(length(submitted)-1)]
x1=seq(0:(length(y1)-1))
fit1=nls(y1~a*x1*exp(-b*x1^2),start=list(a=500,b=.01),trace=TRUE)
barplot(submitted,names.arg=x, las=2, cex.axis=0.8, cex=0.8)
lines(predict(fit1))

Si apre la linea, ma nella posizione sbagliata. Così come posso controllare dove la linea è disegnata?

È stato utile?

Soluzione

Un esempio riproducibile sarebbe stato utile, ma probabilmente il problema è che le barre non si trovano presso le coordinate x che ci si aspetta. È possibile trovare le coordinate x dei bar catturando l'output della funzione barplot:

dat <- 1:5                   # fake data for barplot
fit <- dat+rnorm(5, sd=0.1)  # fake fitted values

bp <- barplot(dat)           # draw plot and capture x-coordinates
lines(bp, fit)               # add line

Modifica
Lo stesso principio può essere usato per aggiungere una linea parziale. Riscrivere il codice un po 'per ottenere un idx indice che mostra le parti dei dati che si desidera modellare:

x <- 0:(length(submitted)-1) 
idx <- 30:(length(submitted)-1)  # the part of the data to be modeled
y1 <- submitted[idx] 
x1 <- idx-30 
fit1 <- nls(y1~a*x1*exp(-b*x1^2),start=list(a=500,b=.01),trace=TRUE) 
# capture the midpoints from the barplot
bp <- barplot(submitted,names.arg=x, las=2, cex.axis=0.8, cex=0.8) 
# subset the midpoints to the range of the fit
lines(bp[idx], predict(fit1)) 

(notare che ho anche cambiato seq(0:n) a 0:n, perché la prima non ti dà una sequenza di 0 e n.)

Altri suggerimenti

Prendere la risposta da Aniko e rimodellare al vostro problema specifico. Ho usato il submitted dei dati come avete pubblicato.

Definisci le variabili:

y1 <- submitted[30:(length(submitted)-1)]
x1 <- seq(length(y1))

E 'sufficiente utilizzare la funzione seq() in questo modo. Lo fa già il lavoro per voi. Poi si fa la forma e catturare i valori x della vostra barplot() come detto da Aniko. Che salverà il valori x in una matrice per cui uso as.vector() poi a trasformarla in un vettore e rendere le cose un po 'più facile.

fit1 <- nls(y1~a*x1*exp(-b*x1^2),start=list(a=500,b=.01),trace=TRUE)
bar <- barplot(submitted, las=2, cex.axis=0.8, cex=0.8)
bar2 <- as.vector(bar)

Se semplicemente stampare il bar2 vedrete i valori esatti e ora è possibile specificare dove posizionare la vostra misura nella trama. Assicurarsi che nella vostra funzione seguente lines() l'x-vettore è della stessa lunghezza della y-vettore. Ad esempio, si può semplicemente fare alcuni controlli supplementari con la funzione length(). Ecco la vostra misura collocato nella seconda metà della tua barplot:

lines(x = bar2[30:(length(bar2)-1)], y = predict(fit1))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top