Question

J'ai un barplot pour lequel le second semestre devrait s'adapter à cette formule: y~axexp(-b*x^2). Maintenant, je veux tracer l'ensemble barplot et afficher le modèle monté sur la dernière partie du barplot comme il ne vaut que pour cette partie. Cependant, je ne peux pas trouver un moyen d'afficher la ligne graphique que sur le second semestre. Si je fais quelque chose comme


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

La ligne est affichée, mais dans la mauvaise position. Alors, comment puis-je contrôler où la ligne est tracée?

Était-ce utile?

La solution

Un exemple reproductible aurait été utile, mais sans doute la question est que les barres ne sont pas situés aux coordonnées x que vous attendez. Vous trouverez les coordonnées x des barres en capturant la sortie de la fonction 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

Edit: Le même principe peut être utilisé pour ajouter une ligne partielle. Réécriture votre code un peu pour obtenir un idx d'indice montrant les parties des données que vous souhaitez modéliser:

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

(note que j'ai aussi changé seq(0:n) à 0:n, parce que le premier ne vous donne pas une séquence de 0 à n.)

Autres conseils

Prenez la réponse de Aniko et le remodeler à votre problème spécifique. J'ai utilisé le submitted de données que vous avez affiché.

Définissez vos variables:

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

Il suffit simplement d'utiliser la fonction seq() de cette façon. Il fait déjà le travail pour vous. Ensuite, vous faites l'ajustement et de capturer les valeurs x de votre barplot() comme mentionné par Aniko. Cela permettra d'économiser les valeurs x dans une matrice, donc je l'utilise as.vector() après pour la transformer en un vecteur et rendre les choses un peu plus 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)

Si vous imprimez simplement votre bar2 vous verrez les valeurs exactes et maintenant vous pouvez indiquer où placer votre place dans l'intrigue. Assurez-vous que dans votre fonction lines() suivant le vecteur x est de la même longueur que le vecteur y. Par exemple, vous pouvez simplement faire quelques vérifications supplémentaires avec la fonction length(). Voici le votre ajustement placé dans la seconde moitié de votre barplot:

lines(x = bar2[30:(length(bar2)-1)], y = predict(fit1))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top