将额外参数传递给 ggplot2 geoms:使用省略号 (...)

2023-12-29

这是后续this https://stackoverflow.com/questions/57072096/passing-an-extra-parameter-to-a-custom-geom-in-ggplot2问题。我正在尝试使用自定义参数编写自己的几何图形。我的问题是如何使用省略号(...)来传递额外的参数。

以下示例代码按预期工作:

draw_panel_func <- function(data, panel_params, coord, showpoints=FALSE) {
  print(showpoints)
  if(showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  } 
} 


## definition of the new geom. setup_data inserts the parameter 
## into data, therefore making it accessible for .draw_panel_func
GeomSimplePoint <- ggproto("GeomSimplePoint", Geom,
  required_aes = c("x", "y"),
  default_aes = aes(shape = 19, colour = "black"),
  draw_key = draw_key_point,
  extra_params = c("na.rm", "showpoints"),
  draw_panel = draw_panel_func
) 

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, showpoints=TRUE, ...) {
  layer(
    geom = GeomSimplePoint, mapping = mapping,  data = data, stat = stat,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, showpoints=showpoints, ...)
  )   
}

这有效,我可以打电话

ggplot(mpg, aes(displ, hwy)) + geom_simple_point(showpoints=FALSE)

省略点的绘制。

但是,因为我想对不同的新几何对象使用通用函数,所以我更愿意定义draw_panel函数没有显式命名 showpoints 参数,而是使用省略号。我尝试了以下操作(所有其余代码保持不变),它不起作用:

draw_panel_func <- function(data, panel_params, coord, ...) {
  showpoints <- list(...)$showpoints
  if(showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  }
}

返回的错误是:

if (showpoints) { 中的错误:参数长度为零

当我执行以下操作时,会发生一件有趣的事情:

draw_panel_func <- function(data, panel_params, coord, showpoints=FALSE, ...) {
  #showpoints <- list(...)$showpoints
  if(showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  }
}

由于某种原因,showpoints 现在始终为 FALSE。但是,那...列表为空。这完全出乎意料。

这一切都非常令人困惑,并且肯定它的表现并不像我预期的那样。在这种情况下可以使用省略号吗?如果是,那么如何?这里发生了什么?

EDIT:按照 Gilean0709 的建议我尝试删除showpoints从定义geom_simple_point:

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, ...) {
  layer(
    geom = GeomSimplePoint, mapping = mapping,  data = data, stat = stat,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, ...)
  )   
}

这仍然给出相同的错误(showpoints 为 NULL)。


这与参数分配到统计数据、几何图形和位置的方式有关。如果我们看一下代码layer():

function(arguments){
  ...some_body...
  params <- rename_aes(params)
  aes_params <- params[intersect(names(params), geom$aesthetics())]
  geom_params <- params[intersect(names(params), geom$parameters(TRUE))]
  stat_params <- params[intersect(names(params), stat$parameters(TRUE))]
  all <- c(geom$parameters(TRUE), stat$parameters(TRUE), geom$aesthetics())
  extra_param <- setdiff(names(params), all)
  if (check.param && length(extra_param) > 0) {
    warning("Ignoring unknown parameters: ", paste(extra_param, 
      collapse = ", "), call. = FALSE, immediate. = TRUE)
  }
  ...some_more_body...
}

我们可以看到你输入的参数params(包括...)根据参数名称分布在层的不同方面。剩下的任何东西(extra_param)被丢弃并被警告。由于省略号...是一种特殊情况,它本身没有名称(但其中的元素...做),如果 ggplot geoms/stats/aes 不知道中的元素,则会被丢弃....

现在有一个丑陋的方法来解决这个问题,那就是在一开始就复制省略号并将其作为命名参数传递:

geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
                              position = "identity", na.rm = FALSE, show.legend = NA,
                              inherit.aes = TRUE, ...) {
  elli <- list(...)
  layer(
    geom = GeomSimplePoint, mapping = mapping,  data = data, stat = stat,
    position = position, show.legend = show.legend, inherit.aes = inherit.aes,
    params = list(na.rm = na.rm, elli = elli, ...)
  )   
}

