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

GGE图标签颜色修改问题:颜色向量仅对线条生效

解决GGE图标签颜色不随col.gen变化的问题

问题说明

使用metan包绘制GGE双标图时,设置的col.gen颜色向量仅对基因型的连线生效,标签始终只使用向量中的第一种颜色。需要实现:

  • 理想效果:按指定分组(如基因型分组)为标签设置对应颜色,同组标签颜色一致
  • 基础需求:通过颜色向量自定义标签颜色

解决方案

metan的plot.gge函数未直接提供标签颜色的独立参数,可通过覆盖原有标签层的方式实现需求,以下是基于mpg数据集的修改代码:

方法1:自定义颜色向量设置标签颜色

直接提取基因型标签的位置数据,用geom_text_repel重新绘制标签并指定颜色:

library(metan)
library(ggplot2)

data <- mpg
gge_model <- gge(data,
                 env = cyl,
                 gen = manufacturer,
                 displ,
                 centering = "environment",
                 scaling = "none",
                 svp = "genotype",
                 by = NULL)

# 先绘制基础图,隐藏原有基因型标签
p <- plot(gge_model,
           type = 2,
           repel = TRUE,
           repulsion = 1,
           max_overlaps = 20,
           col.gen = c(
             "black", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd",
             "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf",
             "#393b79", "#637939", "#8c6d31", "#843c39", "#7b4173"
           ),
           col.env = "blue",
           line.type = 'solid',
           title = FALSE,
           size.text.env = 3,
           size.text.gen = 0, # 隐藏原有标签
           size.line = 2,
           plot_theme = theme_metan(grid = "none", col.grid = "white", color.background = "white"))

# 提取基因型标签的坐标数据
gen_labels <- gge_model$svp$genotype[, c("NAME", "PC1", "PC2")]
# 定义与col.gen对应的标签颜色向量,确保顺序匹配
label_colors <- c(
  "black", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd",
  "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf",
  "#393b79", "#637939", "#8c6d31", "#843c39", "#7b4173"
)
names(label_colors) <- gen_labels$NAME

# 添加自定义颜色的标签层
p <- p +
  geom_text_repel(data = gen_labels,
                  aes(x = PC1, y = PC2, label = NAME, color = NAME),
                  size = 3,
                  repel = TRUE,
                  max.overlaps = 20) +
  scale_color_manual(values = label_colors) +
  labs(title = "GGE双标图(自定义标签颜色)") +
  guides(color = "none") # 隐藏颜色图例(按需选择)

p

方法2:按分组设置标签颜色

假设存在分组变量(如新增分组列对基因型分类),可通过颜色映射实现同组同色:

library(metan)
library(ggplot2)
library(dplyr)

data <- mpg
# 新增分组变量示例:将制造商分为3组
data$group <- case_when(
  data$manufacturer %in% c("audi", "volkswagen") ~ "Group1",
  data$manufacturer %in% c("ford", "chevrolet") ~ "Group2",
  TRUE ~ "Group3"
)

gge_model <- gge(data,
                 env = cyl,
                 gen = manufacturer,
                 displ,
                 centering = "environment",
                 scaling = "none",
                 svp = "genotype",
                 by = NULL)

# 基础图隐藏原有标签
p <- plot(gge_model,
           type = 2,
           repel = TRUE,
           repulsion = 1,
           max_overlaps = 20,
           col.gen = "gray50", # 线条统一灰色,也可按分组设置线条颜色
           col.env = "blue",
           line.type = 'solid',
           title = FALSE,
           size.text.env = 3,
           size.text.gen = 0,
           size.line = 2,
           plot_theme = theme_metan(grid = "none", col.grid = "white", color.background = "white"))

# 提取标签数据并合并分组信息
gen_labels <- gge_model$svp$genotype[, c("NAME", "PC1", "PC2")]
gen_labels <- merge(gen_labels, unique(data[, c("manufacturer", "group")]), 
                    by.x = "NAME", by.y = "manufacturer")

# 定义分组对应颜色
group_colors <- c(Group1 = "#ff7f0e", Group2 = "#2ca02c", Group3 = "#d62728")

# 添加按分组着色的标签层
p <- p +
  geom_text_repel(data = gen_labels,
                  aes(x = PC1, y = PC2, label = NAME, color = group),
                  size = 3,
                  repel = TRUE,
                  max.overlaps = 20) +
  scale_color_manual(values = group_colors) +
  labs(title = "GGE双标图(按分组着色标签)", color = "分组")

p

关键说明

  1. 通过size.text.gen = 0隐藏原有标签,避免新旧标签重叠
  2. 从gge_model$svp$genotype提取标签的PC1/PC2坐标,确保位置与原图完全一致
  3. 用geom_text_repel重新绘制标签,通过aes(color = ...)绑定颜色映射,再用scale_color_manual指定自定义颜色

内容的提问来源于stack exchange,提问作者Artūrs Katamadze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:14:52