Kub*_*ba_ 8 r data-visualization ggplot2
我有一个非常大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)
Run Code Online (Sandbox Code Playgroud)
我想用一个z用作颜色美学的特征来绘制它们.但是geom_point这么简单的数据集需要一段时间:
data.frame(x, y, z) %>%
ggplot() + geom_point(aes(x, y, color = z))
Run Code Online (Sandbox Code Playgroud)
所以我认为我需要一种以某种方式聚合积分的方法.一种方法是将平面划分为一些小方块,并平均z位于正方形中的点的所有值.但从长远来看,它可能有点麻烦,使用一些已有的工具可能会更好.所以我认为geom_hex在我的情况下看起来很好的geom.但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
Run Code Online (Sandbox Code Playgroud)
stat="identity"用于条形图/柱形图以使用值而不是计数。这似乎适用于 geom_hex
library(dplyr)
library(ggplot2)
x <- rnorm(1e4, 0, 5)
y <- rnorm(1e4, 0, 10)
dist <- sqrt(x^2 + y^2)
z <- exp(-(dist / 8)^2)
## Summarize to rounded x and y, calculate mean(z), use stat = "identity"
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")
Run Code Online (Sandbox Code Playgroud)

也许它会有所帮助stat_summary_hex(),或者stat_summary_2d()。
它们类似于,使用和stat_summary()将数据分为箱,然后使用(或)中指定的函数通过 进行汇总。xyzstat_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))
Run Code Online (Sandbox Code Playgroud)
它将回答你的第二个问题(十六进制)和你的第三个问题(如你所说,性能似乎不错),而不是使用 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
Run Code Online (Sandbox Code Playgroud)
此外,您还可以指定垃圾箱,以具有或多或少的“精确”六角形。默认值应该是 30,这意味着它将在 30 * 30 六角形区域中绘制点:
data.frame(x, y, z) %>%
ggplot( aes(x, y, z=z )) + stat_summary_hex(fun = function(x) mean(x), bins = 60)
Run Code Online (Sandbox Code Playgroud)
例如(如果需要,这里是函数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)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,添加的六角形越多,您就越接近原始点。
有数据:
x <- rnorm(1e4, 0, 5)
y <- rnorm(1e4, 0, 10)
dist <- sqrt(x^2 + y^2)
z <- exp(-(dist / 8)^2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |