2012-10-02 2 views
1

У меня есть набор данных, который содержит наблюдения за каждую секунду из четырех последовательных дней (примерно 340 000 точек данных). Это слишком много для отображения на диаграмме рассеяния. Я хотел бы построить только единый образец, скажем, 2000 точек времени.Задание образца временного ряда

Можно ли достичь этого с помощью подхода «грамматика графики» ? Я не нашел встроенного модификатора «выборки», но, возможно, его достаточно просто написать?

library(ggplot2) 

x <- 1:100000 
d <- data.frame(x=x, y=rnorm(length(x))) 
ggplot(d[sample(x, 2000), ], aes(x=x, y=y)) + geom_point() 

Это то, как это может быть «взломан» путем изменения данных, передаваемых в ggplot. Но я не хочу изменять данные, просто отфильтруйте его, чтобы включить только образец.

ggplot(d, aes(x=x, y=y)) + ??? + geom_point() 

EDIT: Я специально искал для отбора проб, не сглаживая или биннинга. Данные, которые у меня есть, показывают время, необходимое для моделирования одной секунды определенного процесса. Моделирование было распараллелено, и для каждой моделируемой секунды у меня есть время выполнения для каждого из задействованных ядер (всего 8). Я хочу показать не оптимальную балансировку нагрузки, построив только исходные точки данных. Причиной выборки является то, что 300 000 точек данных слишком велики для графика рассеяния: график занимает слишком много времени, и визуализация не является хорошей.

+1

Вы должны попробовать свои данные в какой-то момент AFAIK, и решение, которое вы опубликовали, похоже, достаточно эффективно. Этот подход будет быстрее и займет меньше памяти, чем любая дополнительная геометрия/преобразование данных, которые будет реализовывать ggplot. – Chase

+1

Я бы не назвал построение подмножества данных, построив подмножество данных * взлома *. – mnel

+0

@mnel: Я делаю. Это противоречит синтаксису ggplot2. Данные переходят в ggplot немодифицированный, период. Все остальное - визуализация. – krlmlr

ответ

3

Вы можете Подмножество с в geom_point вызова с помощью аргумента данных:

... + geom_point(data=d[sample(x,2000),]) 

Таким образом, вы можете добавить другие геометрии, используя все данные, например, с помощью примера данные:

ggplot(d, aes(x=x, y=y)) + geom_hex() + geom_point(data=d[sample(x,2000),]) 

hexbin and sampled points

+0

Другим способом изменения «активного» набора данных является использование оператора '% + %':' ggplot()% +% d [sample (...),] + ... ' – krlmlr

3

Если вы хотите создать график рассеяния для больших объемов данных здесь пару ggplot2 вариантов

Они приходят из This course by hadley

# upload all images to imgur.com 
opts_chunk$set(fig.width = 5, fig.height = 5, dev = "png") 
render_markdown(strict = T) 


# some autocorrelated data 
set.seed(1) 
x <- 1:1e+05 
d <- data.frame(x = x) 
d$y <- arima.sim(list(order = c(1, 1, 0), ar = 0.9), n = 1e+05 - 1) 
# the basic plot 
base_plot <- ggplot(d, aes(x = x, y = y)) 

geom_bin2d

вы можете установить binwidth для x и y переменные

base_plot + geom_bin2d(binwidth = c(200, 5)) 

enter image description here

geom_hex

вы можете установить количество bins

base_plot + geom_hex(bins = 200) 

enter image description here

мелочах

Остановки overplotting

base_plot + geom_point(size = I(".")) 

enter image description here

использовать более гладкую

Это зависит от наличия методы сглаживания, который поможет вам деталь вы хотите без сбоев или слишком долго.В этом случае число узлов было выбрано методом проб и ошибок (и, возможно, вы хотите более подробно)

library(mgcv) 
base_plot + stat_smooth(method = "gam", formula = y ~ s(x, k = 50)) 

enter image description here

+0

Пример, который я привел, в значительной степени фиксирует, что такое данные. Конечно, есть общая тенденция, и я буду делать некоторые биннинг или сглаживание позже; но сначала я хочу построить необработанные данные. – krlmlr

+0

'base_plot + geom_point (size = I (". "))' Вычисляет необработанные данные – mnel

+0

Но это слишком много данных! Нет ли способа получить образец (кроме filddling с данными)? – krlmlr

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