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

使用melt函数处理重复数据并绘制ggplot图形时遇错误的技术咨询

问题解决:data.table melt报错及ggplot语法修正

错误原因分析

  1. 列名匹配失败:原始数据部分列名含空格(如ga_centere 1),read.csv默认会将空格替换为点(如ga_centere.1),但手动生成的vals列表仍用带空格的列名,导致melt无法找到对应列。
  2. ggplot语法错误:scale_color_manual的颜色向量中存在逗号缺失、多余逗号等语法问题,导致向量定义失效。
  3. 指标名称提取错误:用固定长度substr截取指标名称,无法适配不同长度的指标名,导致分类错误。

修正后的完整代码

library(ggplot2)
library(data.table)

# 读取数据时保留原始列名,避免空格被自动替换
df <- read.csv("sample-rep1-5.csv", check.names = FALSE)
setDT(df)

# 用正则匹配所有指标列,无需手动生成列名列表
measure_patterns <- c(
  "mi_centereA\\d+", "mi_centereB\\d+",
  "ga_centere \\d+", "ps_centereA\\d+",
  "ps_centereB\\d+", "sa_centere \\d+",
  "il_centereA\\d+", "il_centereB\\d+"
)

# 执行melt转换,同时定义变量名和值列名
df_melted <- melt(
  df, 
  id.vars = "win", 
  measure.vars = patterns(measure_patterns),
  variable.name = "indicator", 
  value.name = "value"
)

# 用正则提取纯指标名称(去掉末尾的数字和空格)
df_melted[, indicator := gsub("\\s?\\d+$", "", indicator)]

# 绘制折线图
ggplot(df_melted, aes(x = win, y = value, color = indicator, group = interaction(indicator, .I))) +
  geom_line() +
  scale_color_manual(
    name = "指标类型", 
    values = c(
      "mi_centereA" = "blue", 
      "mi_centereB" = "green", 
      "ga_centere" = "yellow", 
      "ps_centereA" = "orange", 
      "ps_centereB" = "red", 
      "sa_centere" = "black", 
      "il_centereA" = "purple", 
      "il_centereB" = "grey"
    )
  ) +
  xlab("win") + 
  ylab("数值") +
  theme_bw()

关键修正点说明

  • 保留原始列名:添加check.names = FALSE参数,确保读取数据时列名与原始数据一致。
  • 自动匹配列名:使用patterns()结合正则表达式匹配所有指标列,避免手动生成列名的错误。
  • 准确提取指标名:用正则表达式gsub("\\s?\\d+$", "", indicator)去掉列名末尾的数字和空格,精准分类指标。
  • 修复语法错误:修正scale_color_manual中颜色向量的语法问题,确保颜色映射正确。
  • 合理分组折线:用interaction(indicator, .I)确保每个重复样本的折线独立绘制,避免线条混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:05:45