R语言画散点图-饼图-折线图-柱状图-箱线图-等高线图-曲线图-热力图-雷达图-韦恩图(三D)

R语言画散点图-饼图-折线图-柱状图-箱线图-等高线图-曲线图-热力图-雷达图-韦恩图(三D)

散点图

可以通过几种不同的方式绘制3D散点图。最常用的工具包括 plotly 包和 scatterplot3d 包

使用 plotly 包

plotly 是一个非常强大的交互式图形包,支持多种3D绘图功能,包括3D散点图

示例

r 复制代码
# 加载plotly包
library(plotly)

# 创建示例数据
set.seed(123)
data <- data.frame(
  x = rnorm(100),
  y = rnorm(100),
  z = rnorm(100)
)

# 绘制3D散点图
fig <- plot_ly(data, x = ~x, y = ~y, z = ~z, type = 'scatter3d', mode = 'markers',
                marker = list(size = 5, color = 'rgb(23, 190, 207)', opacity = 0.8))
fig <- fig %>% layout(title = "3D散点图示例",
                      scene = list(xaxis = list(title = 'X轴'),
                                   yaxis = list(title = 'Y轴'),
                                   zaxis = list(title = 'Z轴')))
fig

解析

  • plot_ly() 函数用于创建散点图对象,type = 'scatter3d' 指定图形类型为散点图
  • layout() 用于设置图表的标题和轴标签
  • 生成的图形可以在Web浏览器中交互查看

效果

使用 scatterplot3d 包

scatterplot3d 包提供了一种简单的方式来创建3D散点图,虽然功能不如 plotly 和 rgl 强大,但对于基本的3D绘图非常有效

示例

确保已安装 scatterplot3d 包:

r 复制代码
install.packages("scatterplot3d")
r 复制代码
# 加载scatterplot3d包
library(scatterplot3d)

# 创建示例数据
set.seed(123)
x <- rnorm(100)
y <- rnorm(100)
z <- rnorm(100)

# 绘制3D散点图
scatterplot3d(x, y, z, color = "red", pch = 16,
               xlab = "X轴", ylab = "Y轴", zlab = "Z轴",
               main = "3D散点图示例")

解析

  • scatterplot3d() 函数用于创建基本的3D散点图
  • color 设置点的颜色,pch 设置点的类型

效果

饼图

使用 plotly 包

plotly 是一个强大的交互式图形包,能够创建各种复杂的图形,包括类似于3D饼图的效果

示例

r 复制代码
# 加载plotly包
library(plotly)

# 创建数据
labels <- c("A", "B", "C", "D")
values <- c(10, 20, 30, 40)

# 绘制3D饼图
fig <- plot_ly(labels = labels, values = values, type = 'pie', 
                hole = 0.3,  # 控制饼图中心空洞的大小
                textinfo = 'label+percent',
                marker = list(colors = c('#FF9999','#66B2FF','#99FF99','#FFCC99')))

fig <- fig %>% layout(title = '3D饼图效果示例',
                      showlegend = TRUE,
                      scene = list(
                        xaxis = list(title = 'X轴'),
                        yaxis = list(title = 'Y轴'),
                        zaxis = list(title = 'Z轴')
                      ))

fig

解析

  • plot_ly() 用于创建饼图对象,type = 'pie' 指定图形类型为饼图
  • hole 参数用于创建一个环形图,这样的效果更接近3D饼图的外观

效果

使用 plotrix 包

示例

r 复制代码
# 加载plotrix包
library(plotrix)

# 创建数据
values <- c(10, 20, 30, 40)
labels <- c("A", "B", "C", "D")
colors <- c("red", "green", "blue", "yellow")

# 绘制3D饼图
pie3D(values, labels = labels, col = colors, explode = 0.1,
      main = "3D饼图示例", radius = 0.9)

解析

  • pie3D() 函数用于创建类似3D的饼图效果,虽然它不是完全的3D图形,但通过阴影和爆炸效果模拟了3D外观

