如何通过ggplot以PDF格式编码点?

时间:2017-09-08 05:30:09

标签: r pdf ggplot2 adobe cairo

当我为一个数字尝试不同形状的geom_point时,我注意到生成的PDF文件大小差异很大。我调查并发现:

library(ggplot2)
library(purrr)
library(dplyr)

testplots <- function(df, shp) {
  ggplot(df, aes(x, y)) + geom_point(shape = shp, alpha = 0.1)
}

testdf <- expand.grid(x = 1:40, y = 1:40, z = 1:10) 

0:25 %>% 
  walk(., ~ggsave(plot = testplots(testdf, .x), 
                  filename = paste0("./test/", .x, ".pdf")))

这只会为26种不同形状中的每一种生成16,000个点(具有Alpha透明度,也会影响文件大小)的网格,并将每个绘图保存在适当命名的PDF中。

然后我读取每个PDF的文件大小并绘制结果:

data_frame(shp = 0:25) %>% 
  mutate(size_bytes = map_dbl(shp, 
                              ~file.size(paste0("./test/", .x, ".pdf")))) %>% 
  ggplot(aes(shp, size_bytes, shape = shp)) + 
    geom_point(size = 5) + 
    scale_shape_identity()

enter image description here

我的天真猜测是,圆点被编码为类似"draw a circle, x, y, radius"的向量,而方块则为"draw a box, x1, y1, x2, y2, x3, y3, x4, y4"。所以我猜多边形越多,文件越大。

事实并非如此!圆圈实际上总是有最大的文件,而正方形是最小的。三角形接近正方形,但随后各种装饰形状更高。

有人有解释吗?

P.S。

我还尝试使用ggsave(..., device = cairo_pdf)这些结果,这些结果相似,但不一样:

enter image description here

0 个答案:

没有答案