сюжетная линия над последней частью барплота - PullRequest
3 голосов
/ 16 февраля 2010

У меня есть барплот, для которого вторая половина должна соответствовать этой формуле: y~a<em>x</em>exp(-b*x^2). Теперь я хочу построить весь барплот и отобразить подогнанную модель поверх последней части барплота, так как она сохраняется только для этой части. Однако я не могу найти способ отобразить линейный график только во второй половине. Если я просто сделаю что-то вроде


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

Строка отображается, но в неправильном положении. Так, как я могу контролировать, где линия проведена?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010

Воспроизводимый пример был бы полезен, но, вероятно, проблема в том, что столбцы не расположены в ожидаемых вами x-координатах. Вы можете узнать x-координаты столбцов, захватив выходные данные функции 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:
Тот же принцип можно использовать для добавления частичной строки. Немного переписав код, чтобы получить индекс idx, показывающий части данных, которые вы хотите смоделировать:

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

(обратите внимание, что я также изменил seq(0:n) на 0:n, поскольку первое не дает последовательности от 0 до n.)

0 голосов
/ 16 февраля 2010

Возьмите ответ от Анико и измените его к своей конкретной проблеме. Я использовал данные submitted, как вы опубликовали.

Определите ваши переменные:

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

Достаточно просто использовать функцию seq() таким образом. Это уже делает работу за вас. Затем вы подгоняете и фиксируете значения x вашего barplot(), как упомянуто Анико. Это сохранит значения x в матрице, поэтому я потом использую as.vector(), чтобы превратить его в вектор и немного упростить.

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)

Если вы просто распечатаете bar2, вы увидите точные значения, и теперь вы можете указать, где разместить ваше соответствие на графике. Убедитесь, что в вашей следующей функции lines() x-вектор имеет ту же длину, что и y-вектор. Например, вы можете просто сделать некоторые дополнительные проверки с помощью функции length(). Вот ваша посадка во второй половине вашего барплота:

lines(x = bar2[30:(length(bar2)-1)], y = predict(fit1))
...