将绘图保存为 R 对象并在网格中显示

2023-12-22

在下面的可重现示例中,我尝试为 ggplot 分布图创建一个函数并将其保存为 R 对象,目的是在网格中显示两个图。

ggplothist<- function(dat,var1)
{
        if (is.character(var1)) {
            var1 <- which(names(dat) == var1) 
    }
    distribution <- ggplot(data=dat, aes(dat[,var1])) 
    distribution <- distribution  + geom_histogram(aes(y=..density..),binwidth=0.1,colour="black", fill="white")
    output<-list(distribution,var1,dat)
    return(output)
}

调用函数:

set.seed(100)
df  <- data.frame(x = rnorm(100, mean=10),y =rep(1,100))    
output1 <- ggplothist(dat=df,var1='x')
output1[1]

到现在为止一切都很好。

然后我想制作第二个图,(注意平均值= 100 而不是之前的 10)

df2  <- data.frame(x = rep(1,1000),y = rnorm(1000, mean=100))    
output2 <- ggplothist(dat=df2,var1='y')
output2[1]

然后我尝试用平均值 10 重新绘制第一个分布。

output1[1]

我得到和以前一样的分布吗? 但是,如果我使用函数内包含的信息,请将其返回并将其重置为全局变量,它就可以工作。

var1=as.numeric(output1[2]);dat=as.data.frame(output1[3]);p1 <- output1[1]
p1

如果有人能解释为什么会发生这种情况,我想知道。似乎为了绘制预期的分布,我必须将 data.frame 和变量重置为用于绘制绘图的内容。有没有办法将绘图保存为对象而不必这样做。幸运的是我可以重新绘制第一个分布。

但我不能同时绘制它们

 var1=as.numeric(output2[2]);dat=as.data.frame(output2[3]);p2 <- output2[1]
 grid.arrange(p1,p2)