效果

折线图

绘制 3D 折线图可以使用 plotly 或 rgl 等包。plotly 提供了直观的 3D 绘图功能,适合用于交互式图形,而 rgl 则适合用于需要更详细定制的 3D 图形

使用 plotly 包

示例

r 复制代码
# 加载 plotly 包
library(plotly)

# 创建数据
x <- seq(1, 10, length.out = 100)
y <- sin(x)
z <- cos(x)

# 绘制 3D 折线图
fig <- plot_ly(x = x, y = y, z = z, type = 'scatter3d', mode = 'lines+markers')

# 添加标题和标签
fig <- fig %>% layout(
  title = '3D 折线图示例',
  scene = list(
    xaxis = list(title = 'X 轴'),
    yaxis = list(title = 'Y 轴'),
    zaxis = list(title = 'Z 轴')
  )
)

fig

解析

1. 创建数据:

  • x:自变量序列
  • y 和 z:因变量序列,分别对应 sin(x) 和 cos(x)

2. 绘制 3D 折线图:

  • plot_ly() 函数创建3D 折线图,type = 'scatter3d' 指定 3D 散点图(包含折线),mode = 'lines+markers' 指定显示折线和标记点

3. 设置图形属性:

  • layout() 函数设置图形的标题和坐标轴标签。

效果

使用 rgl 包

示例

r 复制代码
# 加载 rgl 包
library(rgl)

# 创建数据
x <- seq(1, 10, length.out = 100)
y <- sin(x)
z <- cos(x)

# 绘制 3D 折线图
plot3d(x, y, z, type = 'l', col = 'blue', lwd = 2, xlab = 'X 轴', ylab = 'Y 轴', zlab = 'Z 轴')

# 添加标题
title3d(main = '3D 折线图示例')

# 设置视角
rgl.viewpoint(theta = 45, phi = 30)

解析

1. 创建数据:

  • x、y 和 z 为 3D 数据的坐标

2. 绘制 3D 折线图:

  • plot3d() 函数绘制 3D 折线图,type = 'l' 指定绘制线条,col 设置颜色,lwd 设置线宽

3. 设置图形属性:

  • title3d() 函数设置图形标题
  • rgl.viewpoint() 设置视角以获得更好的 3D 视图效果

效果

柱状图

示例

r 复制代码
# 加载 rgl 包
library(rgl)

# 创建数据
x <- c(1, 2, 3, 4)
y <- c(1, 2, 3, 4)
heights <- c(10, 20, 15, 25)

# 绘制 3D 柱状图
for (i in seq_along(x)) {
  x_pos <- x[i]
  y_pos <- y[i]
  z_height <- heights[i]
  
  # 生成柱状体的顶点
  x_corners <- c(x_pos - 0.5, x_pos + 0.5, x_pos + 0.5, x_pos - 0.5)
  y_corners <- c(y_pos - 0.5, y_pos - 0.5, y_pos + 0.5, y_pos + 0.5)
  z_corners <- c(0, 0, 0, 0)
  
  # 绘制柱状体
  rgl::polygon3d(x_corners, y_corners, z_corners, col = 'blue', alpha = 0.6)
  rgl::polygon3d(x_corners, y_corners, z_corners + z_height, col = 'red', alpha = 0.6)
  
  # 绘制柱状体的侧面
  rgl::polygon3d(c(x_corners[1], x_corners[2], x_corners[2], x_corners[1]), 
                 c(y_corners[1], y_corners[1], y_corners[2], y_corners[2]),
                 c(0, 0, z_height, z_height), 
                 col = 'grey', alpha = 0.5)
}

# 设置视角和轴
rgl::rgl.viewpoint(theta = 45, phi = 30)
rgl::axes3d()
rgl::title3d(main = '3D 柱状图示例')

# 使图形窗口保持打开状态
rgl::rglwidget()

解析

1. 创建数据:

  • x 和 y 是柱状图的坐标位置
  • heights 是柱状图的高度

