如何优雅地调整格点图形的比例?

13
当准备打印图表时,我经常需要将它们缩小到比屏幕上显示的要小得多。通常情况下,图表可能只有几厘米大小。使用标准图形包中的par(cex=...)可以缩小整个绘图以适应这么小的区域,并仍然保持成比例的外观。在lattice包中是否有类似的功能?
基本上,如何在保持左侧面板比例的同时将图形绘制为右侧面板大小?

enter image description here enter image description here

这个问题经常困扰我,通常我会疯狂尝试使用 trellis.par.gettrellis.par.set 进行实验,然后放弃并使用标准图形重新绘制整个图形(非常麻烦)。当我发现 trellis.par.set(simpleTheme(cex=...)) 的时候,我以为我找到了宝藏,但似乎它并没有起到任何作用。
澄清一下,我想要重新调整绘图中的所有内容,包括字体大小、边距和刻度大小。我知道我可以通过调整 pdf(height=..., width=...) 来获得所需比例,并在排版软件(例如InDesign或文字处理软件���中重新调整比例,但如果每个 PDF 文件都有其预期的尺寸嵌入其中,我觉得我会更好地控制整个过程。
2个回答

22

简介

对于一个格子图的元素大小可以通过多种方式进行缩放。一种方法是更改所有具有cex属性的参数,另一种方法是更改基本fontsize作为绘制的基础。你想要的解决方案是后者,你很快就会看到,但是通过par.settings参数影响单个组件的绘图也是有益的,因为在设置fontsize时可能需要定制应用于单个组件的相对缩放。

tl:dr(总结)

使用@Andrie答案中的示例绘图

require(lattice)
plt <- xyplot(decrease ~ treatment, OrchardSprays, groups = rowpos,
              type = "a",
              auto.key = list(space = "right", points = FALSE, lines = TRUE))

设置fontsize参数,一个由textpoints组成的列表,它定义了这两个关键图形元素的基础尺寸,所有其他图形装饰都是从这两个元素生成的。

update(plt, par.settings = list(fontsize = list(text = 8, points = 4)))

输入图像描述

(在150px x 200px的PNG光栅设备上呈现)。

为绘图元素设置单独的cex参数

需要注意的一点是,Lattice图的外观由一系列参数控制,这些参数由trellis.par.get()返回。

> thm <- trellis.par.get()
> str(thm, max = 1)
List of 35
 $ grid.pars        : list()
 $ fontsize         :List of 2
 $ background       :List of 2
 $ panel.background :List of 1
 $ clip             :List of 2
 $ add.line         :List of 4
 $ add.text         :List of 5
 $ plot.polygon     :List of 5
 $ box.dot          :List of 5
 $ box.rectangle    :List of 5
 $ box.umbrella     :List of 4
 $ dot.line         :List of 4
 $ dot.symbol       :List of 5
 $ plot.line        :List of 4
 $ plot.symbol      :List of 6
 $ reference.line   :List of 4
 $ strip.background :List of 2
 $ strip.shingle    :List of 2
 $ strip.border     :List of 4
 $ superpose.line   :List of 4
 $ superpose.symbol :List of 6
 $ superpose.polygon:List of 5
 $ regions          :List of 2
 $ shade.colors     :List of 2
 $ axis.line        :List of 4
 $ axis.text        :List of 5
 $ axis.components  :List of 4
 $ layout.heights   :List of 19
 $ layout.widths    :List of 15
 $ box.3d           :List of 4
 $ par.xlab.text    :List of 5
 $ par.ylab.text    :List of 5
 $ par.zlab.text    :List of 5
 $ par.main.text    :List of 5
 $ par.sub.text     :List of 5

有很多因素会影响注释中所绘制的对象和文本的大小。您需要修改所有相关设置并将其仅作为列表传递给par.settings()。下面是一个例子,演示如何缩放@Andrie的示例图:

CEX <- 0.5

pset <- list(superpose.symbol = list(cex = CEX),
             plot.symbol      = list(cex = CEX),
             par.sub.text     = list(cex = CEX),
             par.main.text    = list(cex = CEX),
             par.zlab.text    = list(cex = CEX),
             par.ylab.text    = list(cex = CEX),
             par.xlab.text    = list(cex = CEX),
             dot.symbol       = list(cex = CEX),
             box.dot          = list(cex = CEX),
             add.text         = list(cex = CEX),
             axis.text        = list(cex = CEX))
plt2 <- update(plt, par.settings = pset)

使用gridExtra包在同一设备上安排两个lattice图形,我们可以看到所有这些效果:

require("gridExtra")  ## loads package:grid too
grid.arrange(plt, plt2, ncol = 2)

导致

在此输入图像描述

现在(几乎)所有内容都已经被缩放了。有一件有趣的事情需要注意,即这种方法没有缩放图例中线条的长度和刻度线的长度。请注意,每个子图的区域大小都是相同的。但是我们可以在更小的尺寸上绘制整个图形:

在此输入图像描述

这是合理的,并且在基于矢量的设备(例如pdf())上呈现效果将比我必须用来说明的光栅png()更好。第二个图是在150px x 200px的设备上绘制的。

通过设置基础fontsize来控制整体缩放

有一个更简单的方法,那就是通过fontsize参数设置文本和点的基础字体大小。它们的默认值为:

> trellis.par.get("fontsize")
$text
[1] 12

$points
[1] 8

这些会影响图形的所有元素,因此我们可以缩小它们以实现类似于设置所有其他选项的效果。

update(plt, par.settings = list(fontsize = list(text = 8, points = 4)))

该代码将会生成以下图像:

enter image description here

这个图像是在与之前的第二张图相同大小的png()设备上绘制的。请注意边距如何调整,使得绘图更好地缩放。因此,我们不仅影响了我们之前更改的所有设置,还影响了绘图的其他部分(例如间距和刻度标记),它们也从fontsize设置中获取了队列。再次说明,将这些绘制在矢量设备上将会产生更好的输出。


非常感谢您提供如此全面的答案!我也从中学到了其他一些东西。 - Backlin
太棒了!我本来想自己弄清楚并记录这些内容,但很高兴你已经做好了。 - Aaron left Stack Overflow

4
你需要将 cex=... 传递给图例/键,而不是整个绘图:

这是默认设置:

xyplot(decrease ~ treatment, OrchardSprays, groups = rowpos,
       type = "a",
       auto.key =
         list(space = "right", points = FALSE, lines = TRUE))

比较在关键字中使用cex=0.25时的结果:

enter image description here

xyplot(decrease ~ treatment, OrchardSprays, groups = rowpos,
       type = "a",
       auto.key =
         list(space = "right", points = FALSE, lines = TRUE, cex=0.25))

enter image description here


谢谢,这是一个很好的观点。然而,我想重新调整图中的所有内容,包括字体大小、边距和刻度大小。 - Backlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接