Plotly数据可视化:3D图表、发布视图与多视图组合
立即解锁
发布时间: 2025-09-03 01:20:22 阅读量: 3 订阅数: 6 AIGC 

# Plotly 数据可视化:3D 图表、发布视图与多视图组合
## 1. 3D 图表绘制
### 1.1 标记点绘制
在绘制 3D 图表时,只需在 `plot_ly()` 函数中添加 `z` 属性,就能自动渲染 3D 的标记点、线条和路径。这意味着之前在 2D 图表中学习的技巧,在 3D 图表中同样适用。以下是一个简单的示例:
```r
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_markers(color = ~cyl)
```
这个代码会生成一个 3D 散点图,`x` 轴表示城市油耗(`cty`),`y` 轴表示高速油耗(`hwy`),`z` 轴表示气缸数(`cyl`),并且标记点的颜色根据气缸数进行区分。
### 1.2 路径绘制
绘制 3D 路径的方法与 2D 路径类似,使用 `add_paths()` 函数,并添加第三个变量 `z`。示例代码如下:
```r
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_paths(color = ~displ)
```
此代码会根据 `cty`、`hwy` 和 `cyl` 变量绘制 3D 路径,路径颜色根据排量(`displ`)进行插值。
### 1.3 线条绘制
若要确保点按 `x` 轴连接而非按行顺序连接,可以使用 `add_lines()` 函数。示例如下:
```r
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_lines(color = ~displ)
```
同样,也可以通过指定分组变量来创建多条线:
```r
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
group_by(cyl) %>%
add_lines(color = ~displ)
```
### 1.4 坐标轴设置
对于 3D 绘图,坐标轴对象是 `scene` 定义的一部分,而 `scene` 又是 `layout()` 的一部分。若要设置坐标轴标题、坐标轴之间的关系(如 `aspectratio`)或相机的默认设置(如 `camera`),可通过 `scene` 来实现。示例代码如下:
```r
plot_ly(mpg, x = ~cty, y = ~hwy, z = ~cyl) %>%
add_lines(color = ~displ) %>%
layout(
scene = list(
xaxis = list(title = "MPG city"),
yaxis = list(title = "MPG highway"),
zaxis = list(title = "Number of cylinders")
)
)
```
### 1.5 表面绘制
使用 `add_surface()` 函数创建 3D 表面与使用 `add_heatmap()` 函数创建热力图类似。实际上,甚至可以在分类的 `x/y` 轴上创建 3D 表面。但在表面图中,`x/y` 轴应该有合理的顺序,因为 `plotly.js` 会对 `z` 值进行插值。通常,3D 表面是在连续区域上绘制的,如下例展示了如何绘制火山高度的 3D 表面:
```r
x <- seq_len(nrow(volcano)) + 100
y <- seq_len(ncol(volcano)) + 500
plot_ly() %>% add_surface(x = ~x, y = ~y, z = ~volcano)
```
## 2. 发布视图
### 2.1 保存和嵌入 HTML
任何由 `htmlwidgets` 包创建的小部件(如 `plotly`、`leaflet`、`DT` 等)都可以使用 `htmlwidgets::saveWidget()` 函数保存为独立的 HTML 文件。默认情况下,会生成一个完全自包含的 HTML 文件,即所有必要的 JavaScript 和 CSS 依赖文件都会捆绑在 HTML 文件中,方便以单个 HTML 文件的形式共享小部件。不过,可以使用 `partial_bundle()` 函数来减小捆绑文件的大小,它会自动确定一个足以渲染图形的 `plotly.js` 精简版本。示例代码如下:
```r
p <- plot_ly(x = 1:10, y = 1:10) %>% add_markers()
widget_file_size <- function(p) {
d <- tempdir()
withr::with_dir(d, htmlwidgets::saveWidget(p, "index.html"))
f <- file.path(d, "index.html")
mb <- round(file.info(f)$size / 1e6, 3)
message("File is: ", mb," MB")
}
widget_file_size(p)
#> File is: 3.495 MB
widget_file_size(partial_bundle(p))
#> File is: 1.068 MB
```
如果要将多个小部件嵌入到一个较大的 HTML 文档中(如通过 HTML `<iframe>`),不建议使用自包含的 HTML 文件,因为浏览器会反复解析相同的依赖项。可以通过设置 `selfcontained = FALSE` 并指定一个固定的 `libdir` 来将所有依赖文件保存到外部的单个目录中,这样浏览器只需解析一次依赖项,可显著提高响应速度。示例如下:
```r
library(htmlwidgets)
p <- plot_ly(x = rnorm(100))
saveWidget(p, "p1.html", selfcontained = F, libdir = "lib")
saveWidget(p, "p2.html", selfcontained = F, libdir = "lib")
```
若要与他人共享这些 HTML 文件,需确保包含 `libdir` 文件夹,可通过压缩文件的方式实现:
```r
zip("p1.zip", c("p1.html", "lib"))
zip("p2.zip", c("p2.html", "lib"))
```
使用 HTML `<iframe>` 嵌入这些 HTML 文件不仅方便在不同的父文档中重复使用小部件,还能防止父文档中的 JavaScript 和 CSS 对小部件的渲染产生负面影响。推荐使用 `htmltools::tags$iframe()` 来创建 `<iframe>` 标签,这样可以利用 `bookdown` 的图形标题、编号和非 HTML 输出的自动快照功能:
```r
htmltools::tags$iframe(
src = "p1.html",
scrolling = "no",
seamless = "seamless",
frameBorder = "0"
)
```
`widgetframe` 包是一个有助于自动化这种响应式 `iframe` 工作流程的工具,可以查看其 `‘widgetframe and knitr’` 小插曲以了解在 `knitr/rm
0
0
复制全文
相关推荐









