cooccur包绘制热图时物种名称标签重叠如何解决?
cooccur包绘制共现热图物种标签重叠解决方案
cooccur包默认plot()方法基于R基础绘图系统实现,标签重叠通常是边距不足、标签字号过大、物种名过长导致,可通过以下三种方式解决:
方案1:调整基础绘图边距与标签字号
直接在绘图前通过par()设置全局绘图参数,给标签预留足够显示空间,同时缩小标签字号,无需修改原始数据或绘图逻辑:
# mar参数四个值依次对应下、左、上、右四个方向的边距宽度,可根据物种名长度自行调整数值 # cex.axis控制坐标轴物种标签的缩放比例,数值越小字号越小 par(mar = c(9, 9, 2, 2), cex.axis = 0.65) # 运行原有的cooccur计算与绘图代码 M <- cooccur(mat = M, type = "spp_site", thresh = T, spp_names = TRUE, prob = "hyper") plot(M, plotrand = TRUE)
如果使用RStudio,可先手动拉大右下角绘图面板的尺寸,再运行绘图代码,显示空间越充足,标签重叠概率越低。
方案2:提取共现结果自定义热图,支持标签旋转
如果物种名偏长,单纯缩放字号会导致文字难以辨认,可以提取cooccur的计算结果,用支持标签旋转的热图函数重新绘图,自由度更高:
library(gplots) # 提取共现分析结果,构建对称共现矩阵 sp_all <- unique(c(M$results$sp1, M$results$sp2)) cooc_sym_matrix <- matrix( data = NA, nrow = length(sp_all), ncol = length(sp_all), dimnames = list(sp_all, sp_all) ) for (row in 1:nrow(M$results)) { sp1 <- M$results[row, "sp1"] sp2 <- M$results[row, "sp2"] p_val <- M$results[row, "p_gt"] cooc_sym_matrix[sp1, sp2] <- p_val cooc_sym_matrix[sp2, sp1] <- p_val } # 绘制带旋转标签的热图 heatmap.2( x = cooc_sym_matrix, trace = "none", # 去掉默认的轨迹线 dendrogram = "none", # 不需要聚类树可保留这行,需要可删除 cexRow = 0.7, # 行标签字号 cexCol = 0.7, # 列标签字号 srtRow = 30, # 行标签旋转角度 srtCol = 45, # 列标签旋转角度 margins = c(8, 8) # 边距设置 )
如果习惯用ggplot2绘图,也可以把矩阵转成长表后用geom_tile()实现热图,标签调整的灵活度更高。
方案3:简化过长的物种名称
如果原始物种名是带全分类信息、菌株号的长文本,可提前简化名称后再输入cooccur计算,从源头降低标签占位长度:
# 示例:原始输入为物种-位点矩阵时,简化行名(物种名) # 原始名格式比如为"Staphylococcus_aureus_subsp_aureus_N315",可简化为"S. aureus N315" original_spp_names <- rownames(your_input_spp_site_matrix) short_spp_names <- gsub("([A-Z])[a-z]+_([a-z]+)_.*", "\\1. \\2", original_spp_names) rownames(your_input_spp_site_matrix) <- short_spp_names # 替换原代码中的输入矩阵为修改过行名的矩阵,重新运行cooccur计算和绘图即可
内容的提问来源于stack exchange,提问作者Subrata Gayen
相关产品推荐
相关产品推荐

