【问题标题】:How to nicely rescale lattice figures?如何很好地重新调整晶格图形?
【发布时间】:2023-03-27 02:29:02
【问题描述】:

在准备要打印的图形时,我经常需要使它们比屏幕上显示的要小得多。将数字缩小到几厘米的情况并不少见。使用标准图形包par(cex=...) 可用于缩小整个绘图以适应如此小的区域并且仍然看起来成比例。 lattice 包中是否有等价物?

基本上,如何在右面板的大小上绘制下图,但保留左面板的比例?

这个问题时不时地发生在我身上,它通常让我疯狂地尝试trellis.par.gettrellis.par.set,然后放弃并使用标准图形重绘整个图形(非常时间>乏味)。发现trellis.par.set(simpleTheme(cex=...))时,我以为我中了金币,但它似乎没有任何作用。

说明

我想重新调整绘图中的所有内容,包括字体大小、边距和刻度大小。很多。我知道我可以简单地调整pdf(height=..., width=...) 以获得我喜欢的比例,然后在排版中重新调整它,例如InDesign 或文字处理器,但我觉得如果每个 pdf 都在文件中嵌入了其预期的尺寸,我会得到更好的控制。

【问题讨论】:

    标签: r lattice


    【解决方案1】:

    简介

    有几种方法可以缩放格子图元素的大小。一种选择是更改所有带有cex 属性的参数,另一种是更改所有绘制到的基础fontsize。您想要的解决方案是后者,您将在一分钟内看到,但了解如何通过 par.settings 参数影响绘图的各个组件也很有指导意义,因为您可能希望调整应用于个人的相对缩放设置fontsize时的组件。

    tl:dr

    使用@Andrie's Answer 中的示例图

    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)))
    

    (在 150 x 200 像素的 PNG 光栅设备上渲染)。

    为情节家具的特定项目设置单独的cex参数

    需要注意的一点是,格子图的外观由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 包在同一设备上排列两个格子图,我们可以看到所有这些的效果:

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

    导致

    所以现在(几乎)所有东西都被缩放了。需要注意的一件有趣的事情是,这种方法没有缩放图例中的线条长度,也没有缩放刻度长度。请注意地块的大小,每个子地块的面积是相同的。然而,我们可以以更小的尺寸绘制整个事物:

    这是合理的,并且在基于矢量的设备(例如pdf())上呈现的效果比我不得不在这里说明的光栅png() 更好。第二个绘图位于 150 x 200 像素的设备上。

    设置基础fontsize 以控制整体缩放

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

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

    这些会影响情节中的所有内容,因此我们可以缩小它们以达到设置所有其他设置的类似效果。

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

    产生

    这是在与之前的图 2 相同大小的 png() 设备上绘制的。注意边距是如何调整的,以便更好地缩放绘图。因此,我们不仅影响了之前更改的所有设置,还影响了绘图的其他位(例如间距和刻度线),这些位也从fontsize 设置中获取队列。同样,将这些绘制在矢量设备上会产生更好的输出。

    【讨论】:

    • 感谢您提供非常全面的答案!我也从中学到了一些其他的东西。
    • 太棒了!我正在考虑自己解决这些问题并记录下来,但很高兴你已经做到了。
    【解决方案2】:

    您需要将cex=... 传递给图例/键,而不是整个情节:

    这是默认设置:

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

    比较在key中使用cex=0.25时的结果:

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

    【讨论】:

    • 谢谢,这很好。但是,我想重新缩放图中的 所有内容,包括字体大小、边距和刻度大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2019-02-01
    • 1970-01-01
    • 2017-01-15
    • 2016-06-02
    相关资源
    最近更新 更多