Frage

habe ich einen BarPlot, für die die zweite Hälfte dieser Formel passen sollte: y~axexp(-b*x^2). Jetzt mag ich die ganzen BarPlot plotten und das angepasste Modell über den letzten Teil des BarPlot angezeigt, da es nur für den Teil hält. Allerdings kann ich nicht einen Weg finden, das Line-Diagramm angezeigt werden nur in der zweiten Hälfte. Wenn ich nur so etwas wie


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

Die Linie wird angezeigt, aber in der falschen Position. So wie kann ich steuern, wo die Grenze gezogen wird?

War es hilfreich?

Lösung

Ein reproduzierbares Beispiel wäre hilfreich gewesen, aber wahrscheinlich das Problem ist, dass die Balken nicht an den x-Koordinaten befinden, die Sie erwarten. Sie können die x-Koordinaten der Stäbe herausfinden, indem die Ausgabe der barplot Funktion erfassen:

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

Bearbeiten
Das gleiche Prinzip kann für das Hinzufügen einer Teillinie verwendet werden. Ihr Code ein bisschen Umschreiben einen Index idx zeigt die Teile der Daten zu bekommen, dass Sie Modell wollen:

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

(beachten Sie, dass ich auch seq(0:n) zu 0:n geändert, weil der erste nicht geben Sie eine Folge von 0 bis n).

Andere Tipps

Nehmen Sie die Antwort von Aniko und neu zu gestalten, um sie Ihren spezifischen Problem. Ich benutzte die Daten submitted wie Sie geschrieben haben.

Definieren Sie Ihre Variablen:

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

Es genügt, nur die seq() Funktion auf diese Weise. Es macht schon die Arbeit für Sie. Dann machen Sie die Passform und erfassen die x-Werte Ihrer barplot() wie von Aniko erwähnt. Das wird die x-Werte in einer Matrix speichern, damit ich as.vector() verwenden danach es in einen Vektor und die Dinge ein wenig leichter zu machen.

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)

Wenn Sie einfach Ihre bar2 gedruckt werden Sie die genauen Werte sehen und jetzt können Sie angeben, wo Ihr Sitz in der Handlung zu platzieren. Achten Sie darauf, dass in Ihrer folgenden lines() Funktion der x-Vektor der gleichen Länge wie der y-Vektor ist. Zum Beispiel können Sie einfach mit der length() Funktion einige zusätzliche Kontrollen tun. Hier ist der Sitz garantiert in die zweite Hälfte Ihres BarPlot platziert:

lines(x = bar2[30:(length(bar2)-1)], y = predict(fit1))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top