错误: gList(列表(列表(数据 = 列表(x = c(9.66707664902549, 11.3631137069225, : “gList”中只允许使用“grob”

在这个“在 for 循环中绘制的多个 ggplot2 绘图的网格 https://stackoverflow.com/questions/9315611/grid-of-multiple-ggplot2-plots-which-have-been-made-in-a-for-loop“建议使用列表来包含绘图的答案

 ggplothist<- function(dat,var1)
{
    if (is.character(var1)) {
            var1 <- which(names(dat) == var1) 
    }
    distribution <- ggplot(data=dat, aes(dat[,var1])) 
    distribution <- distribution  + geom_histogram(aes(y=..density..),binwidth=0.1,colour="black", fill="white")
    plot(distribution)
    pltlist <- list()
    pltlist[["plot"]] <- distribution
    output<-list(pltlist,var1,dat)
    return(output)
}

output1 <- ggplothist(dat=df,var1='x')
p1<-output1[1]

output2 <- ggplothist(dat=df2,var1='y')
p2<-output2[1]

output1[1]

将再次生成平均值 = 100 而不是平均值 = 10 的分布 和:

grid.arrange(p1,p2)

会产生相同的错误

gList(列表(列表(plot =列表(数据=列表(x = c(9.66707664902549,,: “gList”中只允许使用“grob”

作为最后一次尝试,我尝试使用 recordPlot() 将有关绘图的所有内容记录到对象中。以下内容现在位于函数内部。

    ggplothist<- function(dat,var1)
{
    if (is.character(var1)) {
            var1 <- which(names(dat) == var1) 
    }
    distribution <- ggplot(data=dat, aes(dat[,var1])) 
    distribution <- distribution  + geom_histogram(aes(y=..density..),binwidth=0.1,colour="black", fill="white")
    plot(distribution)
    distribution<-recordPlot()
    output<-list(distribution,var1,dat)
    return(output)
}

该函数将产生与之前相同的错误,具体取决于将 dat 和 var1 变量重置为绘制分布所需的值。同样不能放入网格内。

我在这个问题中尝试过类似的事情,比如arrangeGrob()”R将多个ggplot2图保存为列表中的R对象并在网格中重新显示 https://stackoverflow.com/questions/31947727/r-saving-multiple-ggplot2-plots-as-r-object-in-list-and-re-displaying-in-grid“但运气不佳。

我真的很想要一个解决方案,它创建一个包含绘图的 R 对象,该对象可以自行重绘,并且可以在网格内使用,而无需在每次完成时重置用于绘制绘图的变量。我也想了解这是怎么回事,因为我认为它根本不直观。

我能想到的唯一解决方案是将绘图绘制为 png 文件,保存在某处,然后让函数返回路径,以便我可以重用 - 这是其他人正在做的事情吗?

感谢您的阅读,很抱歉问了这么长的问题。


找到了解决方案

在 R 中,如何在函数内引用本地环境? https://stackoverflow.com/questions/8771942/how-can-i-reference-the-local-environment-within-a-function-in-r

通过插入

localenv <- environment() 

并在 ggplot 中引用它

distribution <- ggplot(data=dat, aes(dat[,var1]),environment = localenv)

一切顺利!即使有网格排列!

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

将绘图保存为 R 对象并在网格中显示 的相关文章

  • 将数据框中的变量强制为适当的格式

    我正在处理一个由多种不同数据类型 数字 字符 时间戳 组成的数据帧 但不幸的是它们都作为字符接收 因此 我需要动态且尽可能高效地将它们强制转换为 适当 的格式 考虑以下示例 df lt data frame val1 c 1 2 3 4 v
  • 计算一行中某些单元格中有多少个值不为 NA(在 R 中)

    我有一个包含很多列的数据框 对于数据帧的每一行 我想计算有多少列是 NA 的 问题是我只对其中的几列感兴趣 并且想要 有效地 调用这些列 按照我在下面的假样本中所做的方式使用 mutate 给了我正确的答案 library stringr
  • 如何在ggplot2中制作x轴和y轴之间的间隙和突出的刻度线

    如何创建以下样式的图表 注意 x y 轴 红色圆圈 和 x y 轴上突出的刻度 箭头 之间的间隙 我现在最多能做的是 library ggplot2 p lt ggplot mpg aes class hwy geom boxplot th
  • 使用 dplyr 计算组平均值,同时排除当前观察值

    Using dplyr 最好 我试图计算每个观察值的组平均值 同时从组中排除该观察值 看来这应该可以通过组合来实现rowwise and group by 但这两个功能不能同时使用 给定这个数据框 df lt data frame grou
  • 在 R 中管理元数据的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 在分析数据时 有关变量的元数据极其重要 您如何在 R 中管理这些信息 例如 有没有办法指定将打印的标签而不是变量名称 R中有哪些工具可以实现这一点 我想到的快速建议是 将数据与对象一起存储的属性 正如 Frank
  • 从组成员数据创建加权图

    假设我有一个 R 数据集 指示组内的个体 这是一个例子 grp lt c 1 1 1 2 2 2 2 3 3 3 4 4 4 5 5 ind lt c A C D B C D E A D E B F E A F data frame grp
  • 是否可以替换 php 中的函数(例如邮件)并使其执行其他操作?

    我想用 PHP 重写一个函数 比如说 mail 函数 并且希望从现在开始调用 mail 时 它将加载我的 mail 版本而不是默认的 php 版本 这在 php 中可能吗 我想这样做的原因是因为我有数千行调用 mail 的代码 并且我不想重
  • R文本文件和文本挖掘...如何加载数据

    我正在使用 R 包tm我想做一些文本挖掘 这是一个文档 被视为一个词袋 我不明白有关如何加载文本文件并创建必要的对象以开始使用诸如 之类的功能的文档 stemDocument x language map IETF Language x 所
  • R ggplot2 比例 alpha 离散以显示在图例中

    我正在尝试绘制两个因素 压力和性别 的图 并使用 alpha 值来传达性别 这是我的代码和结果图 ggplot subset df zfish data overall long day day 01 measure distance fr
  • 使用函数保存 ggplot

    我想创建一个函数来保存绘图 来自ggplot 这是一个数据框 creating data frame music lt c Blues Hip hop Jazz Metal Rock number lt c 8 7 4 6 11 df mu
  • 如何制作 POSIXct 的空向量

    我想制作一个空向量POSIXct这样我就可以放一个POSIXct in it vec lt vector POSIXct 10 vec vec 1 lt 2014 10 27 18 11 36 PDT vec 那是行不通的 有任何想法吗 由
  • 如何使用 formattable 折叠表中的行值组?

    我有兴趣使用以下领域的工具formattableR 包 但我只想在表中显示有更改的地方 也就是说 我想要在kableExtra包通过collapse rows 功能 例如 使用kable and kableExtra 我可以做这个 libr
  • 在 Vim 的 `autocmd` 命令中调用函数

    我想使用expand函数在一个autocmd 特别是 我正在改编tip https stackoverflow com questions 1240037 recommended build system for latex 1394702
  • 如何在 purrr::map_df 之后使用映射向量添加列

    我使用 mtcars 数据集作为示例来说明我的问题 我对每种气缸类型进行了线性回归 并使用 map df 将所有模型结果放在一起 下面的代码和输出 我想要做的是添加另一列名为 圆柱体 4 4 6 6 8 8 我怎样才能在map df中做到这
  • 如何强制geom_point在R中显示比例大小?

    我的数据如下 抱歉有点大 test dput 我还有一个绘制这些数据的代码 这里的问题是它没有给我比例大小read counts value多变的 我怎样才能解决这个问题 谢谢 my code p ggplot test dput aes
  • 润滑mdy功能

    我正在尝试转换以下内容 但对其中一个日期 1 没有成功 4 2 10 变为 0010 04 02 有办法纠正这个问题吗 谢谢 维韦克 data lt data frame initialDiagnose c 4 2 10 14 01 200
  • Python 是否有相当于 R 的sample() 函数?

    我想知道Python是否有相当于sample R 中的函数 The sample https stat ethz ch R manual R devel library base html sample html函数使用带替换或不带替换的方
  • 按字符分隔字段中的变量

    我最近问了这个问题单独的字段内容 https stackoverflow com questions 53309849 separate contents of field并得到了一个非常快速且非常简单的答案 我在 Excel 中可以简单地
  • wordpressfunctions.php - 为每个帖子类别使用不同的页面模板

    我想连接到 save post 函数 找出帖子所属的类别 然后为每个类别中的帖子分配不同的页面模板 我已经尝试了大约 30 个不同的版本 但都没有成功 有人可以帮我指出正确的方向吗 add action save post assign c
  • 就地改变 numpy 函数输出数组

    我正在尝试编写一个对数组执行数学运算并返回结果的函数 一个简化的例子可以是 def original func A return A 1 A 1 为了加速并避免为每个函数调用分配新的输出数组 我希望将输出数组作为参数 并就地更改它 def

随机推荐

  • hg unshelve 好像没有效果?

    我们的团队刚刚开始使用 Mercurial 我们首先开始玩的事情之一是hg shelve 在本地 我可以毫无问题地搁置更改 据我所知 一切都很完美 但是 当我尝试取消搁置时 我得到了restoring backup files消息 但是当我
  • 5 位 zip 或空的正则表达式

    我有这个正则表达式来检查 5 位数字 d 5 我如何更改它 以便它对于空字符串也返回 true 将其封装在 并添加一个 使整个模式可选 实际上 您要么匹配 d 5 OR 空字符串 var regex d 5 console log rege
  • CakePHP:是否可以插入具有预定义主键值的记录?

    我有一个 CakePHP 模型 用户 与外部公司系统有联系 我在这些系统上存储一些数据 在本地存储其他数据 在我的User beforeSave 方法 我尝试设置一个 ID 将数据 使用该自定义 ID 发送到我的公司系统 然后 如果它在那里
  • QMediaPlayer 在 Ubuntu 16.04 / Qt 5.6 上不播放任何内容

    我在 Ubuntu 16 04 上使用官方 Qt 5 6 SDK 当我尝试播放 mp3 文件时 我得到 defaultServiceProvider requestService no service found for org qt pr
  • 如何维护selected的选择顺序并按选择的顺序传递值

    div em em div
  • 程序集必须在隔离错误中注册

    我正在尝试将自定义工作流程活动加载到 crm 服务器上 我将项目加载到服务器上并一直使用CRM插件注册工具 服务器是CRM2011 因此支持 NET 4 0活动 但是 当我按下 注册 按钮 程序集成功加载到工具后 时 会发生以下错误 Unh
  • 如何向 OxyPlot 添加新点?

    这是 Oxyplot 官方页面显示的代码 命名空间 WpfApplication2 using System Collections Generic using OxyPlot public class MainViewModel publ
  • 将静态 iOS 框架链接到应用程序和 XCTest 目标时出错

    我有一个结合了 Objective C 和 Swift 的应用程序 它有一个 XCTest 目标 我有一个用 Objective C 编写的静态框架 它链接到主目标并由主目标和测试目标使用 我测试了 3 种不同的情况 其中两种情况可以编译但
  • 安全的Javascript加密库?

    我正在搜索一个提供安全加密的 JavaScript 库 客户端必须生成密钥 所有上传到服务器的数据都被加密 所有下载的数据都被解密 我需要一个经过身份验证的加密方案 仅 CTR 或 CBC 是不够的 我听说过 sjcl 但似乎 sjcl 只
  • 重复序列化和反序列化会创建重复的项目

    大家好 我的 json 序列化有问题 我正在 Unity 下使用 Json NET 包 我正在寻找一个数据库 该数据库可在我的应用程序上编辑 并通过 wwwForm 和 php 文件存储在我的服务器上 我可以毫无问题地创建它并将其推到网上
  • 使用 PHP 解析 HTML 并获取 h2 之后的下一个 h2 之前的所有 h3

    我正在寻找文章中的第一个 h2 找到后 查找所有 h3 直到找到下一个 h2 冲洗并重复 直到找到所有标题和副标题 在您立即将此问题标记或关闭为重复解析问题之前 请注意问题标题 至于这与基本节点检索无关 我已经把那部分记了下来 我在用DOM
  • 是否可以在Lua中模拟bind?

    给定一个只有一个参数的lua函数 是否可以将此参数绑定到一个固定值以获得一个没有参数的函数 更一般地说 如何将 lua 函数的某些输入参数绑定到某些值 是的 这几乎可以用任何具有一流值函数的语言来完成 function f1 a retur
  • 如何迭代多个json字典来检查相同类型key的值?

    我希望能够在多个 json 字典中获取 delta 的值 如果有什么改变的话 我正在使用 kivy 的 JsonStore 当我按下启动 check streak 函数的按钮时 我得到 NameError name delta is not
  • 从 Nodejs 脚本获取 Microsoft GRAPH 访问令牌

    这个问题建立在如何从 Node 脚本获取 Microsoft Graph API 访问令牌 https stackoverflow com questions 50613628 how to get microsoft graph api
  • 如何在Python交互模式下撤消True = False? [复制]

    这个问题在这里已经有答案了 所以我尝试了内德 戴利在他的回答中提到的 邪恶 的事情here https stackoverflow com questions 12765833 counting the number of true boo
  • 为什么我的 if 条件不接受 java 中的整数?

    目前我正在使用 int a 10 if a 20 printf TRUE else printf false 以 C 语言打印值TRUE 但如果是java int a 10 if a 20 System out println TRUE e
  • HttpSelfHostServer 和 HttpContext.Current

    我正在开发一个自托管 ASP NET Web api 应用程序 一切都很好 但现在我很挣扎HttpContext 我需要保存客户端的会话信息 但HttpContext Current始终为空 所以很明显我的HttpSelfHostServe
  • xlCellTypeLastCell 给出错误的值

    我很难从中获得准确的值SpecialCells xlCellTypeLastCell 在 Excel VBA 中 以下代码应输出 TrackedItems 工作表中第一个空行的行号 该工作表有 8 行 但代码输出 25 应输出 9 empt
  • 如何让Arduino在每天规定的时间执行某项任务?

    我是一名学生 而且是 Arduino 的新手 我正在尝试做一个自动植物浇水系统每天给植物浇水两次 有没有办法让Arduino在每天规定的时间准确执行任务 然后将其设置为睡眠模式 每天正好在规定的时间 如果您的 Arduino 采用内部 RC
  • 将绘图保存为 R 对象并在网格中显示

    在下面的可重现示例中 我尝试为 ggplot 分布图创建一个函数并将其保存为 R 对象 目的是在网格中显示两个图 ggplothist lt function dat var1 if is character var1 var1 lt wh