如何获取包含越界对象的绘图尺寸

2024-04-13

我可以这样计算图的高度:

library(ggplot2)
library(egg)
library(gridExtra)

g <- ggplot(iris, aes(x = Species, y = Petal.Length)) +
  stat_summary(geom = 'bar', fun.y = mean) +
  geom_point() +
  scale_y_continuous(limits = c(0,8), expand = c(0,0), oob = function(x, ...) x)

gt <- egg::set_panel_size(g)
gt$layout$clip[gt$layout$name=="panel"] <- "off"
gridExtra::grid.arrange(gt)

sum(as.numeric(grid::convertUnit(gt$heights, "mm")))

但是如果我有一些超出范围的几何对象,它会返回相同的高度:

g <- ggplot(iris, aes(x = Species, y = Petal.Length)) +
  stat_summary(geom = 'bar', fun.y = mean) +
  geom_point() +
  scale_y_continuous(limits = c(0,8), expand = c(0,0), oob = function(x, ...) x) +
  geom_text(label = 'obText', aes(x = 2, y = 8.5))

gt <- egg::set_panel_size(g)
gt$layout$clip[gt$layout$name=="panel"] <- "off"
gridExtra::grid.arrange(gt)

sum(as.numeric(grid::convertUnit(gt$heights, "mm")))

即使现在有文本的位置高于 53.35411mm。

有没有办法获得包含此越界文本的绘图高度?


我不确定你的用例是什么,但是是的,这是可能的。

问题的关键在于文本(或任何其他几何图层)的高度是not捕获于gt$heights,但在各个GROB的高度参数中(表示为.$x or $height) 在嵌套层次结构中进一步向下。

# same code as yours, except that I positioned the label ever further up, to increase the contrast
g <- ggplot(iris, aes(x = Species, y = Petal.Length)) +
  stat_summary(geom = 'bar', fun.y = mean) +
  geom_point() +
  scale_y_continuous(limits = c(0,8), expand = c(0,0), oob = function(x, ...) x) +
  geom_text(label = 'obText', aes(x = 2, y = 18.5))    

gt <- egg::set_panel_size(g)

看一眼gt$heights。我们可以验证所有高度值都保持不变,无论面板的裁剪是否已关闭:

> gt$heights
 [1] 5.5pt                    0cm                      0cm                     
 [4] 0cm                      0cm                      0cm                     
 [7] 4cm                      sum(2.75pt, 1grobheight) 1grobheight             
[10] 0cm                      0pt                      5.5pt    

gt$layout$clip[gt$layout$name=="panel"] <- "off"

> gt$heights
 [1] 5.5pt                    0cm                      0cm                     
 [4] 0cm                      0cm                      0cm                     
 [7] 4cm                      sum(2.75pt, 1grobheight) 1grobheight             
[10] 0cm                      0pt                      5.5pt   

在上述所有值中,您应该关心的是[7] 4cm,因为这是面板的高度。我们知道,因为基于gt的布局中,面板位于第 7 行和第 5 列,这可以通过检查控制台打印输出来验证gt本身,或通过gtable_show_layout()来自 gtable 包:

> gt
TableGrob (12 x 9) "layout": 18 grobs
    z         cells       name                                           grob
1   0 ( 1-12, 1- 9) background               rect[plot.background..rect.3020]
2   5 ( 6- 6, 4- 4)     spacer                                 zeroGrob[NULL]
3   7 ( 7- 7, 4- 4)     axis-l           absoluteGrob[GRID.absoluteGrob.3008]
4   3 ( 8- 8, 4- 4)     spacer                                 zeroGrob[NULL]
5   6 ( 6- 6, 5- 5)     axis-t                                 zeroGrob[NULL]
6   1 ( 7- 7, 5- 5)      panel                      gTree[panel-1.gTree.2994]
7   9 ( 8- 8, 5- 5)     axis-b           absoluteGrob[GRID.absoluteGrob.3001]
8   4 ( 6- 6, 6- 6)     spacer                                 zeroGrob[NULL]
9   8 ( 7- 7, 6- 6)     axis-r                                 zeroGrob[NULL]
10  2 ( 8- 8, 6- 6)     spacer                                 zeroGrob[NULL]
11 10 ( 5- 5, 5- 5)     xlab-t                                 zeroGrob[NULL]
12 11 ( 9- 9, 5- 5)     xlab-b titleGrob[axis.title.x.bottom..titleGrob.3011]
13 12 ( 7- 7, 3- 3)     ylab-l   titleGrob[axis.title.y.left..titleGrob.3014]
14 13 ( 7- 7, 7- 7)     ylab-r                                 zeroGrob[NULL]
15 14 ( 4- 4, 5- 5)   subtitle         zeroGrob[plot.subtitle..zeroGrob.3016]
16 15 ( 3- 3, 5- 5)      title            zeroGrob[plot.title..zeroGrob.3015]
17 16 (10-10, 5- 5)    caption          zeroGrob[plot.caption..zeroGrob.3018]
18 17 ( 2- 2, 2- 2)        tag              zeroGrob[plot.tag..zeroGrob.3017]

