gpt4 book ai didi

r - 在 ggplot2 中绘制大矩阵的直方图比基本 hist() 慢 20 倍

转载 作者:行者123 更新时间:2023-12-03 16:38:42 28 4
gpt4 key购买 nike

我有一个数字矩阵,大约有 10M 个值,只需要在直方图中显示值的分布。在基数 R 中,hist()这样做非常快。但是如果我想使用 ggplot ,它要慢得多(我也必须先融化矩阵,但这不是限时步骤)。有什么办法可以用 ggplot 使它快速吗?

require(microbenchmark)
require(ggplot2)


mtx1 <- matrix(rnorm(6e4*150), nrow = 6e4)
df1 <- reshape2::melt(mtx1)

g_hist <- function(df){
print(ggplot(df, aes(x=value)) + geom_histogram(bins=30))
}

print(microbenchmark(
hist(mtx1),
g_hist(df1),
times=3L
), signif=3)


# Unit: milliseconds
# expr min lq mean median uq max neval
# hist(mtx1) 384 471 530 559 603 647 3
# g_hist(df1) 7710 8000 8190 8300 8440 8570 3

最佳答案

这是使用基数 R hist() 计算直方图箱和箱计数的解决方案功能。 (计算 bin 确实似乎是 geom_histogram() 中瓶颈的根源)。

然后我使用计算的 bin 计数和 bin 边界以及 geom_rect()绘制一个看起来与 geom_histogram() 生成的直方图几乎相同的直方图.

所需时间仍大于基数hist() ,但是是 1.5 倍而不是 20 倍。

quick_hist = function(values_vec, breaks=50) {
res = hist(values_vec, plot=FALSE, breaks=breaks)

dat = data.frame(xmin=head(res$breaks, -1L),
xmax=tail(res$breaks, -1L),
ymin=0.0,
ymax=res$counts)

ggplot(dat, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax)) +
geom_rect(size=0.5, colour="grey30", fill="grey80")
}


ggsave("quick_hist.png",
plot=quick_hist(mtx1) + theme_bw(),
width=8, height=4, dpi=150)


print(microbenchmark(hist(mtx1),
g_hist(df1),
print(quick_hist(mtx1, breaks=30)),
times=5L), signif=3)

# Unit: milliseconds
# expr min lq mean median uq max neval
# hist(mtx1) 264 270 305 298 332 359 5
# g_hist(df1) 5740 5760 6180 5770 5920 7700 5
# print(quick_hist(mtx1, breaks = 30)) 407 418 440 433 440 503 5

enter image description here

关于r - 在 ggplot2 中绘制大矩阵的直方图比基本 hist() 慢 20 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56607124/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com