R语言:plotly::save_image()导出PDF出现MathJax加载框的解决办法
解决R中plotly导出PDF出现MathJax加载框的问题
当使用plotly::save_image()导出PDF时出现的"Loading [MathJax]/extensions/MathMenu.js"加载框,是因为plotly默认会尝试加载MathJax资源,即使图表中没有数学公式也会触发这个提示。以下是几种可行的解决方法:
方法1:直接在plotly对象中禁用MathJax
通过config()函数关闭MathJax加载,这是最简单直接的方案:
library(plotly) # 4.10.4 library(ggplot2) # 3.4.2 library(reticulate) # 1.40.0 ggp <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() ggply <- ggplotly(ggp) %>% config(mathjax = "none") # 禁用MathJax资源加载 save_image(ggply, file = "myfile.pdf")
mathjax = "none"会阻止plotly发起MathJax的加载请求,从根源上消除加载提示。
方法2:使用webshot2替代save_image导出
如果方法1无效,可以通过webshot2直接对plotly网页组件截图生成PDF,彻底绕过原后端的问题:
首先安装依赖包:
install.packages("webshot2")
然后执行导出代码:
library(plotly) library(ggplot2) library(webshot2) library(htmlwidgets) ggp <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() ggply <- ggplotly(ggp) %>% config(mathjax = "none") # 临时保存为HTML,再转为PDF temp_html <- tempfile(fileext = ".html") saveWidget(ggply, temp_html) webshot(temp_html, "myfile.pdf") file.remove(temp_html) # 清理临时文件
方法3:通过reticulate调用Python端解决方案
由于你加载了reticulate,可以直接操作Python版plotly的Figure对象,关闭MathJax:
library(plotly) library(ggplot2) library(reticulate) # 导入Python的plotly模块 py_plotly <- import("plotly") ggp <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() ggply <- ggplotly(ggp) # 转换为Python的Figure并禁用MathJax py_fig <- to_plotly(ggply, engine = "plotly_py") py_fig$update_layout(mathjax = "none") # 用Python的write_image导出PDF py_plotly$io$write_image(py_fig, "myfile.pdf")
以上三种方法都能有效解决PDF中的MathJax加载框问题,优先推荐方法1,操作最简单。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

