如何将表格与森林图对齐(ggplot2)

2024-05-05

我是 R 新手,创建了一个森林/区间图,并在图旁边包含了一个表格,其中包含我的置信区间和风险比。我的问题是 RR 和 CI 与绘图上的水平网格线不完全对齐。我尝试使用此处所示的拼凑解决方案,但这似乎对我不起作用:grid.arrange:更改位置表值以与 R 中的森林图对齐 https://stackoverflow.com/questions/72993923/grid-arrange-change-location-table-values-to-align-with-forest-plot-in-r

任何帮助表示赞赏。

#read in packages
library(dplyr)
library(ggplot2)

tester <- data.frame(
  treatmentgroup = c("TreatmentA","TreatmentB","TreatmentC","TreatmentD","TreatmentE","TreatmentF",                   "TreatmentA","TreatmentB","TreatmentC","TreatmentD","TreatmentE","TreatmentF"),

 rr = c(1.12, 1.9, 1.05, 0.76, 1.5, 1.11, 1.67, 0.78, 2.89, 3.2, 1.33, 1.29),
  low_ci = c(0.71, 0.76, 0.78, 0.48, 0.91, 0.73, 1, 0.34, 0.75, 1, 1.18, 0.18),
  up_ci = c(1.6, 1.7, 2.11, 1.4, 1.5, 1.7, 2.6, 3.1, 9.3, 9.4, 1.9, 2),
  RR_ci = c("1.12 (0.71, 1.6)","1.9 (0.76, 1.7)","1.05 (0.78, 2.1)","0.76 (0.48, 1.4)","1.5 (0.91, 1.5)","1.11 (0.73, 1.7)",
            "1.67 (1, 2.6)","0.78 (0.34, 3.1)","2.89 (0.75, 9.3)","3.2 (1, 9.4)","1.33 (1.18, 1.9)","1.29 (0.18, 2)"),
  ci = c("0.71, 1.6",
         "0.76, 1.7",
         "0.78, 2.1",
         "0.48, 1.4",
         "0.91, 1.5",
         "0.73, 1.7",
         "1, 2.6",
         "0.34, 3.1",
         "0.75, 9.3",
         "1, 9.4",
         "1.18, 1.9",
         "0.18, 2"),
  X = c("COPD", "COPD","COPD","COPD","COPD","COPD", "Cancer", "Cancer","Cancer","Cancer","Cancer","Cancer"),
  no=c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
)

  
  # Reduce the opacity of the grid lines: Default is 255
  col_grid <- rgb(235, 235, 235, 100, maxColorValue = 255)
  
  forest = ggplot(data=tester,
             aes(x = treatmentgroup,y = rr, ymin = low_ci, ymax = up_ci ))+
    geom_pointrange(aes(col=treatmentgroup))+
    geom_hline(yintercept =1, colour='red')+
    xlab('Treatment')+ ylab("RR (95% Confidence Interval)")+
    geom_errorbar(aes(ymin=low_ci, ymax=up_ci,col=treatmentgroup),width=0,cex=1)+ 
    facet_wrap(~X,strip.position="top",nrow=9,scales = "free_y") +
    list(theme_classic()+ 
           theme(panel.background = element_blank(),strip.background = element_rect(colour=NA, fill=NA),
                 strip.placement = "outside",
                 strip.text.y = element_text( face="bold", size=12),
                 panel.grid.major.y = element_line(colour=col_grid, size=0.5),
                 strip.text = element_text (face="bold"),
                 panel.border = element_rect(fill = NA, color = "black"), 
                 legend.position = "none",
                 #legend.title = element_blank(),legend.position="bottom", strip.text = element_text(face="bold", size=9), 
                 axis.text=element_text(face="bold"),axis.title = element_text(face="bold"),
                 plot.title = element_text(face = "bold", hjust = 0.5,size=13)))+
    coord_flip()
  forest
  
  
  
  
  ## Create the table-base pallete
  table_base <- ggplot(tester, aes(y=rr)) +
    ylab(NULL) + xlab("  ") + 
    theme(plot.title = element_text(hjust = 0.5, size=12), 
          axis.text.x = element_text(color="white", hjust = 0.5, size = 25), ## This is used to help with alignment
          axis.line = element_blank(),
          axis.text.y = element_blank(), 
          axis.ticks = element_blank(),
          axis.title.y = element_blank(), 
          legend.position = "none",
          panel.background = element_blank(), 
          panel.border = element_blank(), 
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(), 
          plot.background = element_blank())
  
  ## RR point estimate table
  tab1 <- table_base + 
    labs(title = "space") +
    geom_text(aes(y = no, x = 1, label = sprintf("%0.1f", round(rr, digits = 1))), size = 3) + ## decimal places
    ggtitle("rr")
  
  ## 95% ci table
  tab2 <- table_base +
    geom_text(aes(y = no, x = 1, label = ci), size = 3) + 
    ggtitle("95% CI")
  
  ## Merge tables with plot
  lay <-  matrix(c(1,1,1,1,1,1,1,1,1,1,2,3,3), nrow = 1)
  grid.arrange(forest, tab1, tab2, layout_matrix = lay)
  
  library(patchwork)
  forest + tab1 + tab2 + plot_layout(widths = c(10, 1, 3))

