将 R 中的绘图保存为 GIF

2023-11-27

在R中,我使用函数savePlot将图形保存到图像文件中。但我的同事只能打开 .jpg 和 .gif(可能是因为他正在度假,正在用手机阅读电子邮件)。我讨厌创建 jpeg,因为尤其是箱线图看起来非常丑陋(胡须模糊等)。但是savePlot函数仅支持以下类型:

type = c("wmf", "emf", "png", "jpg", "jpeg", "bmp",
                  "tif", "tiff", "ps", "eps", "pdf")

如何在 R 中保存 GIF 格式的图?

编辑:如果可能,理想的解决方案应该在不安装 ImageMagick 的情况下工作(以便 R 脚本易于移植)。


R 没有本机 GIF 图形驱动程序,主要(完全?)由于 GIF 格式的专利负担:请参阅http://tolstoy.newcastle.edu.au/R/help/05/02/12809.html .

里面有一个函数caTools包裹 (write.gif())但它是专门为写入图像而设计的。如果你想使用它,你必须先做一些 hacky 将你的绘图转换为图像(例如保存为 PNG,然后将其读回 R 作为图像)。例如:

png("myPlot.png")
plot(rnorm(1000),rnorm(1000))
dev.off()
library(png)
P1 <- readPNG("myPlot.png")
library(caTools)
write.gif(P1,"myPlot.gif")
showGIF <- function(fn) system(paste("display",fn))
showGIF("myPlot.gif")
unlink("myPlot.gif")  ## clean up

?write.gif()有很多关于颜色索引的内容我没有读过,但这对于更复杂的图表可能很重要......

The animation包有一个saveGIF()函数来保存 GIF,但是(1)它是为保存多帧动画(不是一般图形)而设计的,(2)它是通过调用 ImageMagick 来实现的。

