2015-10-01 4 views
0

Я пытаюсь построить вектор, y который имеет 604800 точек, в последовательности: x=seq(from=1, to=604800). Это не проблема, но мне нужно добавить кривую лёсса к сюжетам.Быстрый способ добавления кривой лёсса к большому набору данных.

Я пробовал это, используя ggplot2, но это берет навсегда, и, как известно, плохо при печати больших наборов данных. См R код:

vf <- ggplot(single.prop, aes(x,y)) + geom_line(linetype=1, size=1) 
vf <- vf + stat_smooth(method="loess",fullrange=TRUE,aes(outfit=fit1<<-..y..)) 
vf 

Я теперь пытался использовать base пакет, но это также принимает навсегда:

lw <- loess(y ~ x,data=single.prop) 
plot(y ~ x, data=single.prop,pch=19,cex=0.1) 
k <- order(single.prop$x) 
lines(single.prop$x[k],lw$fitted[k],col="red",lwd=3) 

Кто-нибудь еще есть какие-либо предложения о том, что я могу сделать, чтобы сделать этот пробег быстрее? Я должен делать это несколько раз и до сих пор ждал около 15 минут для одного сюжета и до сих пор не завершен.

+0

Вы попробовали просто 'stat_smooth (method =" loess ")' in 'ggplot'. Это требует времени, но, похоже, работает – Mateusz1981

+0

Да, это был мой оригинальный метод, как указано выше. – sym246

ответ

0

С этим большим количеством точек данных это может действительно длиться долгое время для отображения графика. Конечно, это зависит от данных, но часто сюжет с этим множеством точек не дает очень интерпретируемой картины. Для обоих интерпретаций может быть полезно сначала вычислить статистические данные, а затем построить график. В вашей ситуации я могу представить, что биннинг на x и вычисление одной или нескольких характеристик для y для каждого бина может быть полезным. Я сделал небольшой пример со средним значением, но, конечно, вы можете использовать стат по своему вкусу. Надеюсь, это поможет.

x <- 1:10^6 
y <- x/10^5 + rnorm(10^6) 
plot_dat <- data.frame(x, y) 
p <- ggplot(plot_dat, aes(x,y)) + geom_point() 


bin_plot_dat <- function(bin_size){ 
    nr_bins <- nrow(plot_dat)/bin_size 
    x2 <- rep(1:nr_bins * bin_size, each = bin_size) 
    y2 <- tapply(plot_dat$y, x2, mean) 
    data.frame(x = unique(x2), y= y2) 
} 

plot_dat2 <- bin_plot_dat(50) 
p2 <- ggplot(plot_dat2, aes(x,y)) + 
    geom_point() 

p2 + geom_smooth() 

 Смежные вопросы

  • Нет связанных вопросов^_^