将额外参数传递给 ggplot2 中的自定义几何图形

2023-11-22

我正在创建一个自定义几何图形,并希望它带有一个额外的参数,称为showpoints,这对实际情节做了一些事情或其他事情。例如,通过将其设置为 FALSE,geom 实际上返回一个zeroGrob()。我找到了一种方法,但是(i)它很笨重并且有点奇怪,并且(ii)我不完全理解我在做什么,这是一个坏兆头。问题是当你定义一个新的统计数据时,可以运行setup_params,但 geoms 没有它:

与 Stat 和 Position 相比,Geom 有点不同,因为 设置和计算功能的执行是分开的。设置数据 在位置调整之前运行,并且draw_layer不会运行直到 渲染时间要晚得多。这意味着没有 setup_params 因为 很难传达这些变化。

[Source]

基本上,我的代码的工作原理是,您可以使用附加参数来抑制点的绘制:

# draw the points by default
ggplot(mpg, aes(displ, hwy)) + geom_simple_point()

# suppresses drawing of the points
ggplot(mpg, aes(displ, hwy)) + geom_simple_point(showpoints=FALSE)

到目前为止,这是我的代码,基于扩展 ggplot2 教程:

## Return the grob to draw. The additional parameter,
## showpoints, determines whether a points grob should be returned,
## or whether zeroGrob() should take care of not showing the points
.draw_panel_func <- function(data, panel_params, coord) {
  coords <- coord$transform(data, panel_params)
  showpoints <- unique(data$showpoints)
  cat("showpoints=", as.character(showpoints), "\n")
  if(!is.null(showpoints) && is.logical(showpoints) && !showpoints) {
    return(zeroGrob())
  } else {
    return(
      grid::pointsGrob(coords$x, coords$y,
        pch = coords$shape,
        gp = grid::gpar(col = coords$colour))
   )
 }
}

## 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,
  setup_data = function(data, params) {
    if(!is.null(params$showpoints)) {
      data$showpoints <- params$showpoints
    }
    data
  },
  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, ...)
  )
}

有没有一种更简单的方法将选定的额外参数传递给 geom?如果我可以定义extra_params,为什么我不能更轻松地访问它们?


有一个相对简单的方法,就是将额外的参数作为参数传递给面板绘制函数。这是一个适合您的简单示例geom_simple_point():

GeomSimplePoint <- ggproto(
  "GeomSimplePoint", 
  GeomPoint,
  extra_params = c("na.rm", "showpoints"),
  draw_panel = function(data, panel_params, 
                        coord, na.rm = FALSE, showpoints = TRUE) {
    if (showpoints) {
      return(GeomPoint$draw_panel(data, panel_params, coord, na.rm = na.rm))
    } else {
      return(zeroGrob())
    }
  }
)

顺便说一句,如果您想复制现有几何对象的行为,例如geom_point(),更容易设置您自己的 ggproto 对象以继承该 geom 的 ggproto 对象。这样,您在 ggproto 中指定的默认 aes、必需的 aes 和其他参数就会自动从该 geom 复制/继承,而您不必手动指定所有这些参数。

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