恕我直言,主要问题是您将表格列制作为两个单独的图。相反,一种选择是将表格图作为一个图,重要的是通过X也在表格中。否则,表格图缺少条带文本,并且没有恕我直言,几乎不可能将表格行与点范围对齐。剩下的就是样式,重要的是不要简单地摆脱主题元素,例如对于对齐来说,有条形框很重要,所以我们不能使用element_blank但必须使用空字符串作为条带文本。

tester <- data.frame(
  treatmentgroup = c("TreatmentA", "TreatmentB", "TreatmentC", "TreatmentD", "TreatmentE", "TreatmentF", "TreatmentA", "TreatmentB", "TreatmentC", "TreatmentD", "TreatmentE", "TreatmentF"),
  rr = c(1.12, 1.9, 1.05, 0.76, 1.5, 1.11, 1.67, 0.78, 2.89, 3.2, 1.33, 1.29),
  low_ci = c(0.71, 0.76, 0.78, 0.48, 0.91, 0.73, 1, 0.34, 0.75, 1, 1.18, 0.18),
  up_ci = c(1.6, 1.7, 2.11, 1.4, 1.5, 1.7, 2.6, 3.1, 9.3, 9.4, 1.9, 2),
  RR_ci = c(
    "1.12 (0.71, 1.6)", "1.9 (0.76, 1.7)", "1.05 (0.78, 2.1)", "0.76 (0.48, 1.4)", "1.5 (0.91, 1.5)", "1.11 (0.73, 1.7)",
    "1.67 (1, 2.6)", "0.78 (0.34, 3.1)", "2.89 (0.75, 9.3)", "3.2 (1, 9.4)", "1.33 (1.18, 1.9)", "1.29 (0.18, 2)"
  ),
  ci = c(
    "0.71, 1.6",
    "0.76, 1.7",
    "0.78, 2.1",
    "0.48, 1.4",
    "0.91, 1.5",
    "0.73, 1.7",
    "1, 2.6",
    "0.34, 3.1",
    "0.75, 9.3",
    "1, 9.4",
    "1.18, 1.9",
    "0.18, 2"
  ),
  X = c("COPD", "COPD", "COPD", "COPD", "COPD", "COPD", "Cancer", "Cancer", "Cancer", "Cancer", "Cancer", "Cancer"),
  no = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
)


# Reduce the opacity of the grid lines: Default is 255
col_grid <- rgb(235, 235, 235, 100, maxColorValue = 255)

library(dplyr, warn = FALSE)
library(ggplot2)
library(patchwork)

