在Shiny运行时的R Markdown中为交互式tmap地图添加图注与引用
在Shiny交互式R Markdown中为tmap添加可引用的图注
当然可以实现!在Shiny运行时的交互式R Markdown里,因为tmap输出的是交互式htmlwidget对象(而非静态图片),普通静态图的引用方式确实不直接生效,但我们可以通过两种可靠的方法来实现类似静态图的图注和交叉引用效果:
方法1:利用Bookdown的Shiny预渲染输出(推荐)
这种方法能自动管理图的编号和交叉引用,和你熟悉的静态图流程最接近,只需要调整文档的输出格式并保持常规的chunk设置即可。
步骤1:调整YAML头部
首先把文档的输出格式改为bookdown::shiny_prerendered,它支持Shiny交互性的同时,保留了Bookdown的交叉引用功能:
--- title: "Interactive Caribou Map Report" output: bookdown::shiny_prerendered: toc: true runtime: shiny ---
步骤2:编写tmap代码块
和静态图一样设置fig.cap选项,knitr会自动把交互式tmap包裹为带图注的<figure>元素:
{r INTERACTIVE-DIST-MAP, echo=FALSE, fig.cap="Interactive map of Caribou distribution in British Columbia", message=FALSE, warning=FALSE} library(tmap) tmap_mode("view") # 切换到交互式模式 # 替换成你的驯鹿分布数据 # 这里用示例数据演示 data("World") tm_shape(World) + tm_polygons("pop_est", legend.title = "Population")
步骤3:在正文中引用
直接用你熟悉的Bookdown交叉引用语法即可,编号会自动生成:
如@ref(fig:INTERACTIVE-DIST-MAP)所示,我们可以直观地查看驯鹿的分布范围。
方法2:手动构建HTML锚点(无需Bookdown)
如果你不想依赖Bookdown,也可以手动给图注添加HTML锚点,然后通过链接引用:
编写tmap代码块
用htmltools::tagList把图注(带锚点ID)和交互式地图组合起来:
{r INTERACTIVE-DIST-MAP, echo=FALSE, message=FALSE, warning=FALSE} library(tmap) library(htmltools) tmap_mode("view") # 生成交互式地图 caribou_map <- tm_shape(World) + tm_polygons() # 构建带锚点的图注和地图容器 tagList( tags::p(id = "fig:INTERACTIVE-DIST-MAP", "*Figure 1:* Interactive map of Caribou distribution in British Columbia"), tags$div(caribou_map, style = "width: 100%; height: 600px;") # 自定义地图尺寸 )
在正文中引用
用HTML链接语法指向锚点ID:
你可以查看Figure 1中的交互式驯鹿分布图。
关键说明
- 为什么静态图的方法不生效?静态图是通过
knitr::include_graphics插入本地图片文件,knitr会自动将其包装为标准的<figure>元素并识别fig.cap;而交互式tmap输出的是动态HTML组件,默认不会被knitr处理为figure,所以需要借助Bookdown的扩展或手动构建HTML结构。 - 如果你用
tmap_leaflet()将tmap转换为Leaflet对象,上述两种方法同样适用,因为Leaflet也是htmlwidgets类型。
内容的提问来源于stack exchange,提问作者BEVAN
相关产品推荐
相关产品推荐

