在 R 中结合 grid_arrange_shared_legend() 和facet_wrap_labeller()

2023-11-29

我正在尝试结合grid_arrange_shared_legend() and facet_wrap_labeller()更具体地说,我想绘制一个包含两个 ggplot 图形的图形,每个图形都有多个面板,并且有一个共同的图例。我还想将部分刻面条标签设置为斜体。前者可以用grid_arrange_shared_legend()功能介绍here,后者可以通过以下方式实现facet_wrap_labeller()功能here。然而,我并没有成功地将两者结合起来。

这是一个例子。

library("ggplot2")
set.seed(1)
d <- data.frame(
  f1 = rep(LETTERS[1:3], each = 100),
  f2 = rep(letters[1:3], 100),
  v1 = runif(3 * 100),
  v2 = rnorm(3 * 100)
)
p1 <- ggplot(d, aes(v1, v2, color = f2)) + geom_point() + facet_wrap(~f1)
p2 <- ggplot(d, aes(v1, v2, color = f2)) + geom_smooth() + facet_wrap(~f1)

我可以将 p1 和 p2 放在同一个图中,并使用共同的图例grid_arrange_shared_legend()(对原文稍作修改)。

grid_arrange_shared_legend <- function(...) {
    plots <- list(...)
    g <- ggplotGrob(plots[[1]] + theme(legend.position = "right"))$grobs
    legend <- g[[which(sapply(g, function(x) x$name) == "guide-box")]]
    lheight <- sum(legend$width)
    grid.arrange(
        do.call(arrangeGrob, lapply(plots, function(x)
            x + theme(legend.position = "none"))),
        legend,
        ncol = 2,
        widths = unit.c(unit(1, "npc") - lheight, lheight))
}
grid_arrange_shared_legend(p1, p2)

Here's what I get. enter image description here

可以将条带标签的一部分设置为斜体facet_wrap_labeller().

facet_wrap_labeller <- function(gg.plot,labels=NULL) {
  require(gridExtra)

  g <- ggplotGrob(gg.plot)
  gg <- g$grobs      
  strips <- grep("strip_t", names(gg))

  for(ii in seq_along(labels))  {
    modgrob <- getGrob(gg[[strips[ii]]], "strip.text", 
                       grep=TRUE, global=TRUE)
    gg[[strips[ii]]]$children[[modgrob$name]] <- editGrob(modgrob,label=labels[ii])
  }
  g$grobs <- gg
  class(g) = c("arrange", "ggplot",class(g)) 
  g
}
facet_wrap_labeller(p1, 
  labels = c(
    expression(paste("A ", italic(italic))),
    expression(paste("B ", italic(italic))), 
    expression(paste("C ", italic(italic)))
  )
)

enter image description here

但是,我无法直接将两者结合起来。

p3 <- facet_wrap_labeller(p1, 
  labels = c(
    expression(paste("A ", italic(italic))),
    expression(paste("B ", italic(italic))), 
    expression(paste("C ", italic(italic)))
  )
)
p4 <- facet_wrap_labeller(p2, 
  labels = c(
    expression(paste("A ", italic(italic))),
    expression(paste("B ", italic(italic))), 
    expression(paste("C ", italic(italic)))
  )
)
grid_arrange_shared_legend(p3, p4)
# Error in plot_clone(p) : attempt to apply non-function

有谁知道如何修改其中一个或两个功能以便将它们组合起来?或者还有其他方法可以达到目的吗?


您需要传递 gtable 而不是 ggplot,

library(gtable)
library("ggplot2")
library(grid)
set.seed(1)
d <- data.frame(
  f1 = rep(LETTERS[1:3], each = 100),
  f2 = rep(letters[1:3], 100),
  v1 = runif(3 * 100),
  v2 = rnorm(3 * 100)
)
p1 <- ggplot(d, aes(v1, v2, color = f2)) + geom_point() + facet_wrap(~f1)
p2 <- ggplot(d, aes(v1, v2, color = f2)) + geom_smooth() + facet_wrap(~f1)