2. 使用 rgl:

  • polygon3d() 函数绘制柱状体的底面、顶部和侧面
  • rgl.viewpoint() 设置视角以获得更好的 3D 视图效果
  • rglwidget() 保持图形窗口打开状态,以便进行交互查看

效果

箱线图

示例

r 复制代码
library(rgl)

# 生成一些示例数据
set.seed(123)
data <- matrix(rnorm(300), ncol = 3)

# 定义一个函数来绘制一个箱线图的长方体
draw_box <- function(x, y, z, width, height, depth, col = "blue") {
  # 绘制箱子的底面
  quads3d(x + c(-width/2, width/2, width/2, -width/2),
          y + c(-height/2, -height/2, height/2, height/2),
          z + rep(-depth/2, 4),
          col = col, alpha = 0.5)
  # 绘制箱子的顶面
  quads3d(x + c(-width/2, width/2, width/2, -width/2),
          y + c(-height/2, -height/2, height/2, height/2),
          z + rep(depth/2, 4),
          col = col, alpha = 0.5)
  # 绘制箱子的侧面
  quads3d(x + c(-width/2, width/2, width/2, -width/2),
          y + c(-height/2, -height/2, -height/2, -height/2),
          z + c(-depth/2, -depth/2, depth/2, depth/2),
          col = col, alpha = 0.5)
  quads3d(x + c(-width/2, width/2, width/2, -width/2),
          y + c(height/2, height/2, height/2, height/2),
          z + c(-depth/2, -depth/2, depth/2, depth/2),
          col = col, alpha = 0.5)
  quads3d(x + c(-width/2, width/2, width/2, -width/2),
          y + c(-height/2, height/2, height/2, -height/2),
          z + c(-depth/2, -depth/2, -depth/2, -depth/2),
          col = col, alpha = 0.5)
  quads3d(x + c(-width/2, width/2, width/2, -width/2),
          y + c(-height/2, height/2, height/2, -height/2),
          z + c(depth/2, depth/2, depth/2, depth/2),
          col = col, alpha = 0.5)
}

# 创建一个 3D 窗口
open3d()

# 绘制几个 3D 箱线图长方体
for (i in 1:ncol(data)) {
  # 计算长方体的边界
  q1 <- quantile(data[, i], 0.25)
  q3 <- quantile(data[, i], 0.75)
  median <- median(data[, i])
  lower <- min(data[, i])
  upper <- max(data[, i])
  
  # 绘制长方体
  draw_box(x = i, y = median, z = 0, width = 0.5, height = q3 - q1, depth = 1,
           col = "blue")
}

# 添加坐标轴标签
axes3d()
title3d(main = "3D Boxplot", xlab = "Sample", ylab = "Value", zlab = "Depth")

解析

  • draw_box 函数创建了一个 3D 长方体,模拟箱线图的外观
  • 使用 quads3d 函数绘制长方体的各个面
  • 对于每个数据列,计算了四分位数和中位数,并在 3D 空间中绘制了长方体

效果

直方图

示例

r 复制代码
# 安装和加载必要的包
install.packages("rgl")
library(rgl)

# 生成示例数据
set.seed(123)
data <- matrix(rnorm(1000), ncol = 10)  # 10组数据,每组100个数据点

# 计算每组数据的频数
hist_data <- apply(data, 2, function(x) hist(x, breaks = 10, plot = FALSE))

# 清空之前的图形
open3d()

# 设定颜色
colors <- rainbow(length(hist_data))