将额外参数传递给 ggplot2 中的自定义几何图形 的相关文章

  • 组合上标和包含 < 符号的变量标签时使用 ggplot geom_text

    我在将 R2 注释添加到多面图中时遇到问题 其中我的 R2 值有时 例如 使用 iris 数据集 我首先使用之前计算的 R2 值设置一个新的数据框 x 和 y 位置也已设置 因为每个方面的 x 和 y 位置都不同 对于 iris 数据集来说
  • R中引用和表达式的区别

    gettypes function x paramx substitute x print typeof paramx print class paramx print mode paramx gettypes expression sin
  • Eclipse 和 R 中的 StatET

    我已经成功地将 StatET 安装到 eclipse 中 并且我有一个名为 Test 的 Java 项目 其中包含一些代码 我希望能够在该项目文件夹中保留 R 文件并将其作为独立的 R 脚本运行 与 Java 程序分开 我怎样才能做到这一点
  • r + dplyr 过滤时间序列

    我有一些数据观察了一群人以及他们随时间推移所吃的水果 我想使用 dplyr 来观察每个人 直到他们吃香蕉并总结他们吃的所有水果直到他们吃第一根香蕉 data data lt structure list user c 1234L 1234L
  • 检索每组的“倒数第二个”数据

    我想检索每组的 倒数第二个 数据 目前 代码如下 使用 group modify 两次 有没有可用的功能 如何简单地使用当前代码 谢谢 所希望的结果在附图中的红色矩形中 library dplyr test data lt data fra
  • R:如何跨行应用xts对象?

    我有以下 xts 对象 x lt structure c 30440 5 30441 30441 5 30441 5 30441 30439 5 30440 5 30441 30441 5 NA NA 30439 5 NA NA NA 30
  • 如何更改现已弃用的 dplyr::funs() (其中包含 ifelse 参数)?

    非常基本 但我认为我并没有真正理解这一变化 library dplyr library lubridate Lab import sql lt Lab import gt select if sum is na gt 0 gt mutate
  • R 中带有 ggplot 的背景带

    我正在尝试为不同的组创建箱线图 我想用 3 个水平条带为背景着色 中心观测值 其中所有观测值均接近总体平均值 平均值 体重 0 5 另外 2 个带是下面的和上面的 这些是我的情节 library ggplot2 bp lt ggplot d
  • 为什么我的 R 直方图中的第一个条形那么大?

    我正在使用 R 我尝试使用以下 R 脚本可视化 1000 次骰子投掷的分布 cases lt 1000 min lt 1 max lt 6 x lt as integer runif cases min max 1 mx lt mean x
  • 在 R 中,如何将整个命令行放入二元运算符的 sys.call() 中?

    我为 R 编写了一个二元运算符函数 即名称类似于 X 这样就不必输入 X a b 我可以使用更方便的语法a X b 我的目标是有一个包装器 lt 它会执行一些操作 例如记录对该环境中的对象所做的操作并检查 受保护 属性 该属性会在覆盖该对象
  • ggplot2 密度直方图,宽度=.5,vline 和居中条形位置

    我想要一些离散数据的良好密度 总和为 1 直方图 我尝试了几种方法来做到这一点 但没有一种方法完全令人满意 生成一些数据 data set seed 999 d test data frame score round rnorm 100 1
  • 使用 2 个表创建新功能

    table1 lt data frame user id c 1 1 1 1 1 1 1 1 1 1 2 2 product id c 14 24 38 40 66 2 19 30 71 98 7 16 first order c 1 2
  • 在 R 中使用 k-NN 和分类值

    我希望对主要具有分类特征的数据进行分类 为此 欧几里得距离 或任何其他数值假设距离 不适合 我正在寻找 R 的 kNN 实现 其中可以选择不同的距离方法 例如汉明距离 有没有一种方法可以使用常见的 kNN 实现 例如具有不同距离度量函数的
  • Shiny:如何在数据表中显示条形图

    我想在数据表中显示条形图 这link http jsfiddle net annoyingmouse em27yod1 显示我想使用 javascript 做什么 我不了解 javascript 或 html 所以你能告诉我是否可以使用闪亮
  • 如何根据R中的条件创建新变量

    我正在尝试根据某些条件创建一个新变量 我的数据看起来像 a b 1 NA 2 3 3 3 NA 2 NA NA 我想要的是一个变量c这样 when a is not NA b is NA c a when a is NA b is not
  • 如何在 Windows 上使用 freeType 构建 rgl

    我正在尝试 并且非常失败 建立rgl封装有freeType在 Windows 上 因为事实证明 rgl我通过 Rgui 安装的 Windows 二进制文件不包括freeType支持 我需要它的原因是this https stackoverf
  • 更改 geom_text 的默认“a”图例以标记字符串本身

    类似于这个问题 https stackoverflow com questions 18337653 remove a from legend when using aesthetics and geom text 我想更改图例中的默认 a
  • R文本文件和文本挖掘...如何加载数据

    我正在使用 R 包tm我想做一些文本挖掘 这是一个文档 被视为一个词袋 我不明白有关如何加载文本文件并创建必要的对象以开始使用诸如 之类的功能的文档 stemDocument x language map IETF Language x 所
  • rollapply 可以返回矩阵列表吗?

    我想使用滚动窗口生成协方差矩阵 和均值向量 但在我所有的尝试中rollapply堆叠协方差矩阵cov并且耗尽了预先分配的空间 例如 如果我的原始数据有 40 个观察值 那么rollapply不能返回超过 40 行 有什么方法可以让我得到ro
  • 是否有任何 R 函数可以将链接的值可视化为节点内的文本?

    我正在使用 R 包networkD3绘制以下桑基图 这些值设置链接的大小 我需要一个在节点内添加与文本相同的值的函数 Library library networkD3 library dplyr Make a connection dat

