trama nel corso dell'ultima parte del barplot
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?
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))