# 绘制3D直方图
for (i in 1:length(hist_data)) {
  for (j in 1:(length(hist_data[[i]]$breaks) - 1)) {
    x0 <- hist_data[[i]]$breaks[j]    # 柱体底边左端
    x1 <- hist_data[[i]]$breaks[j + 1] # 柱体底边右端
    y0 <- i - 0.5                       # 柱体底边在Y轴上的位置
    y1 <- i + 0.5                       # 柱体顶边在Y轴上的位置
    z0 <- 0                            # 柱体底边的Z坐标
    z1 <- hist_data[[i]]$counts[j]    # 柱体顶边的Z坐标

    # 绘制底面
    quads3d(
      x = c(x0, x0, x1, x1), 
      y = c(y0, y1, y1, y0), 
      z = rep(z0, 4), 
      col = colors[i], 
      alpha = 0.5
    )

    # 绘制顶面
    quads3d(
      x = c(x0, x0, x1, x1), 
      y = c(y0, y1, y1, y0), 
      z = rep(z1, 4), 
      col = colors[i], 
      alpha = 0.5
    )

    # 绘制侧面
    quads3d(
      x = c(x0, x0, x0, x0), 
      y = c(y0, y1, y1, y0), 
      z = c(z0, z0, z1, z1), 
      col = colors[i], 
      alpha = 0.5
    )
    
    quads3d(
      x = c(x1, x1, x1, x1), 
      y = c(y0, y1, y1, y0), 
      z = c(z0, z0, z1, z1), 
      col = colors[i], 
      alpha = 0.5
    )
  }
}

# 添加坐标轴和标题
axes3d(edges = "bbox", xlab = "Value", ylab = "Group", zlab = "Frequency", box = TRUE)
title3d("3D Histogram", xlab = "Value", ylab = "Group", zlab = "Frequency")

解析

1. 坐标轴: 使用 axes3d 函数绘制坐标轴和标签,edges = "bbox" 表示显示边界框的坐标轴
2. 柱体: 每个柱体的底面、顶面和侧面都用 quads3d 绘制
3. 颜色: 使用 rainbow 函数生成颜色,并将其应用于每组数据的柱体

效果

等高线图

使用 plotly 包(方式1)

示例

r 复制代码
# 安装和加载必要的包
install.packages("plotly")
library(plotly)

# 生成示例数据
n <- 50
x <- seq(-10, 10, length.out = n)
y <- seq(-10, 10, length.out = n)
z <- outer(x, y, function(x, y) sin(sqrt(x^2 + y^2)))

# 绘制3D等高线图
plot_ly(z = ~z, x = ~x, y = ~y, type = "surface") %>%
  layout(title = "3D Terrain Plot",
         scene = list(
           xaxis = list(title = "X"),
           yaxis = list(title = "Y"),
           zaxis = list(title = "Z")
         ))

解析

  • plot_ly 函数用于绘制图形,type = "surface" 指定绘制3D等高线图
  • layout 函数用于设置图形的标题和坐标轴标签

效果

使用 plotly 包(方式2)

示例

r 复制代码
library(plotly)

# 生成示例数据
set.seed(123)
x <- rnorm(100)
y <- rnorm(100)
z <- rnorm(100)

# 创建等高线图数据
x_bins <- seq(min(x), max(x), length.out = 10)
y_bins <- seq(min(y), max(y), length.out = 10)
x_cut <- cut(x, breaks = x_bins)
y_cut <- cut(y, breaks = y_bins)

# 计算每个箱子中的数据量
hist_data <- table(x_cut, y_cut)

# 转换为矩阵格式
z_data <- as.matrix(hist_data)

# 绘制3D直方图
plot_ly(
  z = z_data,
  type = 'surface',
  colorscale = list(c(0, 1), c('blue', 'red')),
  colorbar = list(title = 'Count')
) %>%
  layout(
    title = "3D Histogram",
    scene = list(
      xaxis = list(title = 'X'),
      yaxis = list(title = 'Y'),
      zaxis = list(title = 'Count')
    )
  )

解析

1. 生成数据:

  • 生成 x, y, z 随机数据

2. 计算直方图数据:

  • 使用 cut 将 x 和 y 数据分箱
  • 使用 table 计算每个箱子的频数

3. 绘制等高线图:

  • 使用 plot_ly 和 type = 'surface' 绘制3D表面图
  • 传递 z_data 矩阵表示每个箱子的频数
  • colorscale 和 colorbar 用于设置颜色和图例

