Pergunta

Eu tenho um Barlot para o qual a segunda metade deve se encaixar nessa fórmula:y~axexp(-b*x^2). Agora, quero plotar todo o Barplot e exibir o modelo ajustado na última parte do BARPLOT, pois ele se mantém apenas para essa parte. No entanto, não consigo encontrar uma maneira de exibir o gráfico de linha apenas no segundo tempo. Se eu apenas fizer algo como


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

A linha é exibida, mas na posição errada. Então, como posso controlar onde a linha é desenhada?

Foi útil?

Solução

Um exemplo reproduzível teria sido útil, mas provavelmente o problema é que as barras não estão localizadas nas coordenadas X que você espera. Você pode descobrir as coordenadas x das barras capturando a saída do barplot função:

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

Editar:
O mesmo princípio pode ser usado para adicionar uma linha parcial. Reescrevendo seu código um pouco para obter um índice idx mostrando as partes dos dados que você deseja modelar:

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

(Observe que eu também mudei seq(0:n) para 0:n, porque o primeiro não lhe dá uma sequência de 0 a n.)

Outras dicas

Pegue a resposta de Aniko e remodelá -la ao seu problema específico. Eu usei os dados submitted Como você postou.

Defina suas variáveis:

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

É o suficiente apenas usando o seq() função dessa maneira. Já faz o trabalho para você. Então você faz o ajuste e captura os valores x do seu barplot() Como mencionado por Aniko. Isso salvará os valores x em uma matriz, então eu uso as.vector() Depois, transformá -lo em um vetor e facilitar um pouco as coisas.

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 você simplesmente imprimir seu bar2 Você verá os valores exatos e agora pode especificar onde colocar seu ajuste no gráfico. Certifique -se de que, no seu seguinte lines() função O vetor x tem o mesmo comprimento que o vetor y. Por exemplo, você pode simplesmente fazer algumas verificações adicionais com o length() função. Aqui está o seu ajuste colocado na segunda metade do seu Barplot:

lines(x = bar2[30:(length(bar2)-1)], y = predict(fit1))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top