如何使用R语言的Plotly包绘制球体并整合至已有3D散点图?
如何在R的Plotly 3D散点图中添加3D线框球体?
你目前已经基于mtcars数据集做出了3D散点图,但只能实现2D圆形效果,想要添加真正的3D线框球体对吧?其实Plotly R包没有直接的add_sphere()函数,但我们可以通过生成球体的三维坐标点,再用网格或线条的方式把它绘制出来。下面是具体的实现方案:
步骤1:编写生成球体坐标的函数
首先我们需要一个函数来生成球体表面的三维坐标点,通过球面坐标系到笛卡尔坐标系的转换来实现,你可以控制球体的中心位置、半径以及平滑度(细分点数):
# 生成球体坐标的函数 create_sphere <- function(x0, y0, z0, r, n = 30) { # n 是纬度和经度方向的细分点数,值越大球体越平滑 theta <- seq(0, 2*pi, length.out = n) phi <- seq(0, pi, length.out = n) # 球面坐标转笛卡尔坐标 x <- x0 + r * outer(cos(theta), sin(phi)) y <- y0 + r * outer(sin(theta), sin(phi)) z <- z0 + r * outer(rep(1, n), cos(phi)) # 整理成数据框格式 data.frame( x = as.vector(x), y = as.vector(y), z = as.vector(z) ) }
步骤2:整合到现有Plotly图表中
接下来把这个球体添加到你原来的mtcars 3D散点图里,用add_mesh()来实现带填充的线框效果(或者用add_lines()做纯线条线框):
library(plotly) # 生成球体坐标:中心(2.8, 120, 20),半径0.8(可按需调整大小) sphere_data <- create_sphere(x0 = 2.8, y0 = 120, z0 = 20, r = 0.8, n = 30) # 原有散点图代码 fig <- plot_ly(mtcars, x = ~wt, y = ~hp, z = ~qsec, marker = list(color = ~mpg, colorscale = c('#FFE1A1', '#683531'), showscale = TRUE)) %>% add_markers() %>% layout( scene = list( xaxis = list(title = 'Weight'), yaxis = list(title = 'Gross horsepower'), zaxis = list(title = '1/4 mile time') ), annotations = list( x = 1.13, y = 1.05, text = 'Miles/(US) gallon', xref = 'paper', yref = 'paper', showarrow = FALSE ) ) # 添加3D线框球体(带半透明填充) fig <- fig %>% add_mesh( data = sphere_data, x = ~x, y = ~y, z = ~z, color = "red", opacity = 0.65, line = list(width = 2, color = 'black'), hoverinfo = "none" # 关闭球体悬停提示,避免干扰散点的交互 ) fig
可选:纯线条线框效果
如果想要更简洁的纯线条球体,只需把add_mesh()替换成add_lines():
fig <- fig %>% add_lines( data = sphere_data, x = ~x, y = ~y, z = ~z, color = "red", line = list(width = 2), hoverinfo = "none" )
内容的提问来源于stack exchange,提问作者Volokh
相关产品推荐
相关产品推荐