效果

曲线图

示例

r 复制代码
# 加载必要的包
library(plotly)

# 生成 3D 螺旋曲线数据
t <- seq(0, 10 * pi, length.out = 100)
x <- sin(t)
y <- cos(t)
z <- t

# 创建数据框
data <- data.frame(
  t = t,
  x = x,
  y = y,
  z = z
)

# 绘制 3D 曲线图
fig <- plot_ly(
  data = data,
  x = ~x,
  y = ~y,
  z = ~z,
  type = 'scatter3d',
  mode = 'lines',
  line = list(width = 4, color = 'blue')
) %>%
  layout(
    scene = list(
      xaxis = list(title = 'X Axis'),
      yaxis = list(title = 'Y Axis'),
      zaxis = list(title = 'Z Axis')
    )
  )

# 显示图形
fig

解析

1. 生成 3D 螺旋曲线数据:

  • t 是参数,用于生成曲线的点
  • x 和 y 是通过 sin(t) 和 cos(t) 生成的曲线的横纵坐标
  • z 是随 t 增长的直线分量,用于使曲线在 z 轴上上升

2. 创建数据框:

  • 将生成的数据存储在数据框 data 中,以便用于绘图

3. 绘制 3D 曲线图:

  • plot_ly() 函数用于创建图形对象,type = 'scatter3d' 表示绘制 3D 散点图,而 mode = 'lines' 指定将点连接成线形成曲线
  • line 参数用于设置线条的宽度和颜色

4. 设置布局:

  • layout() 函数用于设置坐标轴的标题以及其他图形布局选项

效果

热力图

示例

r 复制代码
# 加载必要的包
library(plotly)

# 生成模拟数据
set.seed(123)
x <- seq(-10, 10, length.out = 30)
y <- seq(-10, 10, length.out = 30)
z <- seq(-10, 10, length.out = 30)
data <- expand.grid(x = x, y = y, z = z)

# 计算热力图值,这里使用一个简单的函数作为例子
data$values <- with(data, sin(sqrt(x^2 + y^2 + z^2)))

# 绘制 3D 热力图
fig <- plot_ly(
  data,
  x = ~x,
  y = ~y,
  z = ~z,
  color = ~values,
  colors = colorRamp(c('blue', 'green', 'yellow', 'red')),
  type = 'mesh3d',
  intensity = ~values
) %>%
  layout(
    scene = list(
      xaxis = list(title = 'X Axis'),
      yaxis = list(title = 'Y Axis'),
      zaxis = list(title = 'Z Axis')
    ),
    coloraxis = list(colorbar = list(title = 'Intensity'))
  )

# 显示图形
fig

解析

1. 生成模拟数据:

  • x、y 和 z 是三维网格的坐标轴,使用 seq() 函数生成从 -10 到 10 的数据
  • expand.grid() 函数生成所有可能的 (x, y, z) 组合

2. 计算热力图值:

  • data$values 是我们用来表示热力图强度的数据,这里使用一个简单的 sin(sqrt(x^2 + y^2 + z^2)) 函数计算值,可以根据需要替换为实际数据或其他函数

3. 绘制 3D 热力图:

  • plot_ly() 函数创建图形对象,type = 'mesh3d' 指定绘制 3D 网格图,intensity 参数设置为热力图的值
  • colorRamp() 函数定义颜色渐变,展示不同强度的区域

4. 设置布局:

  • layout() 函数用于设置坐标轴标题和颜色条

效果

雷达图

示例

r 复制代码
library(plotly)
library(dplyr)

# 生成示例数据
data <- data.frame(
  axis = c("A", "B", "C", "D", "E"),
  value = c(3, 4, 2, 5, 4)
)

# 转换数据为适合绘图的格式
n <- nrow(data)
theta <- seq(0, 2 * pi, length.out = n + 1)
r <- c(data$value, data$value[1])
x <- r * cos(theta)
y <- r * sin(theta)

