将绘图保存为 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 对象并在网格中显示 的相关文章

随机推荐

  • 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