2010-02-16 11 views
3

J'ai un barplot pour lequel le second semestre devrait s'adapter à cette formule: y~axexp(-b*x^2). Maintenant, je veux tracer le barplot entier et afficher le modèle ajusté sur la dernière partie du barplot car il ne tient que pour cette partie. Cependant, je ne peux pas trouver un moyen d'afficher le graphique linéaire uniquement au cours de la seconde moitié. Si je fais juste quelque chose commeintrigue sur la dernière partie de barplot


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 dessinée?

Répondre

3

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

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

+1

J'ai ajouté quelques exemples de données à mon message d'origine. Comme vous le pouvez, il diffère de vos fausses données. J'espère que ça aide. – Pieter

0

Prenez la réponse de Aniko et modifier la forme à votre problème spécifique. J'ai utilisé les données submitted comme vous l'avez posté.

Définir vos variables:

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

Il est assez juste en utilisant la fonction seq() de cette façon. Il fait déjà le travail pour vous. Ensuite, vous faites l'ajustement et capturez les valeurs x de votre barplot() comme mentionné par Aniko. Cela permettra d'enregistrer les valeurs x dans une matrice, donc j'utilise as.vector() ensuite pour le transformer en 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 la fonction lines() suivante, le vecteur x est de la même longueur que le vecteur y. Par exemple, vous pouvez simplement effectuer des 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))