使用 htmlwidget 将交互式绘图保存到路径

Posted

技术标签:

【中文标题】使用 htmlwidget 将交互式绘图保存到路径【英文标题】:saving interactive plotly graph to a path using htmlwidget 【发布时间】:2018-02-08 16:56:15 【问题描述】:

我正在尝试将一些交互式图形保存到额外的文件中。这适用于htmlwidget::saveWidget。但是我将它们保存到不同的文件夹(例如结果文件夹)时会遇到问题。

results_dir <- 'results'
if(!dir.exists(results_dir)) dir.create(results_dir)
p <- plotly::plot_ly(economics, x = ~date, y = ~pop, 
             type = 'scatter', mode = 'markers')
htmlwidgets::saveWidget(p, 
                        file.path(results_dir, 'VSGs.html'))

错误信息是:

normalizePath 中的错误(基本路径,“/”,TRUE): path[1]="results": 没有这样的文件或目录

有人知道发生了什么吗?

我知道之后只是移动文件,但我希望解决此错误消息。

htmlwidgets::saveWidget(p, 'VSGs.html')
file.rename('VSGs.html', file.path(results_dir, 'VSGs.html'))

【问题讨论】:

【参考方案1】:

“结果”似乎不是有效路径 尝试设置存在的文件夹的完整路径。 这应该工作:

dir.create(paste0(getwd(),"/results"))
results_dir = paste0(getwd(),"/results") # get directory

然后使用 results_dir 作为保存路径。

【讨论】:

谢谢,没想到这一点,但是使用全局路径它工作得很好。所以我将保存命令替换为htmlwidgets::saveWidget(p, file.path(getwd(), results_dir, 'VSGs.html')) 我建议设置一个您确定的路径,而不仅仅是工作目录。 要遵循该评论,我的结果目录与我的工作目录相关,这就是为什么我认为这样可以,只有 saveWidget 没有正确执行。对您的代码的另一条评论,最好使用file.path 而不是paste0,因为这也处理了windows 或unix 路径。另外,您在/rsults 中有错字... :-) 不想成为一个聪明人 :-)【参考方案2】:

savewidget from htmlwidget in R , cannot save html file in another folder 中讨论了基本问题并提供了解决方法

TL/DR:使用以下

saveWidgetFix <- function (widget,file,...) 
  ## A wrapper to saveWidget which compensates for arguable BUG in
  ## saveWidget which requires `file` to be in current working
  ## directory.
  wd<-getwd()
  on.exit(setwd(wd))
  outDir<-dirname(file)
  file<-basename(file)
  setwd(outDir);
  saveWidget(widget,file=file,...)

【讨论】:

我在 GitHub 上也收到了您的评论。谢谢。我现在更喜欢用file.path(getwd(), 'outdir', 'widget.html') 创建一个绝对路径,而不是创建一个额外的函数。我不想稍后更改我的代码并删除我的函数,以防万一得到修复。

以上是关于使用 htmlwidget 将交互式绘图保存到路径的主要内容,如果未能解决你的问题,请参考以下文章

如何将绘图保存为磁盘上的图像?

如何保存来自 python 循环的不同名称的多个绘图? [复制]

Linux服务器没有GUI的情况下使用matplotlib绘图

将 pivottablejs 图形保存到文件

iOS开发UI篇—Quartz2D使用(绘图路径)

保存绘图时更改Matplotlib图窗口的分辨率?