htmlwidgets 能用来做哪些交互式可视化?

更新时间

htmlwidgets 是 R 的一个框架,用来把 JavaScript 可视化库接入 R。它的核心用法是:用一两行 R 代码生成交互式网页可视化,效果类似 R 的 plot,但输出是可交互的网页组件。这些组件可以在 R 控制台直接使用,也可以嵌入 R Markdown 文档和 Shiny 应用。如果你需要在 R 里做交互式图表、地图或网络图,又不想直接写 JavaScript,htmlwidgets 是主要入口。

它解决什么问题

R 自带的绘图系统输出静态图片。htmlwidgets 把 JavaScript 可视化库封装成 R 函数,让 R 用户用熟悉的语法调用它们,产物是 HTML 组件,能在浏览器里缩放、悬停、筛选。

官方描述的原话是:HTML widgets 的工作方式就像 R 的 plot,只不过它们产生的是交互式网页可视化。一行或两行 R 代码就足以生成一个 D3 图形或 Leaflet 地图。

现成组件覆盖哪些可视化类型

官网 showcase 列出了以下组件,按用途分类:

组件 用途
Leaflet 地理空间映射
dygraphs 时间序列图表
Plotly 基于 D3 的交互式图形
rbokeh Bokeh 的 R 接口
Highcharter Highcharts 的 R 接口
visNetwork 用 vis.js 做图数据可视化
networkD3 用 D3 做图数据可视化
DataTables 表格数据展示
threejs 3D 散点图和地球仪
rglwidget 渲染 rgl 创建的场景
DiagrammeR 图表和流程图
MetricsGraphics 用 D3 做散点图和折线图

官网提到 gallery 中有 50 多个可用组件,showcase 只展示了其中一部分。所以选型时先去 gallery 搜,很可能已有现成封装。

三种使用场景

官网把使用场景分成三类:

  • R 控制台:像调用 plot 一样直接生成组件。
  • R Markdown 文档:把组件嵌入报告,输出 HTML 时保留交互性。
  • Shiny 应用:作为应用中的交互元素。

这三种场景共用同一套组件,不需要为不同输出重写代码。

组合与联动

单个组件之外,htmlwidgets 生态提供了两个组合工具:

  • flexdashboard:把多个 htmlwidgets 组合成仪表盘,支持按行和列灵活指定布局。
  • crosstalk:把多个组件连接起来,目前支持组件间的联动刷选(linked brushing)和客户端筛选。

如果需要更复杂的交互,官网建议使用 Shiny。

自己封装新组件

如果 gallery 里没有你需要的 JavaScript 库,可以用 htmlwidgets 框架为它写一个 R binding,封装后同样能在 R 控制台、R Markdown 和 Shiny 中使用。官网的 Develop 部分提供了创建 widget 的指引,另有 widget 尺寸设置和高级主题文档。

从哪里开始

  • 看效果:访问 showcase,浏览上面列出的组件示例。
  • 找组件:访问 gallery,检索 50 多个可用组件。
  • 学开发:访问 Develop 部分,了解如何为 JavaScript 库写 R 封装。
  • 源码与问题:项目托管在 GitHub。