然后,我们可以让面板绘图函数接受这个省略号的副本作为参数:

draw_panel_func <- function(data, panel_params, coord, elli) {
  if(elli$showpoints) {
    coords <- coord$transform(data, panel_params)
    grid::pointsGrob(coords$x, coords$y)
  } else {
    zeroGrob()
  }
}

并相应地更新 ggproto:

GeomSimplePoint <- ggproto("GeomSimplePoint", Geom,
                           required_aes = c("x", "y"),
                           default_aes = aes(shape = 19, colour = "black"),
                           draw_key = draw_key_point,
                           extra_params = c("na.rm", "elli"),
                           draw_panel = draw_panel_func
) 

现在,这产生了一个将按预期工作的情节,但它会发出警告,表明它忽略了showpoints参数,因为它被传递给extra_param(尽管从技术上讲它并没有被忽略,因为它现在是elli)。不过,您可能想在面板绘图函数中编写一些额外的检查,以确保showpoints甚至在一开始就提供了一个论点。

希望这有帮助!

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

将额外参数传递给 ggplot2 geoms:使用省略号 (...) 的相关文章

  • 将密度曲线拟合到 R 中的直方图

    R中有没有可以将曲线拟合到直方图的函数 假设您有以下直方图 hist c rep 65 times 5 rep 25 times 5 rep 35 times 10 rep 45 times 4 看上去很正常 但其实是歪曲的 我想拟合一条倾
  • 如何调整ggplot直方图的时间刻度轴

    我正在使用一个数据框 其中一列包含POSIXct日期时间值 我正在尝试使用绘制这些时间戳的直方图ggplot2但我有两个问题 我不知道如何设置 binwidthgeom histogram 我想将每个垃圾箱设置为一天或一周 我尝试提供 di
  • 使用 ggplot2 修改点子集的形状

    我正在尝试绘制一个沿大量维度变化的大型散点图 这是我的起始情节 p lt ggplot mtcars aes wt mpg shape cyl colour gear size carb geom point 使用mtcars数据集 我只是
  • 分离并重新附加“tools:rstudio”

    又名玩火 以下不起作用 rstd obj lt as environment tools rstudio detach tools rstudio attach rstd obj name tools rstudio 好吧 它似乎有效 但随
  • R-了解 akima::interp 结果中的 NA 值

    我有以下数据框 ref dat k Intensity Slope 1 0 021467214 33 16 2 0 012444759 33 8 3 0 006079156 33 4 4 0 003792025 33 2 5 0 02276
  • 如何使用 R 中带引号的字符值内的序列读取 CSV?

    这是一个包含两个字符列的 CSV 文件 key value a 所有字符值都用双引号引起来 并且有一个顺序 在值之一内 转义引号加分隔符 我无法通过 read csv readr 中的 read csv 或 data table 中的 fr
  • dplyr,do(),从模型中提取参数而不丢失分组变量

    R 帮助中关于 do 的示例略有不同 by cyl lt group by mtcars cyl models lt by cyl gt do mod lm mpg disp data coefficients lt models gt d
  • 在 R 中绘制对数正态概率密度

    我正在尝试在 R 中生成对数正态概率密度图 其中包含 3 个不同的均值对数和标准差对数 我尝试了以下方法 但我的图表太丑了 看起来一点也不好看 x lt seq 0 10 length 100 a lt dlnorm x meanlog 0
  • 逻辑回归/二项式的 glmnet 误差

    当尝试将 glmnet 与 family binomial 配合以进行逻辑回归拟合时 出现此错误 gt data lt read csv DAFMM HE16 matrix csv header F gt x lt as data fram
  • 如何将此“for”循环转换为向量解

    这个问题与 将嵌入其他文本的长州名称转换为两个字母的州缩写 https stackoverflow com questions 25582518 convert long state names embedded with other te
  • 使用 R 进行项目组织 [重复]

    这个问题在这里已经有答案了 可能的重复 统计分析和报告撰写的工作流程 https stackoverflow com questions 1429907 workflow for statistical analysis and repor
  • R 中的字符串作为函数参数

    数据框chocolates列出了糖果的类型以及每种糖果的一组评级 ID sweetness filling crash snickers 0 67 0 55 0 40 milky way 0 81 0 53 0 56 我正在编写一个函数 它
  • 使用outer代替expand.grid

    我正在寻找尽可能快的速度并留在基地做该做的事expand grid做 我用过outer为过去类似的目的创建一个向量 像这样的东西 v lt outer letters LETTERS paste0 unlist v lower tri v
  • 有没有一种简单的方法来判断存储在一个列表中的许多数据帧是否包含相同的列?

    我有一个包含许多数据框的列表 df1 lt data frame A 1 5 B 2 6 C LETTERS 1 5 df2 lt data frame A 1 5 B 2 6 C LETTERS 1 5 df3 lt data frame
  • R - 通过覆盖和递归合并列表

    假设我有两个带有名字的列表 a list a 1 b 2 c list d 1 e 2 d list a 1 b 2 b list a 2 c list e 1 f 2 d 3 e 2 我想递归地合并这些列表 如果第二个参数包含冲突的值 则
  • R:将 JSON 时间格式转换为 POSIX

    我有一个 JSON 字符串 并将其放入数据框中 我能够做到这一点 但我在使用 apply 函数之一将所有时间字符串转换为 POSIX 格式时遇到问题 See here https stackoverflow com questions 90
  • 在 R 中使用 Huggingface Transformer 模型

    我正在尝试在 R 中使用不同的 Huggingface 模型 这是通过 reticulate 导入 Transformer 包来实现的 谢谢 https rpubs com eR ic transfoRmers https rpubs co
  • 如何在R中同时对三个字段进行网络分析

    如何在 R 中同时对三个字段进行网络分析 下面是示例数据以及desired output在最后一栏中 df lt data frame stringsAsFactors FALSE id 1 c ABC ABC BCD CDE DEF EF
  • 如何匹配 R 中的所有匹配项?

    我有 1000 个名字的列表 说A 我还有另外 5 个名字的清单 说B 我想找出这5个名字出现在1000个号码列表中的第几行 例如 Amy 在 A 中可以出现 25 次 B 里有艾米 我想知道 Amy 出现在 A 中的哪些行 我以前使用过
  • 单击 R 中的 Sankey Chart 线时添加额外的标签值

    以下 R 闪亮脚本创建一个桑基图 如下面的快照所示 我的要求是 当我单击左右节点之间的任何链接 即 a1 和 a2 时 我希望相应的 a3 的总和出现在标签中 例如 a1 中的 A 和 a2 中的 E 总共具有值 50 和 32 因此 我想