随机推荐

  • android.widget.Button 无法转换为 android.widget.EditText

    在开发我的第一个 Android 计算器应用程序时 我通过意图传递答案 成功更新了新活动中的 TextView 但这需要用户按 返回 来执行另一次计算 我试图让 doCalculation 按钮更新 MainActivity 中的简单 Te
  • unix 套接字上的原子写入?

    我正在尝试选择pipes and Unix 套接字对于IPC机制 两者都支持select and epoll 功能很棒 现在 管道具有 4kB 截至今天 的 原子 写入 这是由 Linux 内核保证的 unix 套接字是否存在这样的功能 我
  • OpenCV 中未记录的 groupRectangles 变体

    在OpenCV中的cascadeDetect cpp中 有以下几种变体groupRectangles功能 void groupRectangles std vector
  • 了解 JavaScript 中的事件队列和调用堆栈

    当我解决这个问题时 我对理解 事件队列 和 调用堆栈 概念的好奇心开始了 var list readHugeList var nextListItem function var item list pop if item process t
  • 构建参数化的 EntityFramework 核心表达式

    你好 我正在尝试构建一个表达式来通过主键获取通用实体并获取参数化的 SQL 查询 目前我可以获得正确的 WHERE 查询 但它没有参数化 public async Task
  • 将侦听器添加到通过 XTemplate 创建的 DOM 的正确技术?

    我们使用 XTemplates 很多 XTemplates 它们非常适合显示只读内容 但是您是否曾向通过模板创建的 DOM 添加 Ext JS 侦听器 您愿意分享您创建这些侦听器的首选技术吗 我首选的技术是使用类似的 live来自 jque
  • 有没有办法从 DataContract 导出 XSD 架构

    我正在使用 DataContractSerializer 将我的类序列化为 XML 或从 XML 反序列化 一切工作正常 但在某些时候我想为这些 XML 文件的格式建立一个独立于实际代码的标准架构 这样 如果序列化过程中出现问题 我可以随时
  • HTML 中所有锚点的一般偏移量?

    我有一些锚元素 但它们位于绝对位置 div 并且 div 的内容太大 以至于它在内部滚动 溢出 自动 div 中的所有条目顶部都有一个锚点 但是如果我转到这个锚点 我想要的元素直接位于侧面的顶部 但我希望它位于中心 我需要像偏移这样的东西
  • Java - 类方法可以看到同类参数的私有字段

    我遇到了一个相当奇怪的行为 不确定这是 Java 问题还是 Eclipse 的问题 采取以下代码 class Foo private String text public void doStuff Foo f System out prin
  • 无法创建 PoolableConnectionFactory(用户 ''@'localhost' 的访问被拒绝

    在过去的几天里 我一直在尝试为网络应用程序设置 DatabaseConnectionPool 但没有成功 我已经阅读了 Tomcat 文档的相关部分以及围绕该主题的大量内容 并认为我做的一切都是正确的 但显然不是因为我不断收到以下错误 Ca
  • 在 Docker 容器中运行时,JVM 无法映射保留内存

    我似乎根本无法在服务器上的 Docker 容器中运行 java 即使在发行时java version 我收到以下错误 root 86088d679103 java version OpenJDK 64 Bit Server VM warni
  • C++ 聚合没有虚函数吗?

    在 C 中 聚合是 取自语言规范的 8 5 1p1 一个数组或一个类 第 9 条 没有用户提供的构造函数 12 1 没有私有或 受保护的非静态数据成员 第 11 条 无基类 第 10 条 并且无虚函数 10 3 So 1不是一个聚合 但是
  • 无法使用 mySQL 的 root 密码登录 phpMyAdmin(在 Mac OS X Lion 上)

    因此 我尝试使用 root 密码 用户名 root 密码 登录 phpMyAdmin 但是 我仍然收到错误 2002 无法登录MySQL服务器 我非常确定我知道 root 密码 因为我在 Mac OS X 的终端中输入了以下行 sudo u
  • 警告 请求的配置文件“pom.xml”无法激活,因为它不存在

    我正在尝试运行 Maven goal validation 并不断获取 警告 请求的配置文件 pom xml 无法激活 因为它不存在 在我的 org eclipse m2e core prefs 中 activeProfiles pom x
  • window.onblur 不工作

    我似乎无法让 window onblur 正常工作 window onblur console log blur 当侦听器应用于窗口时 它仅在加载页面时运行 而不是在窗口失去焦点时运行 Ryudice 已经告诉你该怎么做 但没有解释why它
  • java读取DER格式的私钥

    我有以下代码来读取 PKCS 8 格式的私钥 public void encryptHash String hashToEncrypt String pathOfKey String Algorithm FileInputStream fi
  • 从 AVAssetWriter 读取实时 H.264 输出时数据损坏

    我正在使用一些技巧来尝试在将 AVAssetWriter 写入磁盘时读取其原始输出 当我通过连接各个文件来重新组装它们时 生成的文件与 AVAssetWriter 的输出文件的字节数完全相同 但是 重新组装的文件将无法在 QuickTime
  • 如何修复 Qt 需要 C++17 编译器?

    我使用柯南安装的Qt 6 2 2 我在 VS 2019 中创建了 Qt Widgets 项目 将语言切换为std c 17 added Zc cplusplus到附加选项 由于这是柯南安装的 QT 因此它没有Qt props 所以我手动创建
  • 每次请求时自动重新加载 wisper 监听器

    我在 app listeners 目录中有 wisper 监听器 我还有 config initializers wisper rb module Wisper def self setup configure do config conf
  • 将额外参数传递给 ggplot2 中的自定义几何图形

    我正在创建一个自定义几何图形 并希望它带有一个额外的参数 称为showpoints 这对实际情节做了一些事情或其他事情 例如 通过将其设置为 FALSE geom 实际上返回一个zeroGrob 我找到了一种方法 但是 i 它很笨重并且有点