2

我有一个数据集,其中包含连续四天的每一秒的观察结果(大约 340'000 个数据点)。这太多了,无法在散点图中显示。我只想绘制一个统一的样本,比如 2000 个时间点。

ggplot2是否可以通过“图形语法”方法来实现这一点?我还没有找到任何内置的“采样”修饰符,但也许写一个很容易?

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

编辑:我专门寻找采样,而不是平滑或分箱。我拥有的数据显示了模拟特定过程的一秒钟所需的时间。模拟已经并行化,对于每个模拟秒,我都有所涉及的每个内核的运行时间(总共 8 个)。我想通过仅绘制原始数据点来显示次优负载平衡。采样的原因只是 300'000 个数据点对于散点图来说太多了:绘图时间太长而且可视化效果不好。

4

2 回答 2

3

如果您想为大数据创建散点图,这里有几个ggplot2 选项

他们来自哈德利的这门课程

# 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

您可以binwidthxy变量设置

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

在此处输入图像描述

geom_hex

你可以设置数量bins

base_plot + geom_hex(bins = 200)

在此处输入图像描述

小点

停止过度绘图

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

在此处输入图像描述

使用更平滑的

这依赖于一种平滑方法,可以在不崩溃或花费太长时间的情况下获得所需的细节。在这种情况下,节数是通过反复试验选择的(也许你会想要更多细节)

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

在此处输入图像描述

于 2012-10-02T06:28:14.850 回答
3

您可以geom_point使用 data 参数在调用中使用子集:

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

这样,您可以使用所有数据自由添加其他几何图形,例如,使用示例数据:

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

hexbin 和采样点

于 2012-10-02T08:16:20.793 回答