You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R基于匹配Pos_命名的多CSV文件绘制plotly 3D图及数据处理问询

R语言批量处理CSV并生成3D可视化方案

1. 前置依赖加载

先安装并加载所需工具包,代码直接运行即可:

# 首次使用先安装依赖
install.packages(c("tidyverse", "plotly", "htmlwidgets"))

# 加载包
library(tidyverse)
library(plotly)
library(htmlwidgets)

2. 批量读取CSV文件

自动匹配所有含Pos_字段的CSV文件,跳过前6行,同时保留文件标识用于后续分组:

# 匹配当前工作目录下所有符合命名规则的CSV
file_list <- list.files(pattern = "Pos_.*\\.csv$", full.names = TRUE)

# 批量读取文件,同时生成自定义点名称
all_data <- map_dfr(file_list, function(path) {
  # 跳过前6行读取数据
  df <- read_csv(path, skip = 6, show_col_types = FALSE)
  # 提取Pos编号作为分组标识,比如27383_Pos_1.csv对应提取Pos_1
  df$pos_id <- str_extract(path, "Pos_\\d+")
  # 自定义点的显示名称,可按需调整拼接规则
  df$point_label <- paste0(df$pos_id, "_行号", 1:nrow(df), "_力值", round(df$Z, 2))
  return(df)
})

若你的力值字段不是Z列,将上述代码中df$Z替换为实际列名即可

3. 提取最小/最大力对应坐标

按单个CSV文件分组,自动提取极值对应的XYZ数值:

force_extremes <- all_data %>%
  group_by(pos_id) %>%
  summarise(
    # 最小力相关坐标
    min_force = min(Z, na.rm = TRUE),
    min_force_X = X[which.min(Z)],
    min_force_Y = Y[which.min(Z)],
    min_force_Z = Z[which.min(Z)],
    # 最大力相关坐标
    max_force = max(Z, na.rm = TRUE),
    max_force_X = X[which.max(Z)],
    max_force_Y = Y[which.max(Z)],
    max_force_Z = Z[which.max(Z)],
    .groups = "drop"
  )

4. plotly 3D可视化实现

支持交互缩放、悬停查看自定义点信息,同时高亮极值点:

p <- plot_ly() %>%
  # 加载所有普通数据点
  add_trace(
    data = all_data,
    x = ~X, y = ~Y, z = ~Z,
    type = "scatter3d",
    mode = "markers",
    color = ~pos_id,
    text = ~point_label,
    hoverinfo = "text",
    marker = list(size = 3)
  ) %>%
  # 高亮最大力点(红色菱形标记)
  add_trace(
    data = force_extremes,
    x = ~max_force_X, y = ~max_force_Y, z = ~max_force_Z,
    type = "scatter3d",
    mode = "markers",
    marker = list(color = "red", size = 6, symbol = "diamond"),
    name = "最大力点",
    text = ~paste0(pos_id, "_最大力:", round(max_force, 2)),
    hoverinfo = "text"
  ) %>%
  # 高亮最小力点(蓝色菱形标记)
  add_trace(
    data = force_extremes,
    x = ~min_force_X, y = ~min_force_Y, z = ~min_force_Z,
    type = "scatter3d",
    mode = "markers",
    marker = list(color = "blue", size = 6, symbol = "diamond"),
    name = "最小力点",
    text = ~paste0(pos_id, "_最小力:", round(min_force, 2)),
    hoverinfo = "text"
  ) %>%
  layout(
    scene = list(
      xaxis = list(title = "X轴坐标"),
      yaxis = list(title = "Y轴坐标"),
      zaxis = list(title = "Z轴(力值)")
    ),
    title = "多组Pos数据3D可视化"
  )

# 运行即可查看交互式图
p

5. 数据导出规则与实现

命名规则

  • 合并后的全量处理数据:all_pos_processed_data.csv
  • 最小/最大力极值汇总表:pos_min_max_force_summary.csv
  • 交互式3D可视化文件:pos_3d_visualization.html(可直接本地浏览器打开,保留所有交互能力)

导出代码

# 导出全量处理数据
write_csv(all_data, "all_pos_processed_data.csv", na = "")

# 导出极值汇总表
write_csv(force_extremes, "pos_min_max_force_summary.csv", na = "")

# 导出交互式3D图
saveWidget(p, "pos_3d_visualization.html", selfcontained = TRUE)

注意事项

  • 若CSV读取需要跳过的行数有变动,修改read_csv中的skip参数即可
  • 若需要调整点的自定义命名规则,修改point_label的拼接逻辑即可
  • 若需要导出静态PNG格式的3D图,安装webshot2包后调用export(p, file = "pos_3d_visualization.png", zoom = 2)即可

内容的提问来源于stack exchange,提问作者watch me

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:54:06