facet_wrap_labeller <- function(g, labels=NULL) {

  gg <- g$grobs      
  strips <- grep("strip_t", names(gg))

  for(ii in seq_along(labels))  {
    oldgrob <- getGrob(gg[[strips[ii]]], "strip.text", 
                       grep=TRUE, global=TRUE)
    newgrob <- editGrob(oldgrob,label=labels[ii])
    gg[[strips[ii]]]$children[[oldgrob$name]] <- newgrob
  }
  g$grobs <- gg
  g
}


combined_fun <- function(p1, p2, labs1) {

  g1 <- ggplotGrob(p1 + theme(legend.position = "right"))
  g2 <- ggplotGrob(p2 + theme(legend.position = "none")) 

  g1 <- facet_wrap_labeller(g1, labs1)

  legend <- gtable_filter(g1, "guide-box", trim = TRUE)
  g1p <- g1[,-(ncol(g1)-1)]
  lw <- sum(legend$width)

  g12 <- rbind(g1p, g2, size="first")
  g12$widths <- unit.pmax(g1p$widths, g2$widths)
  g12 <- gtable_add_cols(g12, widths = lw)
  g12 <- gtable_add_grob(g12, legend, 
                         t = 1, l = ncol(g12), b = nrow(g12))
  g12
}


test <- combined_fun(p1, p2, labs1 = c(
                      expression(paste("A ", italic(italic))),
                      expression(paste("B ", italic(italic))), 
                      expression(paste("C ", italic(italic)))
                    )
)

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

在 R 中结合 grid_arrange_shared_legend() 和facet_wrap_labeller() 的相关文章

  • 如何使用 R 计算成为列表中中位数的概率?

    假设我有以下数据集 其中显示了假设实验的每个状态的三个观察结果的列表 state lt c Iowa Minnesota Illinois outcome lt list c 5 11 11 c 3 12 8 c 9 14 2 dat lt
  • 将数据框中的每个 x 个字符拆分为字符串

    我知道这里有一些关于每隔一段时间分割一个字符串的答案nth字符 例如this one https stackoverflow com questions 23208490 split each character in r and this
  • 将绘图调用拆分为多个块

    我正在编写一个图的解释 其中我基本上将在第一个块中创建图 然后描述该输出 并在第二个块中添加一个轴 然而 似乎每个块都会强制一个新的绘图环境 因此当我们尝试使用以下命令运行块时会出现错误axis独自的 观察 output html docu
  • Dendextend:关于如何根据定义的组为树状图的标签着色

    我正在尝试使用一个名为 dendextend 的很棒的 R 包来绘制树状图并根据一组先前定义的组为其分支和标签着色 我已阅读您在 Stack Overflow 中的答案以及 dendextend vignette 的常见问题解答 但我仍然不
  • 尝试读取 CSV 文件时出现“无法识别的字符串转义”

    我正在尝试导入一个 csv文件 以便我可以观看此视频 R ggplot2 图形直方图 http www youtube com watch v 47kWynt3b6M 我安装了所有正确的软件包 包括ggplot以及相关的包 视频中的第一个说
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 只读取选定的列

    谁能告诉我如何仅读取下面每年数据的前 6 个月 7 列 例如使用read table Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2009 41 27 25 31 31 39 2
  • 在 r 中的 group_by 之后建模后取消列表列的嵌套

    我想对所有组进行线性回归group by 将模型系数保存在列表列中 然后使用 unnest 扩展列表列 这里我用的是mtcars以数据集为例 注 我想用do here becausebroom tidy 不适用于所有型号 mtcars gt
  • 如何仅删除单括号并保留配对的括号

    你好 我亲爱的老师 R 用户朋友们 我最近开始认真学习正则表达式 最近我遇到了一种情况 我们只想保留配对括号 并省略未配对的 这是我的样本数据 structure list t1 c Book Pg 1 Website Online Jou
  • 如何在 R 或 Python 中制作旭日图?

    到目前为止 我一直无法找到一个可以创建旭日图的 R 库约翰 斯塔斯科 http www cc gatech edu gvu ii sunburst 有人知道如何在 R 或 Python 中实现这一点吗 在极坐标投影中使用 matplotli
  • 所有 x 轴标签未以 45 度显示

    I m having the code as like below But I m not getting all the x axis labels and it is not displaying in 45 degree when I
  • ggplot2:如何标记事件发生的日期

    我想从第二个情节中获取第一个情节的信息 第二张图表示事件发生的天数 它看起来更宽 因为它没有图例 但它是相同的时间尺度 我选择在第一个图中手动分配颜色 I would like to overlay the second plot dots
  • R 中用于调用 sed、rsync、ssh 等的 system() 的替代方案:函数是否存在,我应该编写自己的函数,还是我错过了重点?

    最近 我发现了base files命令 与其他命令一起使用 例如getwd write lines file show dir等等 似乎有许多 bash 函数的 R 等价物 我还在 R 中编写了一些函数来简化对ssh and rsync通过
  • R“错误:“}”中出现意外的“}”[重复]

    这个问题在这里已经有答案了 我有一个字符串变量 对于缺少数据的情况 它具有 空值 我想将 空值 重新编码为缺失 而不是说 空值 我正在尝试编写一个循环来删除这些 空值 条目 但我不断收到错误 错误 中出现意外的 for row in dat
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 删除极坐标图边缘的多余空间和圆环

    我有一个极坐标图ggplot2我已经非常接近完成 相当简单的情节 我已经能够在删除矩形边框方面获得帮助 但我不需要删除最后一个范围轮廓与带有方位角标签的绘图周围的环之间的额外空间 我希望该图的边界为 15 000 而不是 15 214 我编
  • SPSS 中的标准化残差与 R rstandard(lm()) 不匹配

    在寻找 R 相关解决方案时 我发现 R 和 SPSS 版本 24 在计算简单线性模型中的标准化残差方面存在一些不一致 看来SPSS所谓的标准化残差匹配 R学生化残差 我完全不认为某处存在软件错误 但显然这两个程序之间存在差异 看看这个例子
  • 实三次多项式的最快数值解?

    R 问题 寻找最快的方法来数值求解一堆已知具有实系数和三个实根的任意三次方程 据报道 R 中的 polyroot 函数对复杂多项式使用 Jenkins Traub 算法 419 但对于实多项式 作者参考了他们早期的工作 对于实三次或更一般的
  • 在 ifelse() 语句内部和外部运行一行时的不同输出

    我正在尝试运行一个简单的命令 但不知道为什么在内部和外部运行它时输出不同ifelse 功能 函数条件评估为FALSE 所以输出应该完全相同 但是 单独运行时 输出为0 0 1 1 0 1 0 1 NA 根据需要 但是从ifelse 函数 输

