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
关键说明
- 通过
size.text.gen = 0隐藏原有标签,避免新旧标签重叠 - 从
gge_model$svp$genotype提取标签的PC1/PC2坐标,确保位置与原图完全一致 - 用
geom_text_repel重新绘制标签,通过aes(color = ...)绑定颜色映射,再用scale_color_manual指定自定义颜色
内容的提问来源于stack exchange,提问作者Artūrs Katamadze
相关产品推荐
相关产品推荐

