我正在尝试使用ggplot2和grDevices中的postscript设备创建特定大小的EPS文件(用于公共纸张出版物)。
问题在于,当我使用下面的代码时,边界框是完全错误的,而不是将纸张的大小调整到我设置的尺寸,grDevices将其绘制在A4纸上。
我不知道我在这里失踪了什么。
library(ggplot2)
library(grDevices)
dat <- data.frame(cond = rep(c("A", "B"), each=10),
xvar = 1:20 + rnorm(20,sd=3),
yvar = 1:20 + rnorm(20,sd=3))
g<-ggplot(dat,aes(x=xvar, y=yvar )) +
geom_point(aes(x=xvar, y=yvar ))
g
setEPS(paper="special",width = 6.75,height = 2.79,horizontal = FALSE, onefile = FALSE)
postscript(file ="Test.eps")
print(g)
dev.off()
答案 0 :(得分:1)
EPS文件没有媒体大小,这是EPS的要求之一。
EPS文件声明由EPS程序制作的标记的BoundingBox,并且封闭文档应该在EPS包含在封闭的PostScript程序中时改变CTM,以便EPS缩放以覆盖媒体的所需区域
因此,您实际上无法适应媒体的规模&#34;使用EPS程序,并且BoundingBox可能不正确(事实上它不符合你的意图并不会使它错误)
如果您将EPS发送到PostScript解释器,它可能(如果您很幸运)在默认媒体上绘制它。它可能会给你一个空白页面,因为EPS文件不允许使用&#39; showpage&#39;运营商要么!
如果您使用Ghostscript来解释EPS程序,您可以使用-dEPSCrop将媒体设置为EPS的BoundingBox。我不确定但是如果你设置-dFitPage,那么Ghostscript会重新缩放EPS以适应当前的媒体大小。如果您需要非默认介质尺寸(A4或Letter),则必须先指定-dDEFAULTPAPERSIZE,或使用其中一个控件设置介质尺寸(例如-g或-dMEDIAWIDTHPOINTS / MEDIAHEIGHTPOINTS)
如果您希望在除了BoundingBox之外的介质尺寸上绘制EPS,可能最容易编写PostScript程序来设置介质尺寸,将CTM设置为定位并缩放EPS,然后包含EPS,最后使用showpage将呈现的内容传输到输出媒体。