> gtable::gtable_show_layout(gt)

为了获得各个几何图层的高度,我们可以更深入地查看面板 glob 的子 glob:

> gt$grobs[[which(gt$layout$name == "panel")]]$children
(gTree[grill.gTree.2992], zeroGrob[NULL], rect[geom_rect.rect.2978], 
points[geom_point.points.2980], text[GRID.text.2981], zeroGrob[NULL], 
zeroGrob[panel.border..zeroGrob.2982]) 

在这种情况下,我们知道(因为示例是这样创建的)有问题的几何对象是文本层,因此我们可以直接转到第 5 个子对象并查看那里的高度:

> gt$grobs[[which(gt$layout$name == "panel")]]$children[[5]]$y
[1] 2.3125native 2.3125native 2.3125native 2.3125native 2.3125native 2.3125native
[7] 2.3125native 2.3125native 2.3125native 2.3125native 2.3125native 2.3125native
...

参考?unit从 grid 包的帮助文件中,“本机”坐标系意味着测量相对于视口的 xscale 和 yscale。因此2.3125native可解释为 2.3125 x 面板高度 (4 厘米) = 9.25 厘米。

更一般地说,要获得两个方向的高度限制:

# rect grobs such as those created by geom_bar() have "height" / "width" measurements,
# while point & text grobs have "y" / "x" measurements, & we look for both
max.grob.heights <- sapply(gt$grob[[which(gt$layout$name == "panel")]]$children,
                       function(x) ifelse(!is.null(x$height) & "unit" %in% class(x$height),
                                          max(as.numeric(x$height)),
                                          ifelse(!is.null(x$y) & "unit" %in% class(x$y),
                                                 max(as.numeric(x$y)),
                                                 0)))
max.grob.heights = max(max.grob.heights)

min.grob.heights <- sapply(gt$grob[[which(gt$layout$name == "panel")]]$children,
                           function(x) ifelse(!is.null(x$height) & "unit" %in% class(x$height),
                                              min(as.numeric(x$height)),
                                              ifelse(!is.null(x$y) & "unit" %in% class(x$y),
                                                     min(as.numeric(x$y)),
                                                     0)))
min.grob.heights = min(min.grob.heights)

# identify panel row & calculate panel height
panel.row <- gt$layout[gt$layout$name == "panel", "t"] # = 7
panel.height <- as.numeric(grid::convertUnit(gt$heights[panel.row],"mm"))

如果您只想要面板组件的高度,包括所有几何图层(并且不关心它们与整个 grob 对象的组合高度的关系),您可以使用最大/最小 grob 高度作为面板高度的乘数:

panel.multiplier <- max(1, max.grob.heights) + abs(min.grob.heights)
result <- panel.multiplier * panel.height

如果要计算绘图的整体高度,则必须分别比较顶部/底部越界对象的高度:如果它们在绘图的范围内,则使用原始高度;如果它们在绘图的范围内,则使用原始高度;如果它们在绘图的范围内,则使用原始高度。如果超过该值,则使用他们的身高。

# calculate height of all the grobs above the panel
height.above.panel <- gt$heights[1:(panel.row - 1)]
height.above.panel <- sum(as.numeric(grid::convertUnit(height.above.panel, "mm")))

# check whether the out-of-bound object (if any) exceeds this height, & replace if necessary
if(max.grob.heights > 1){
  oob.height.above.panel <- (max.grob.heights - 1) * panel.height
  height.above.panel <- max(height.above.panel, oob.height.above.panel)
}

# as above, calculate the height of all the grobs below the panel
height.below.panel <- gt$heights[(panel.row + 1):length(gt$heights)]
height.below.panel <- sum(as.numeric(grid::convertUnit(height.below.panel, "mm")))

# as above
if(min.grob.heights < 0){
  oob.height.below.panel <- abs(min.grob.heights) * panel.height
  height.below.panel <- max(height.below.panel, oob.height.below.panel)
}

# sum the result
result <- height.above.panel + panel.height + height.below.panel
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取包含越界对象的绘图尺寸 的相关文章

