如何光栅化ggplot的单层?

jan*_*glx 5 r ggplot2

Matplotlib 允许对绘图的各个元素进行光栅化并将其保存为混合像素/矢量图形 ( .pdf)(参见例如此答案)。如何在Rwith 中实现相同的效果ggplot2


以下是一个玩具问题,我只想对geom_point图层进行光栅化。

set.seed(1)
x <- rlnorm(10000,4)
y <- 1+rpois(length(x),lambda=x/10+1/x)
z <- sample(letters[1:2],length(x), replace=TRUE)

p <- ggplot(data.frame(x,y,z),aes(x=x,y=y)) +
  facet_wrap("z") +
  geom_point(size=0.1,alpha=0.1) +
  scale_x_log10()+scale_y_log10() +
  geom_smooth(method="gam",formula = y ~ s(x, bs = "cs"))
print(p)
ggsave("out.pdf", p)
Run Code Online (Sandbox Code Playgroud)

.pdf原样保存时,Adobe reader DC 需要大约 1 秒来渲染图形。您可以在下面看到一个.png版本: 出.png

当然,通常可以通过不绘制原始数据来避免该问题

jan*_*glx 7

多亏了ggrastr包通过尤佩图霍夫&埃文Biederstedt现在有可能光栅化各个层。但是,目前(2018-08-13)仅支持 geom_point 和 geom_tile。通过师德面包车工作巢穴品牌,现在可以通过它环绕光栅化任何个人ggplot层ggrastr::rasterise()

# install.packages('devtools')
# remotes::install_github('VPetukhov/ggrastr')

df %>% ggplot(aes(x=x, y=y)) +
      # this layer will be rasterized:
      ggrastr::rasterise(geom_point(size=0.1, alpha=0.1)) +
      # this one will still be "vector":
      geom_smooth()
Run Code Online (Sandbox Code Playgroud)

以前,仅支持少数几何体:要使用它,您必须将其替换geom_pointggrastr::geom_point_rast.

例如:

# install.packages('devtools')
# devtools::install_github('VPetukhov/ggrastr')
library(ggplot2)

set.seed(1)
x <- rlnorm(10000, 4)
y <- 1+rpois(length(x), lambda = x/10+1/x)
z <- sample(letters[1:2], length(x), replace = TRUE)

ggplot(data.frame(x, y, z), aes(x=x, y=y)) +
  facet_wrap("z") +
  ggrastr::geom_point_rast(size=0.1, alpha=0.1) +
  scale_x_log10() + scale_y_log10() +
  geom_smooth(method="gam", formula = y ~ s(x, bs = "cs"))
ggsave("out.pdf")
Run Code Online (Sandbox Code Playgroud)

这会产生一个pdf只包含geom_point图层作为光栅而其他所有内容作为矢量图形的。总体而言,该图看起来与问题中的图相同,但放大显示差异: 示例图片的放大视图 将此与全光栅图形进行比较: 用于比较的所有栅格