如何绘制信息丰富的分层曲面图?含rgl/plotly保存与RMarkdown整合问题
我来帮你梳理下rgl和plotly这两个工具的图形保存方法,以及怎么把它们整合到RMarkdown里,刚好我之前也折腾过类似的需求😉
一、rgl 图形的处理:固定视角 + 嵌入RMarkdown
首先解决你头疼的视角问题:其实rgl可以先手动旋转到你觉得最佳的角度,然后用下面的代码把当前视角参数存下来,之后就能一键复用:
# 手动旋转到满意视角后运行 my_best_view <- par3d("userMatrix")
之后再画图时,直接把这个参数传给绘图函数,就能固定住视角:
plot3d(d1, ..., userMatrix = my_best_view)
保存rgl图形
- 静态图:用
rgl.snapshot()存成PNG/JPG位图,或者rgl.postscript()存成PDF/SVG矢量图(适合印刷场景):rgl.snapshot("my_rgl_plot.png") # 快速保存位图 rgl.postscript("my_rgl_plot.pdf", fmt = "pdf") # 高清矢量图 - 交互式网页图:用
writeWebGL()把rgl场景导出为独立HTML,方便分享交互式效果:writeWebGL("rgl_interactive.html", width = 800, height = 600)
整合到RMarkdown
- 嵌入交互式rgl图:在代码块里加上
rgl=TRUE选项,knitr会自动把交互式场景嵌入到HTML输出中(注意PDF输出不支持交互式,只能用静态图):library(rgl) # 加载数据d1,调用保存好的视角参数 plot3d(d1, userMatrix = my_best_view, col = ...) - 嵌入静态rgl图:先在代码块里生成并保存图形,再用
knitr::include_graphics()插入到文档:rgl.snapshot("my_rgl_plot.png") knitr::include_graphics("my_rgl_plot.png")
二、plotly 图形的保存与RMarkdown整合
plotly的交互体验确实省心,自带的配色和图例正好匹配你的需求,处理起来也更简单:
保存plotly图形
- 交互式HTML:用
htmlwidgets::saveWidget()把plotly对象存成独立的交互式HTML文件,还能设置selfcontained=TRUE把所有资源打包到单个文件里:library(plotly) p <- plot_ly(d1, x = ~x, y = ~y, z = ~z, color = ~n, type = "scatter3d") htmlwidgets::saveWidget(p, "plotly_interactive.html", selfcontained = TRUE) - 静态图:两种便捷方式:一是直接在plotly交互界面右上角点击下载按钮,选择PNG/SVG格式;二是用代码导出(需要依赖orca工具,偶尔用的话手动下载更省事):
plotly_image <- as_image(p) write_image(plotly_image, "my_plotly_plot.png")
整合到RMarkdown
plotly在RMarkdown里几乎零配置:直接在代码块里运行绘图代码,HTML输出会自动嵌入交互式图(支持鼠标旋转、缩放),PDF输出会自动转换成清晰的静态图。比如:
library(plotly) # 按n分层绘制3D数据d1的示例代码 p <- plot_ly(d1, x = ~x, y = ~y, z = ~z, color = ~n, type = "scatter3d", mode = "markers", opacity = 0.8) p
如果需要在PDF里输出更高质量的静态图,可以先把plotly图导出为SVG,再用knitr::include_graphics()插入。
三、小总结
- rgl适合处理高性能需求的复杂3D场景,解决视角问题的核心是保存
userMatrix参数,嵌入RMarkdown要注意HTML和PDF的格式差异; - plotly的交互体验和可视化细节更省心,在RMarkdown里兼容性更好,几乎不用额外配置就能得到满意的输出。
内容的提问来源于stack exchange,提问作者jay.sf
相关产品推荐
相关产品推荐