随机推荐

  • Inception 模型有两个 softmax 输出吗?

    Inception v3 模型如下图所示 该图片来自这篇博文 https research googleblog com 2016 03 train your own image classifier with html 看起来有两个Sof
  • Lua中对表进行降序排序

    我无法让它工作 tbl 1 etc2 14477 2 etc1 1337 3 etc3 1336 4 etc4 1335 for i 1 tbl do table sort tbl function a b return a i gt b
  • 服务器端 PHP session_start() 错误

    我目前正在尝试将我的网站从我的计算机上的本地主机移动到我的网络服务器 还有一个问题 除了管理登录表单之外 一切正常 起初我以为这不是 save as utf 8 without BOM 问题 但错误日志显示了一些我以前从未遇到过的奇怪问题
  • 无法打开流:HTTP 包装器不支持可写连接

    我已将本地主机文件上传到我的网站 但它向我显示此错误 2 file put contents WebsiteURL cache lang FileName php function file put contents failed to o
  • PHP合并数组

    我一直在尝试 未成功 将多个数组的输出合并到一个数组中 我尝试过的一个例子是 data1 array cat goat data2 array dog cow print r array merge data1 data2 这工作得很好 但
  • 如何将 Unicode 字符作为 JSP/Servlet request.getParameter 传递?

    经过多次尝试和错误 我仍然无法找出问题所在 JSP Servlet 和数据库都设置为接受 UTF 8 编码 但即使如此 每当我对任何具有两字节字符 如破折号 的内容使用 request getParameter 时 它们都会被打乱为损坏的字
  • 有关内存映射接口的进一步问题

    我处理内存映射设备的 C 代码仍然存在一些问题 目前 我将写入的寄存器的地址空间声明为易失性 指针 我向它们写入数据 如下所示 volatile unsigned int wr register int 0x40000000 volatil
  • 如何在 iOS 上调用 Rootviewcontroller

    在我的 iOS 应用程序启动中检查用户是注册用户还是新用户 如 facebook 和 Skype 如果用户未注册 我正在导航应用程序以向我的应用程序委托注册屏幕 if user register RegisterViewController
  • Jquery Ajax POST 中出现 400 bad request 错误

    我正在尝试使用 Jquery 发送 Ajax POST 请求 但遇到 400 bad request 错误 这是我的代码 ajax type POST url http localhost 8080 project server rest
  • 在Lua中生成均匀随机数

    我正在用 Lua 编写马尔可夫链 其中一个要素要求我统一生成随机数 这是一个简化的例子来说明我的问题 example function x local r math random 1 10 print r return x r end ex
  • Servlet - 关闭连接但不关闭方法

    我必须实现将发送的服务 servlet 2 5 或 3 204在每个连接上编写代码但不关闭线程 我需要对收到的数据做一些事情 比如打开新连接 可以关闭连接但不能结束方法吗 或者在连接关闭时启动另一个方法 规范中尚不清楚 但它似乎可以在 To
  • 如何在服务器端获取客户端屏幕分辨率宽度/高度

    我可以使用客户端脚本 javascript 获取客户端屏幕分辨率 但我不想那样做 我也尝试过Request Browser ScreenPixelsWidth 但它总是返回固定宽度680 任何想法 客户端屏幕分辨率等信息是never在 HT
  • RDPSession ConnectToClient 意外终止

    我已经成功创建了一个桌面共享解决方案 其中 RDPViewer 连接到 RDPSession 这一切都很顺利 然而 现在我正在尝试相反的方法 使用 RDPViewer 的 StartReverseConnectListener 方法和 RD
  • 复制具有 unicode 名称的文件

    这应该是一个简单的脚本 import shutil files os listdir C for efile in files shutil copy efile D 它工作得很好 直到我在电脑上尝试使用 unicode 字符命名的文件 p
  • 具有地理位置策略的 AWS Cloudfront 与 Route53

    我们可以将CloudFront与Geolocation策略一起使用吗 或者CloudFront内部是否具有此功能并且可以单独使用来满足 或者 Route53 是一个正确的选择 同时需要为全球网站提供来自最近地理位置的请求以改善客户体验 另外
  • 为什么PHP不能创建777权限的目录?

    我正在尝试使用 PHP 和以下命令在我的服务器上创建一个目录 mkdir test 0777 但它并没有给出完整的权限 只有这些 rwxr xr x 该模式根据您当前的情况进行修改umask 即022在这种情况下 方式umask作品是一种减
  • Laravel 8:未定义方法“createToken”intelephense(1013)

    我对 PHP intelephense 方法有疑问创建令牌未定义 我不知道如何解决它 但是当我在邮递员中运行它时它就起作用了 我不知道为什么 vscode 不识别它 我还添加了使用 Laravel Passport HasApiTokens
  • HQL IN 运算符,枚举数组 ClassCastException

    这是我精简的类和枚举 class A Enumerated value EnumType STRING AType type enum AType X Y 如果我跑 query FROM A a WHERE a type type quer
  • Karate WebSocket 如何在一个会话中监听多个消息?

    对于我们的集成测试 我们有一个场景 我们想要监听由我们使用的环境预定义的一定数量的消息 我已经看到可以通过打开新连接来收听多个消息 但这并没有太大的灵活性 您是否阅读过文档 因为据我所知 如果您定义了 处理程序 函数 则可以对多个消息使用相
  • 在 R 中结合 grid_arrange_shared_legend() 和facet_wrap_labeller()

    我正在尝试结合grid arrange shared legend and facet wrap labeller 更具体地说 我想绘制一个包含两个 ggplot 图形的图形 每个图形都有多个面板 并且有一个共同的图例 我还想将部分刻面条标