forest <- ggplot(
  data = tester,
  aes(x = treatmentgroup, y = rr, ymin = low_ci, ymax = up_ci)
) +
  geom_pointrange(aes(col = treatmentgroup)) +
  geom_hline(yintercept = 1, colour = "red") +
  xlab("Treatment") +
  ylab("RR (95% Confidence Interval)") +
  geom_errorbar(aes(ymin = low_ci, ymax = up_ci, col = treatmentgroup), width = 0, cex = 1) +
  facet_wrap(~X, strip.position = "top", nrow = 9, scales = "free_y") +
  theme_classic() +
  theme(
    panel.background = element_blank(), strip.background = element_rect(colour = NA, fill = NA),
    strip.text.y = element_text(face = "bold", size = 12),
    panel.grid.major.y = element_line(colour = col_grid, size = 0.5),
    strip.text = element_text(face = "bold"),
    panel.border = element_rect(fill = NA, color = "black"),
    legend.position = "none",
    axis.text = element_text(face = "bold"),
    axis.title = element_text(face = "bold"),
    plot.title = element_text(face = "bold", hjust = 0.5, size = 13)
  ) +
  coord_flip()

dat_table <- tester %>%
  select(treatmentgroup, X, RR_ci, rr) %>%
  mutate(rr = sprintf("%0.1f", round(rr, digits = 1))) %>%
  tidyr::pivot_longer(c(rr, RR_ci), names_to = "stat") %>%
  mutate(stat = factor(stat, levels = c("rr", "RR_ci")))

table_base <- ggplot(dat_table, aes(stat, treatmentgroup, label = value)) +
  geom_text(size = 3) +
  scale_x_discrete(position = "top", labels = c("rr", "95% CI")) +
  facet_wrap(~X, strip.position = "top", ncol = 1, scales = "free_y", labeller = labeller(X = c(Cancer = "", COPD = ""))) +
  labs(y = NULL, x = NULL) +
  theme_classic() +
  theme(
    strip.background = element_blank(),
    panel.grid.major = element_blank(),
    panel.border = element_blank(),
    axis.line = element_blank(),
    axis.text.y = element_blank(),
    axis.text.x = element_text(size = 12),
    axis.ticks = element_blank(),
    axis.title = element_text(face = "bold"),
  )

forest + table_base + plot_layout(widths = c(10, 4))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将表格与森林图对齐(ggplot2) 的相关文章

  • 使用 RDCOMClient 搜索 Outlook 收件箱

    我尝试使用 RDCOMClient 在 Outlook 收件箱中搜索电子邮件中的特定主题 然后获取附件 我在一封电子邮件上进行了这项工作 但由于主题包含日期元素 我需要搜索成为一个类似的子句 但不太清楚这适合我的下面的查询 outlook
  • R 编程常用工具

    如果已经以不同的方式问过这个问题 我深表歉意 但我找不到任何达到我想要的东西 我真的是从其他软件包 SPSS 开始接触 R 的 当我了解真正可以做什么时 我意识到我还需要其他 工具 这让我想到了我的问题 您有哪些用于开发 R 代码的设置 我
  • 手动设置scale_fill_distiller()的比例

    我正在尝试制作一系列图表进行比较 举例来说 我想使用iris数据集来制作这样的图 其中我已过滤以仅查看 setosa 物种 library ggplot2 library dplyr iris gt filter Species setos
  • 合并数据框而不重复行

    我想合并两个数据框 但如果有多个匹配项 则不想重复行 相反 我想总结一下那天的观察结果 来自 合并 提取两个数据框中与指定列匹配的行并将其连接在一起 如果有多个匹配项 则所有可能的匹配项各贡献一行 这是一些示例代码 days lt as d
  • 使用大矩阵操作

    我必须使用 big matrix 对象 并且无法计算某些函数 让我们考虑以下大矩阵 create big matrix object x lt as big matrix matrix sample 1 10 20 replace TRUE
  • ubuntu中R的igraph包的安装

    我使用以下命令在 ubuntu 中安装 R 的 igraph 包 install packages igraph 但我收到一条错误消息 警告 无法访问存储库的索引 http ftp iitm ac in cran src contrib h
  • 如何在knitr和RStudio中为word和html设置不同的全局选项?

    我正在使用 RStudio 0 98 932 和 knitr 1 6 想要为word和html设置不同的全局knitr选项 例如 想要将word的fig width和fig height设置为6 html的fig width和fig hei
  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 从 n,k 维矩阵数组中减去 n,k 维矩阵

    如果我有一个数组A A lt array 0 c 4 3 5 for i in 1 5 set seed i A i lt matrix rnorm 12 4 3 如果我有矩阵 B set seed 6 B lt matrix rnorm
  • 如何在 Caret 中绘制随机森林(护林员)树

    我生成了如下所示的随机森林树 并尝试绘制它 但出现错误 我在哪里犯了错误 我怎样才能以正确的方式绘制它 Actmodel lt train Activity Section Author data CB1 method ranger trC
  • 如何对数字进行四舍五入并使其显示零?

    R 中将数字四舍五入到小数点后 2 位的常用代码是 gt a 14 1234 gt round a digits 2 gt a gt 14 12 但是 如果该数字的前两位小数位为零 则 R 会在显示中抑制零 gt a 14 0034 gt
  • 将 ftransform 与折叠 R 包中的 fgroup_by 一起使用

    我正在尝试重现以下输出dplyr代码与R包裹collapse dplyr Code library tidyverse starwars gt select name mass species gt group by species gt
  • 使用 R 下载压缩数据文件、提取和导入数据

    EZGraphs 在 Twitter 上写道 很多在线 csv 都被压缩了 有没有办法下载 解压缩存档并使用 R 将数据加载到 data frame Rstats 我今天也尝试这样做 但最终只是手动下载 zip 文件 我尝试过类似的东西 f
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • 访问或解析 R 中的 summary() 中的元素

    我运行以下 R 命令来进行 Dunnett 测试并获取摘要 如何访问下面线性假设的每一行 这是摘要输出的一部分 基本上我不知道摘要的结构 我尝试使用名称 但它似乎不起作用 因为我没有看到任何命名属性来提供这一点 library multco
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • 如何在 data.table 中分组后使用条件计算行数

    我有以下数据框 dat lt read csv s1 s2 v1 v2 a b 10 20 a b 22 NA a b 13 33 c d 3 NA c d 4 5 NA c d 10 20 dat gt A tibble 6 x 4 gt
  • 绘制 Cox 回归的 Kaplan-Meier 图

    我使用 R 中的以下代码设置了一个 Cox 比例风险模型来预测死亡率 添加协变量 A B 和 C 只是为了避免混淆 即年龄 性别 种族 但我们真正对预测变量 X 感兴趣 X 是一个连续变量 cox model lt coxph Surv t