随机推荐

  • 如何使用文件实现循环缓冲区?

    我的应用程序 C 程序 打开同一文件的两个文件句柄 一个处于写入模式 一个处于读取模式 应用程序中的两个单独的线程读取和写入文件 这很好用 由于我的应用程序在 RAM 磁盘大小有限的嵌入式设备上运行 我想写FileHandle在达到最大大小
  • 如何按用途自动对类中的函数进行排序?

    a Robert C Martin 的 Clean Code 一书建议根据 降级规则 对函数进行排序 我们希望代码读起来像自上而下的叙述 我们想要每一个 函数之后是下一个抽象级别的函数 因此 我们可以读取该程序 下降一个抽象级别 我们阅读函
  • 交换 img src 或显示/隐藏多个图像是否更快?

    在网页上交换图像时使用的最佳做法是什么 更改图像源或只是在页面上显示 隐藏多个图像 为了平衡速度 你必须做出选择 有两个选择 更改图像源 这样 页面加载速度会更快 因为它只获取可见图像 但当您更改 src 属性时 显示新图像将花费更长的时间
  • 如何创建具有逐字环境的新 Beamer 环境?

    我正在创建一个 Beamer 演示文稿 其中包含大量 LaTeX 示例 并且必须在逐字环境中进行 我厌倦了打字 begin example begin verbatim Verbatim Text end verbatim end exam
  • 对于大输入,十进制扩展程序运行速度非常慢

    我正在编写一个程序来计算数字的小数扩展103993 33102我想根据用户输入的数字打印出所有尾随小数 它可以快速运行所有数量最多10 5但如果输入10 6编程大约需要 5 分钟才能打印出答案 我怎样才能加快速度 我尝试了两种不同的方法 一
  • Java从ZipInputStream条目创建InputStream

    我想编写一个从单个 InputStream 读取 ZIP 内的多个 XML 文件的方法 该方法将打开一个 ZipInputStream 并在每个 xml 文件上获取相应的 InputStream 并将其提供给我的 XML 解析器 这是该方法
  • 基于 Django 年/月的帖子存档

    我是 Django 新手并启动了一个应用程序 我做了模型 视图 模板 但我想在底部添加某种存档 页面的内容 类似这样http www flickr com photos ionutgabriel 3990015411 http www fl
  • JPA实体扩展类包含@Id

    我有实体类都包含 id 作为主键 我可以创建包含所有公共字段的抽象类并允许所有类扩展该类 如下所示 public abstract class CommonFields Id Column name ID private long id p
  • 不可能:没有附加布局管理器;跳过布局

    我完全迷失了这个错误 我理解它 但我不知道出了什么问题 对于代码 In the OnCreate of my activity historyRecyclerView RecyclerView findViewById R id recyc
  • 在 kotlin 中何时一起使用挂起函数和 Flow 或分开使用?

    在审查用 kotlin 编写的一些代码时 有件事引起了我的注意 我在一些项目中查看领域层 在一些项目中 我看到挂起功能和 Flow 一起使用 而在一些项目中 我看到只使用 Flow 例如暂停和流动在一起 class FetchMovieDe
  • 如何在Python中隐藏控制台窗口?

    我正在用 Python 编写一个 IRC 机器人 我希望为 Linux 和 Windows 制作独立的二进制文件 主要是我希望当机器人启动时 控制台窗口应该隐藏 并且用户不应该看到该窗口 我能为此做些什么呢 只需将其保存为 pyw扩大 这将
  • 将一个变量设置为等于另一个变量[重复]

    这个问题在这里已经有答案了 我有一些关于在 JavaScript 中将变量设置为等于另一个变量的问题 假设我们创建一个对象 a并设置b a var a fname Jon lname Smith age 50 var b a 我明白如果我们
  • 音色 `set-config!` 已经改变了数量,因此不知道如何使用它来将 std err/out 输出到文件

    我正在尝试使用https github com ptaoussanis timbre https github com ptaoussanis timbre记录到文件而不是控制台 以下是我找到的一些有关如何执行此操作的文档 The defa
  • 为 libstdc++ 生成 CTAGS(来自当前 GCC)

    I know 你完成了我 https github com Valloric YouCompleteMe基于 LLVM 但我想使用OmniCppComplete http www vim org scripts script php scr
  • 操作码的十六进制值

    我创建了一个非常简单的汇编程序 可以在 DOS 中打印字母 a 我在十六进制编辑器中打开它 结果是这样的 汇编代码 mov ah 2 mov dx a int 21h 十六进制代码 B4 02 B2 61 CD 21 我想了解它是如何生成的
  • 在 pdf 中按宽度调整内容

    渲染为 pdf 时 我需要 html 页面为打印宽度的 100 否则内容会被切断 是否有捷径可寻 我想出了一个解决方法 它在渲染后获取 html 宽度 然后设置缩放系数以强制正确的宽度 var page require webpage cr
  • 如何确定视图的列是派生的还是常量?

    假设我有下表 create table t Item ItemID int not null identity 1 1 constraint PK Item primary key Description varchar 256 not n
  • Apache AVRO 与休息

    我正在评估将 Apache AVRO 用于我的 Jersey REST 服务 我将 Springboot 与 Jersey REST 结合使用 目前我接受 JSON 作为输入 并使用 Jackson 对象映射器将其转换为 Java Pojo
  • Laravel 4:在包中部署自定义 artisan 命令

    我开发了一些自定义 artisan 命令 以便更轻松地与我的包一起使用 是否可以将 artisan 命令包含到包中以便于部署 如果可以 怎样做 Thanks 在你的包结构中有一个命令集
  • 如何获取包含越界对象的绘图尺寸

    我可以这样计算图的高度 library ggplot2 library egg library gridExtra g lt ggplot iris aes x Species y Petal Length stat summary geo