2

我需要创建多个图形的大小版本,以使文本大小相同。我想避免摆弄低级图形参数,但到目前为止,这是唯一对我有用的东西,即使它也不是很完美。

这就是我现在所拥有的。它基本上依赖于将较小图形的 cex 设置为与较小图像与较大图像大小的比率相同,然后将出现在较小图形中的所有文本的 cex 设置为该比率的倒数。

# actual data to be plotted
x       = seq( 1, 10, 0.01 )
B       = 1.0
a       = 1.0
y       = B*(x^((-1)*a))

# set graphical parameters
xlim    = c(0,10)
ylim    = c(0,5)
xlab    = "Number of repetitions"
ylab    = "Time in seconds"
version = "large" # or "small"
if ( version=="large" ) {
    w = 800
    h = 510
} else if ( version=="small" ) {
    w = 266
    h = 170
}

# create the actual plots
# I tried to remove unnecessary details but leave those that might matter for my question
png( paste(version,".png",sep=""), width=w, height=h )
par( las=1 )
if ( version=="large" ) {
    plot( 0, 0, xlim=xlim, ylim=ylim, xlab=xlab, ylab=ylab, col=rgb(0,0,0,0) )
    lines(spline(x,y, method='n', n=1000), lwd=3 )
} else if ( version=="small" ) {
    par( cex=1/3, mar=c(8,8,1,1) )
    plot( 0, 0, xlim=xlim, ylim=ylim, col=rgb(0,0,0,0), axes=FALSE, xlab="", ylab="", frame.plot=TRUE )
    lines(spline(x,y, method='n', n=1000), lwd=2 )
    axis( side=1, cex.axis=3, mgp=c(5.5,2.5,0) )
    title( xlab=xlab, cex.lab=3, mgp=c(5.5,2.5,0) )
    axis( side=2, cex.axis=3, mgp=c(5,2,0) )
    title( ylab=ylab, cex.lab=3, mgp=c(5,2,0) )
}
dev.off()

这工作正常,但我不得不花费大量时间对字符扩展和边距进行手动编码,即使在我完成之后,它仍然只能解决我所显示的具体示例的问题。当我更改几乎任何细节时,例如,如果 y 轴上的标签变得比现在更宽,因为它们的长度是 2 位数而不是 1,我必须返回并再次手工制作新设置。这太糟糕了!我怎样才能让这件事自动发生,而不必手工制作低级细节?

顺便说一句,我最终想让情节线抗锯齿,所以如果提议的解决方案不会使这成为不可能,我将不胜感激。例如,我在某处看到我可以使用 cairoDevice 来消除锯齿,并且可能可以使用 ggplot 来解决我的尺寸问题,但不确定我是否可以同时做到这两个?可以通过使用 pdf 而不是 png 来消除抗锯齿的需要,但我想在网页中显示为图像,所以我认为我需要 png。据我了解,对于 png 格式,保存大而显示小并不适用。

4

0 回答 0