随机推荐

  • Glide:如何使用 Glide v4 调整 gif 大小并将其另存为文件?

    我想调整 gif 文件的大小并保存它 我尝试使用一些建议的方法 但这些方法给出了错误 后来我知道有些方法在 Glide 中已被弃用v4 byte bytes Glide with context asGif load url toBytes
  • 如何在angularjs中读取pdf流

    I got the following PDF stream from a server 如何在 AngularJS 中读取这个流 我尝试使用以下代码在新窗口中将其作为 PDF 文件打开 success function data wind
  • sql 查询查找匹配属性

    我目前正在做一个类似易货系统的系统 情况是这样的 客户 Jasmine 要求输入 NAME 属性 她需要寻找的内容 并输入 SEEK 属性 她需要寻找的内容 为了获得结果 SEEK 属性必须与其他客户的 Name 属性匹配 其他客户的 SE
  • 推断类型和动态类型

    在编程语言中 推断类型和动态类型有什么区别 我了解动态类型 但不明白动态类型与推断类型有何不同以及有何不同 有人可以用一些例子来解释一下吗 推断类型 在编译时设置一次 实际上 推断的部分只是节省时间 因为如果编译器可以计算出类型名 则您不必
  • Android 自定义对话框中的图标

    有没有一种方法可以在不使用 AlertDialog 方法的情况下在自定义对话框上设置图标 对话框有标题 但缺少漂亮的分隔线和设置图标的功能 但肯定有一种方法可以在不使用 AlertDialog 的情况下获得两者 您可以使用以下代码添加图标
  • OnSharedPreferenceChangeListener 未调用 #2

    好吧 我开始从 Google 的 android 实现这个可怕的代码 未调用 OnSharedPreferenceChangeListener 这是我的代码 你能建议一下吗 类定义 private SharedPreferences sPr
  • Soundcloud自定义播放器动态添加和播放歌曲

    我在用soundcloud自定义播放器 https github com soundcloud soundcloud custom player创建一个可以播放所有歌曲的播放器 我的网站 当我只放置任何曲目或帖子的静态网址时 这效果非常好
  • NotificationCompat.Builder 不接受第二个参数

    由于某种原因我的NotificationCompat Builder不会接受第二个参数 我不知道如何解决它 我看到了一些其他答案 但主要问题出在 gradle 版本中 但我的答案是最新的 如下所示 if Build VERSION SDK
  • 如何在中线和文字之间留出空间?

    所以我想做的是在中间行和中间文本之间留出空间 这是我的小提琴 https jsfiddle net abqy4w1f https jsfiddle net abqy4w1f 所以我希望左侧和右侧距圆 10px 有什么建议吗 outter h
  • ASP.NET 中的 Request.Headers["Header-Name"] 区分大小写吗?

    Is Request Headers Header Name 在 ASP NET 中区分大小写吗 如果是 如果我不确定客户端会在什么情况下发送它 我应该如何获取某个标头 例如 X requested with 不 它们不区分大小写RFC26
  • 是否可以实现异步跨域文件上传?

    有可能的 参见下文 首先我用这张图来解释一下异步文件上传可以实现 对不起 我已经关闭了我的一个域 该图像现在消失了 不过 这确实是一个很好的图像 这是在我发现 Stack Overflow 可以通过 Imgur 上传图像之前 正如您所看到的
  • TS2322 类型“string”不可分配给类型““left”| “中心”| “对”|不明确的'

    我是打字稿新手 我使用 ant design 4 0 版 我想向我的列添加对齐属性 但在表的 columns 属性中它显示此错误 我知道我应该将变量的类型与 AlignType 相匹配 但我不知道具体该怎么做 提前谢谢你们了 interfa
  • vscode 在哪里使用 lldb 可执行文件?

    我在 vscode 中调试 rust 时遇到困难 它无法评估任何涉及函数的表达式 我注意到我没有安装 lldb Ubuntu 20 04 但调试器仍在运行 在哪里可以找到 lldb 可执行文件 我可以改变路径吗 None
  • 使用 CSS3 计算值

    CSS3有没有办法实现这一点 height 100 110px 我的背景 你不能用纯 CSS 来计算它 正如 Litek 提到的 它不适用于所有浏览器 但是有一种组织方法可以处理这个问题 但是您需要将元素包装在另一个浏览器中 body he
  • iOS5 上的 UIImagePickerController 内存泄漏

    我在 iOS5 和 XCode4 2 上开发的应用程序中使用 UIImagePickerController 出现内存泄漏 我不知道为什么会出现这种泄漏 您能给我答案吗 和我的代码 void createImagePicker picker
  • Node.js 主机名/IP 与证书的替代名称不匹配

    我正在编写一些节点代码来进行 Facebook 的服务器端登录 我已经非常接近让它完全发挥作用了 但是我在请求 auth code 时遇到了麻烦 我认为这可能与 Facebook 应用程序设置有关Site URL但我尝试过的都没有成功 我使
  • .NET Web 服务 (asmx) 超时问题

    我正在连接到供应商提供的 Web ASMX 服务并通过线路发送一组数据 当您向项目添加服务引用时 我的第一次尝试遇到了 Visual Studio 默认在 app config 文件中引发的 1 分钟超时 我把它增加到 10 分钟 又是一次
  • Java程序在没有定义main方法的情况下如何运行?

    我正在浏览一些 Java 源代码并注意到main方法未定义 Java如何编译源码却无从下手 The main方法仅在 Java 虚拟机执行代码时使用 没有 a 则无法执行代码main方法 但仍然可以编译 编译代码时 通常在命令行上指定一组文
  • TypeORM 在存储库类型上抛出“类型实例化过深且可能无限。ts(2589)”错误

    更新后至VSCode 2019 年 8 月 版本 1 38 和 Typescript 3 6 https code visualstudio com updates v1 38 typescript 36我得到了很多Type instant
  • 如何将表格与森林图对齐(ggplot2)

    我是 R 新手 创建了一个森林 区间图 并在图旁边包含了一个表格 其中包含我的置信区间和风险比 我的问题是 RR 和 CI 与绘图上的水平网格线不完全对齐 我尝试使用此处所示的拼凑解决方案 但这似乎对我不起作用 grid arrange 更