# 创建3D雷达图
plot_ly(
  x = ~x,
  y = ~y,
  z = ~rep(0, length(x)),
  type = 'scatter3d',
  mode = 'lines+markers',
  line = list(color = 'blue'),
  marker = list(size = 5, color = 'blue')
) %>%
  layout(
    scene = list(
      xaxis = list(title = 'X'),
      yaxis = list(title = 'Y'),
      zaxis = list(title = 'Z', visible = FALSE)
    ),
    title = '3D Radar Plot'
  )

效果

韦恩图

示例

r 复制代码
# 加载必要的包
library(plotly)

# 定义 3D 圆的参数
circle_radius <- 1
n_points <- 100
theta <- seq(0, 2 * pi, length.out = n_points)

# 计算圆的 x 和 y 坐标
circle_x <- circle_radius * cos(theta)
circle_y <- circle_radius * sin(theta)

# 生成 3 个圆的坐标
circle1 <- data.frame(x = circle_x, y = circle_y, z = 0)
circle2 <- data.frame(x = circle_x - 0.5, y = circle_y - 0.5, z = 0)
circle3 <- data.frame(x = circle_x + 0.5, y = circle_y - 0.5, z = 0)

# 创建一个 3D 图形
fig <- plot_ly() %>%
  # 添加圆1
  add_trace(
    x = circle1$x,
    y = circle1$y,
    z = circle1$z,
    type = 'scatter3d',
    mode = 'lines',
    line = list(width = 2, color = 'blue'),
    name = 'Circle 1'
  ) %>%
  # 添加圆2
  add_trace(
    x = circle2$x,
    y = circle2$y,
    z = circle2$z,
    type = 'scatter3d',
    mode = 'lines',
    line = list(width = 2, color = 'green'),
    name = 'Circle 2'
  ) %>%
  # 添加圆3
  add_trace(
    x = circle3$x,
    y = circle3$y,
    z = circle3$z,
    type = 'scatter3d',
    mode = 'lines',
    line = list(width = 2, color = 'red'),
    name = 'Circle 3'
  ) %>%
  layout(
    scene = list(
      xaxis = list(title = 'X Axis'),
      yaxis = list(title = 'Y Axis'),
      zaxis = list(title = 'Z Axis')
    ),
    title = '3D Venn Diagram'
  )

# 显示图形
fig

解析

1. 定义圆的参数:

  • circle_radius 为圆的半径
  • n_points 设置圆上点的数量以确保圆的平滑

2. 计算圆的坐标:

  • 使用 cos 和 sin 函数计算圆的 x 和 y 坐标
  • 创建三个不同位置的圆(通过调整 x 和 y 的位置)

3. 创建 3D 图形:

  • 使用 plot_ly() 创建图形对象
  • add_trace() 函数用于添加每个圆的坐标
  • layout() 设置坐标轴标题和图形标题

效果

相关推荐
酷讯网络_2408701603 分钟前
【全开源】Java多语言tiktok跨境商城TikTok内嵌商城送搭建教程
java·开发语言·开源
旺旺大力包21 分钟前
【 Git 】git 的安装和使用
前端·笔记·git
PP东26 分钟前
ES学习class类用法(十一)
javascript·学习
海威的技术博客31 分钟前
JS中的原型与原型链
开发语言·javascript·原型模式
码农菌33 分钟前
3D坐标下,一点在某一线段上的左右方向的判定
3d·open3d·几何相关算法
WPG大大通38 分钟前
基于DIODES AP43781+PI3USB31531+PI3DPX1207C的USB-C PD& Video 之全功能显示器连接端口方案
c语言·开发语言·计算机外设·开发板·电源·大大通
从以前1 小时前
【算法题解】Bindian 山丘信号问题(E. Bindian Signaling)
开发语言·python·算法
high20111 小时前
【Java 基础】-- ArrayList 和 Linkedlist
java·开发语言