我有一个相当大的数据集(大约 5e5
行)(x, y)
具有附加功能的坐标 z
.它是这样的:
x <- rnorm(1e6, 0, 5)
y <- rnorm(1e6, 0, 10)
dist <- sqrt(x^2 + y^2)
z <- exp(-(dist / 8)^2)
我想用
z
来绘制它们用作颜色美学的功能。但简单 geom_point
这么大的数据集需要一段时间:data.frame(x, y, z) %>%
ggplot() + geom_point(aes(x, y, color = z))
所以我想我需要一种以某种方式聚合积分的方法。一种方法是将一个平面划分为一些小方块并平均所有
z
位于正方形中的点的值。但从长远来看,这可能有点麻烦,最好使用一些已经可用的工具。于是我想到了geom_hex
作为在我的情况下看起来不错的几何图形。但是fill
美学设置为 count
作为默认值。所以我的问题是:fill
geom_hex
的值很容易改成平均值z
特征? z
值可以在六边形内取平均值然后绘制? 编辑:
建议解决方案的比较:
library(microbenchmark)
microbenchmark(
'stat_summary_hex' = {data.frame(x, y, z) %>%
ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x))},
'round_and_group' = {data.frame(x, y, z) %>%
mutate(x=round(x, 0), y=round(y, 0)) %>%
group_by(x,y) %>%
summarize(z = mean(z)) %>%
ggplot() + geom_hex(aes(x, y, fill = z), stat="identity")}
)
Unit: milliseconds
expr min lq mean median uq max neval
stat_summary_hex 2.243791 2.38539 2.454039 2.426123 2.50871 2.963176 100
round_and_group 183.785828 186.38851 188.296828 187.347476 189.10874 218.668487 100
最佳答案
也许它可以帮助stat_summary_hex()
, 或 stat_summary_2d()
.
它们类似于 stat_summary()
,数据被划分为 x
和 y
,然后由 z
总结, 使用 stat_summary_hex()
中指定的函数(或 stat_summary_2d()
)。
library(tidyverse)
data.frame(x, y, z) %>%
# here you can specify the function that welcomes the z parameter
ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x))
它将回答您的第二个问题(十六进制)和您的第三个问题(正如您所说的,性能似乎没问题),而不是使用
geom_hex()
(因此似乎在 geom_hex()
和速度之间存在交易)。编辑
看着你的问题,我用不同的值对函数进行了微基准测试:
Unit: milliseconds
expr min lq mean median uq max neval
3.5e5 205.0363 214.6925 236.8149 225.2286 238.6536 494.7897 100
1e6 575.4861 597.4161 665.4396 620.9151 702.1622 1143.7011 100
此外,您还可以指定垃圾箱,以具有或多或少的“精确”十六进制。默认值应该是 30,这意味着它将在 30 * 30 六边形区域中绘制点:
data.frame(x, y, z) %>%
ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x), bins = 60)
例如( here
multiplot()
函数,如有必要):set.seed(1)
x <- rnorm(1e4, 0, 5)
y <- rnorm(1e4, 0, 10)
dist <- sqrt(x^2 + y^2)
z <- exp(-(dist / 8)^2)
library(tidyverse)
a1 <- data.frame(x, y, z) %>%
ggplot() + geom_point(aes(x, y, color = z))
b1 <- data.frame(x, y, z) %>%
ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x))
c1 <- data.frame(x, y, z) %>%
ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x), bins = 60)
multiplot(a1,b1,c1, cols = 3)
如您所见,添加的六边形越多,您就越接近原始点。
有数据:
x <- rnorm(1e4, 0, 5)
y <- rnorm(1e4, 0, 10)
dist <- sqrt(x^2 + y^2)
z <- exp(-(dist / 8)^2)
关于r - 将具有第三个特征的大量点可视化为颜色 - 一种提高速度的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52912945/