随机推荐

  • 如何从另一个分支获取更改

    我目前正在研究featurex分支 我们的主分支被命名为our team 自从我开始工作以来featurex 对分支进行了更多更改our team 我在本地完成此操作是为了获取所有最新更改our team git checkout our
  • 将 PEM 证书解析为 JSON

    我有 PEM 证书并且正在使用openssl查看其内容 是否可以将输出解析为 JSON 格式 也许有一个 Java 库或 Bash 脚本可以做到这一点 命令 openssl x509 in sample cer noout text out
  • 无法将函数并行映射到 tarfile 成员

    我有一个包含 bz2 压缩文件的 tar 文件 我想应用该功能clean file到每个 bz2 文件 并整理结果 在系列中 使用循环很容易 import pandas as pd import json import os import
  • Python:将标志传递给函数

    很长一段时间以来 我一直试图找出将标志传递给 python 函数的最佳方法 最直接的方法是这样的 def func data flag1 flag2 flag3 func my data True False True 这确实很好而且简洁
  • Ajax div 刷新后 Jquery Masonry 相互加载

    我正在使用 ajax 刷新包含图像的 div 我最初使用砌体来添加布局 然后ajax调用返回一个js 使用html 方法刷新div 现在完成后我打电话masonry reloadItems 但砌体将所有图像加载到另一图像上 调整页面大小后
  • 如何在android中解析这个JSON数组

    我想要每个标签的名称 电子邮件和图像 我必须在列表元素中显示 response name Brajendra Mishra email email protected cdn cgi l email protection address I
  • 在 Python 中使用互斥锁和并发 future

    我有一些代码使用并发 future 连接到许多远程主机来运行一些命令 例如 def set host to host value connection connect to host info do something with conne
  • 从底部开始将元素附加到 div?

    我有以下代码 button click function parent append div element div parent height 200px width 100px border 1px solid ccc div div
  • MVVM 多视图

    我正在尝试学习 MVVM 到目前为止进展顺利 我偶然发现了一种我不知道如何实现的情况 我想要的 具有左侧导航和右侧详细信息窗格的视图 右侧详细信息将有一个内容容器 其中包含我的用户控件 以便通过左侧窗格选择视图 我拥有的 主视图模型 我数据
  • 是否需要注册兴趣才能写入 NIO 套接字来发送数据?

    是否需要注册兴趣才能写入 NIO 客户端套接字通道来发送数据 我必须总是打电话吗socketChannel register selector SelectionKey OP WRITE 或类似的东西 在写信给客户之前SocketChann
  • 在 Excel 中根据条件查找最大值或最小值

    在我的电子表格中 我有一列包含负值和正值 我需要获得所有正值中的最小值和所有负值中的最大值 我怎样才能这样做呢 使用数组公式 在以下示例中 您要检查的值位于A2 A10 最大负值 MAX IF A2 A10 lt 0 A2 A10 Pres
  • 使用Python将多个制表符分隔的文本文件插入MySQL?

    我正在尝试创建一个程序 它采用多个制表符分层文本文件 并一次处理一个文件 将它们保存的数据输入 MySQL 数据库 有几个文本文件 例如 movie txt 如下所示 1 Avatar 3 Iron Man 3 Star Trek 每个文本
  • Android - 通过网址启动谷歌地图

    在 iPhone 上 maps google com URL 被本机谷歌地图应用程序拦截并加载 我想在 Android 上执行相同的操作 但 Google 地图正在浏览器中加载 那么 在网页中 是否可以有这个url在 Android 中打开
  • 在 Objective C 中谁调用了 dealloc 方法以及何时调用?

    当在 Objective C 中创建自定义类时 何时以及如何创建dealloc方法调用 这是我必须在课堂上实施的事情吗 您永远不会直接发送 dealloc 消息 相反 对象的 dealloc 方法是通过 NSObject 协议的releas
  • WebStorm 终端颜色

    我的创意终端中出现了令人难以忍受的白色背景 网络风暴 有谁知道我该如何改变这个 打开 文件 gt 设置 然后转到 编辑器 部分 gt 颜色和字体 部分 在那里 您将看到 控制台颜色 选项 在这里 您将看到一个交互式编辑屏幕 以确定您希望这些
  • 使用spark窗口函数获取最后一个值

    假设我有一个像这样的数据框 val df sc parallelize Seq 1 0 1 Matt 1 0 2 John 1 0 3 null asInstanceOf String 1 0 2 Adam 1 0 4 Steve toDF
  • 为什么该值没有进入列表?

    在 urichecking2 日志中 我可以看到它是有价值的 但在 uriChecking 中 uriList 为空 为什么 uriList add 不起作用 private fun getPhotoList val fileName in
  • #warning 预处理器指令的可移植性

    我知道 warning 指令不是标准的C C 但有几个编译器支持它 包括 gcc g 但是对于那些不支持它的人来说 他们会默默地忽略它还是会导致编译失败 换句话说 我可以在项目中安全地使用它 而不会破坏不支持它的编译器的构建吗 应该注意的是
  • 方法调用可能会产生 NullPointerException Retrofit Body

    我正在使用 Retrofit 2 从我的 API 获取响应并将其值存储在我的常量中 如下所示 if response isSuccessful constant banner on response body getBanner on co
  • 将额外参数传递给 ggplot2 geoms:使用省略号 (...)

    这是后续this https stackoverflow com questions 57072096 passing an extra parameter to a custom geom in ggplot2问题 我正在尝试使用自定义参