自己构建该函数会更容易。

  • 安装 ImageMagick (http://imagemagick.org)
  • 保存为PNG,然后使用ImageMagick 进行转换。

例如:

png("myPlot.png")
plot(rnorm(1000),rnorm(1000))
dev.off()
system("convert myPlot.png myPlot.gif")
unlink("myPlot.png") ## clean up
showGIF("myPlot.gif")
unlink("myPlot.gif") ## clean up

当然,如果您想经常使用它们,您可以在函数中使用其中任何一个。

UPDATE:我花了更长的时间来尝试获得纯 R 解决方案,但还没有有效的解决方案。欢迎提出建议或修改...

## needs ImageMagick: just for testing ...
showGIF <- function(fn) system(paste("display",fn))

主要功能:

saveGIF <- function(fn,verbose=FALSE,debug=FALSE) {
    require(png)
    require(caTools)
    tmpfn <- tempfile()
    on.exit(unlink(tmpfn))
    savePlot(tmpfn,type="png")
    P1 <- readPNG(tmpfn)
    dd <- dim(P1)
    P1 <- aperm(P1,c(3,1,2),resize=TRUE)  ## P1[,1,15]
    dim(P1) <- c(dd[3],prod(dd[1:2]))
    P1 <- t(P1)
    if (verbose) cat("finding unique colours ...\n")
    P1u <- unique(P1)
    rgbMat <- function(x) {
        rgb(x[,1],x[,2],x[,3])
    }
    if (verbose) cat("creating colour index ...\n")
    pp <- paste(P1[,1],P1[,2],P1[,3],sep=".")
    ## make sure factor is correctly ordered
    ind <- as.numeric(factor(pp,levels=unique(pp))) 
    if (verbose) cat("finding colour palette ...\n")
    if (nrow(P1u)>256) {
        if (verbose) cat("kmeans clustering ...\n")
        kk <- kmeans(P1u,centers=256)
        ind <- kk$cluster[ind]
        pal <- rgbMat(kk$centers)
    } else {
        pal <- rgbMat(P1u)
    }
    ## test:
    if (debug) {
        dev.new()
        par(mar=rep(0,4))
        image(t(matrix(ind-1,nrow=dd[1])),col=pal,axes=FALSE,ann=FALSE)
    }
    if (verbose) cat("writing GIF ...\n")
    indmat <- matrix(ind-1,nrow=dd[1])
    storage.mode(indmat) <- "integer"
    write.gif(indmat,fn,col=as.list(pal),scale="never")
}


X11.options(antialias="none")
image(matrix(1:64,nrow=8),col=rainbow(10))
saveGIF("tmp.gif",verbose=TRUE,debug=TRUE)
showGIF("tmp.gif")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 R 中的绘图保存为 GIF 的相关文章

  • 如何在R中删除重复项

    我有一个非常大的数据集 如下所示 df lt data frame school c a a a b b c c c year c 3 3 1 4 2 4 3 1 GPA c 4 4 4 3 3 3 2 2 school year GPA
  • 如何在 ggplot 中保持配色方案,同时删除每个图中未使用的级别?

    我想比较一个图中的数据的一些子组和另一图中的一些其他子组 如果我绘制一个图 其中绘制了所有子组 那么这个数字将是巨大的 并且每个单独的比较都会变得困难 我认为如果给定的子组在所有图中都具有相同的颜色 这对读者来说会更有意义 这是我尝试过的两
  • LDA with topicmodels,如何查看不同文档属于哪些主题?

    我正在使用 topicmodels 包中的 LDA 我已经在大约 30 000 个文档上运行它 获取了 30 个主题 并获得了主题的前 10 个单词 它们看起来非常好 但我想看看哪些文档属于哪个主题的概率最高 我该怎么做 myCorpus
  • 绘制到图像对象

    我可以保存一个图imshow 因为它返回一个图像对象 如下所示 image plt imshow list interpolation None 后来我想创建其中许多图像的动画 将其保存在列表中并将其渲染为视频 如果这种方法很愚蠢 请告诉我
  • 使用 broom 和 tidyverse 总结 r 平方游戏

    我发布了一个问题here https stackoverflow com questions 48627287 getting adjusted r squared value for each line in a geom smooth
  • Java - 调整图像大小而不损失质量

    我有 10 000 张照片需要调整大小 因此我有一个 Java 程序来执行此操作 不幸的是 图像的质量损失很大 而且我无法访问未压缩的图像 import java awt Graphics import java awt AlphaComp
  • 在 R 中向散点图添加线条

    如何向图表添加线条 我做了以下 dat lt data frame xvar 1 20 rnorm 20 sd 10 yvar 1 20 rnorm 20 sd 10 zvar 1 20 rnorm 20 sd 10 plot dat 1
  • R - Plm 和 lm - 固定效应

    我有一个平衡面板数据集 df 本质上由三个变量组成 A B and Y 对于一堆独特识别的区域来说 它会随着时间的推移而变化 我想运行一个回归 其中包括区域 下面等式中的区域 和时间 年份 固定效应 如果我没记错的话 我可以通过不同的方式来
  • 找到图像特征宽度的正确方法和Python包

    输入是一个在黑色背景上带有彩色 抱歉 垂直线的光谱 给定该带的近似 x 坐标 用 X 标记 我想找到该带的宽度 我对图像处理不熟悉 请引导我前往正确的方法图像处理和Python图像处理package也能起到同样的作用 我认为 PIL Ope
  • 将数据框中的每个 x 个字符拆分为字符串

    我知道这里有一些关于每隔一段时间分割一个字符串的答案nth字符 例如this one https stackoverflow com questions 23208490 split each character in r and this
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • Dendextend:关于如何根据定义的组为树状图的标签着色

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

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

    我在名为 analysis r 的文件中有一些 R 代码 我希望能够从命令行 CMD 运行该文件中的代码 而无需通过 R 终端 并且我还希望能够传递参数并在我的代码中使用这些参数 例如就像下面的伪代码 C gt execute r scri
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 朴素贝叶斯分类器仅基于先验概率做出决策

    我试图根据推文的情绪将推文分为三类 买入 持有 卖出 我正在使用 R 和包 e1071 我有两个数据框 一个训练集和一组需要预测情绪的新推文 训练集数据框 text sentiment this stock is a good buy Bu
  • 只读取选定的列

    谁能告诉我如何仅读取下面每年数据的前 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
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use
  • 有效地绘制大时间序列(matplotlib)

    我正在尝试使用 matplotlib 在同一轴上绘制三个时间序列 每个时间序列有 10 6 个数据点 虽然生成图形没有问题 但 PDF 输出很大 在查看器中打开速度非常慢 除了以栅格化格式工作或仅绘制时间序列的子集之外 还有其他方法可以获得

随机推荐

  • SQL中Top和Limit关键字的区别

    一个简单的问题 假设我有以下两个查询 SELECT TOP 2 FROM Persons and SELECT FROM Persons limit 2 我想知道上面2个查询的执行有什么区别 基本上 我想知道什么时候应该使用limit关键字
  • 拆分/模块化大型 ASP.NET Web 应用程序项目

    我们公司有一个相当大的 ASP NET Web 应用程序 该应用程序已经分为不同的业务功能 区域 我正在寻找一些策略来将该 Web 应用程序拆分为单独的可构建 可版本控制模块 主要目标是 使我们能够部署仅具有选定功能区域的 Web 应用程序
  • 如何使用 javascript 启用 google chrome chrome://flags/ 值?

    我想使用 JavaScript 启用 google chrome 标志启用 如果启用标志则无需执行任何操作 如果禁用则启用它 当地国家文件包含标志的设置 这是json格式的文本文件 Chrome 用户目录位置 browser enabled
  • 有没有办法在 Windows Phone 8 中等待 IAsyncResult?

    我该如何使用await在 Windows Phone 8 中使用 HttpWebRequest 有没有办法让 IAsyncResult 的东西与等待一起工作 private async Task
  • Node.js - 侦听器必须是函数错误

    我正在尝试将接受的答案转换为 如何在node js中创建一个简单的http代理 从 http 到 https 当我尝试从浏览器访问代理时 服务器退出并抛出此错误 events js 171 throw TypeError listener
  • 隐藏 WPF 窗口直到完全加载

    对于我的 WPF 应用程序 我存储了多个用户设置 例如窗口位置 窗口状态以及是否显示欢迎对话框 问题是 当所有内容都加载时 我在加载窗口时看到大量闪烁 然后在读取设置后最大化窗口时看到更多闪烁 我已经在使用内置的 WPF PNG 启动画面功
  • 在 selenium 2 测试中可视化/显示鼠标光标位置(例如 PHPUnit Webdriver)

    我在跑步 PHPUnit Extensions Selenium2TestCase运行移动鼠标并单击的测试 this gt moveto 为了改善调试和查看体验 我想查看鼠标光标当前所在的位置 使用上述方法不会移动系统鼠标光标 这是 Jor
  • 字体很棒,显示亚洲标志而不是图标

    我正在尝试使用 Font Awesome 但它只显示任何亚洲标志 而不是任何图标 为此 我通过网络服务器下载了很棒的字体 我在 3 个不同的浏览器 firefox opera 和 chromium 中尝试过 但结果总是一样 测试页面可以在这
  • fopen() 无法打开流:权限被拒绝,但权限应该有效

    所以 我有这个错误 Warning fopen path to test in txt function fopen failed to open stream Permission denied 表演ls l在目录中test in txt
  • 更改所有文本视图的字体

    有没有办法更改布局中所有文本视图的字体 目前我正在使用它来手动更改字体 TextView txtAppName TextView findViewById R id txtAppName Typeface tf Typeface creat
  • 当函数引用对象(并访问非 const 方法)时,如何摆脱 const 性?

    我有一份想要保护的数据的备份副本 所以我制作了它const 我需要违反这一点const两次 一次将原始数据存储到其中 fgBlocks CopyInto BlkArray backUpCopy w r t result CopyInto B
  • 如何在插件中使用 LINQ 更新 CRM 2011 实体?

    我们可以毫无问题地创建新实体 但更新插件中的现有实体似乎不起作用 这是针对 CRM 2011 的 var crmContext new CustomCrmContext service var contact crmContext Cont
  • 如何隐藏/删除 Flutter 应用上的标题栏?

    如何删除颤振栏上的标题栏 displayMap mapView show new MapOptions mapViewType MapViewType normal initialCameraPosition new CameraPosit
  • 不抛出或异常?

    我是一名学生 对 C 的了解很少 我试图扩展它 这更多的是一个哲学问题 我并不是想实现一些东西 Since include
  • JaCoCo gradle 插件排除

    我想从 JaCoCo 中排除一些类 但排除似乎不起作用 例如 我想排除所有以 Ies 结尾的 Java 类 例如 com company EmployeeS 我已经尝试了以下代码 但当我将其推送到声纳 使用 JacocoTestReport
  • 为什么 6.times.map 在 ruby​​ 1.8.7 中工作但在 1.8.6 中不起作用

    以下代码片段在 Mac OS X 上的 1 8 7 中运行良好 但在 Ubuntu 上的 1 8 6 中运行不正常 为什么 有解决方法吗 适用于 1 8 7 ruby version ruby 1 8 7 2009 06 08 patchl
  • Windows 中不同驱动器的 os.getcwd()

    根据http docs python org library os path html 在 Windows 上 每个驱动器都有一个当前目录 这在我使用时给我带来了一些麻烦os getcwd 在 Windows 上 我在 C 驱动器上使用 P
  • 为什么 sys.getsizeof 为较小的列表报告较大的值?

    我不明白当两个列表都像文字一样创建时 sizeof 的行为有何不同 我希望第二个 sizeof 的输出等于或小于第一个 sizeof 的输出 而不是更大 gt gt gt sys getsizeof 0 1 2 3 4 5 6 120 gt
  • 如何使 GWT DatePicker 使用星期一作为一周的第一天?

    差不多 如标题所说 我需要使 GWT DatePicker 组件使用星期一作为一周的第一天 目前日期标签是S M T W T F S 我希望它是M T W T F S S 有什么办法可以实现吗 如果自动区域设置检测不符合您的需求 并且可能编
  • 将 R 中的绘图保存为 GIF

    在R中 我使用函数savePlot将图形保存到图像文件中 但我的同事只能打开 jpg 和 gif 可能是因为他正在度假 正在用手机阅读电子邮件 我讨厌创建 jpeg 因为尤其是箱线图看起来非常丑陋 胡须模糊等 但是savePlot函数仅支持