如何调整trackViewer lollipopPlot图例的位置与方向?
解决trackViewer lolliplot堆叠SNP图例侧边精准对齐问题
核心思路
lolliplot的堆叠层级由stack.factor的顺序决定,我们可以直接提取绘图时的堆叠位置参数,将图例元素与对应层级的y坐标绑定,彻底避免手动估算viewport坐标的误差。
优化实现代码
library(trackViewer) library(grid) # 1. 准备数据 chromosome.feature.test <- GRanges("test", IRanges(c(1), width=c(500), names=c("test"))) test.snps <- GRanges("test", IRanges(c(10, 10, 25, 150, 10, 450), width=1, names=c("C10A", "C10A", "A25G", "T150C", "C10A", "T450G"), stack.factor=c("test_snp_1", "test_snp_2", "test_snp_2", "test_snp_2", "test_snp_3", "test_snp_3"))) samples.palette.test <- list("#E69F00", "#56B4E9", "#009E73") names(samples.palette.test) <- c("test_snp_1", "test_snp_2", "test_snp_3") test.snps$color <- samples.palette.test[test.snps$stack.factor] # 2. 绘制无默认图例的堆叠图 p <- lolliplot(test.snps, chromosome.feature.test, type="pie.stack", legend=NULL, dashline.col="black") # 3. 获取堆叠层级的位置信息 stack_elements <- p@tracks[[1]]@dat stack_levels <- unique(stack_elements$stack.factor) # 按堆叠顺序排序(底层到上层) stack_levels <- stack_levels[order(stack_levels)] # 计算每个层级的中心y坐标(基于绘图区域相对比例) n_levels <- length(stack_levels) y_coords <- sapply(1:n_levels, function(i) (i - 0.5)/n_levels) names(y_coords) <- stack_levels # 4. 绘制精准对齐的侧边图例 legend_x <- 0.92 # 图例x方向位置(0-1,靠近1为右侧) # 逐个绑定层级坐标绘制图例项 for (i in seq_along(stack_levels)) { level <- stack_levels[i] # 绘制彩色圆点 grid.points(x=unit(legend_x, "npc"), y=unit(y_coords[level], "npc"), pch=21, size=unit(5, "mm"), gp=gpar(fill=samples.palette.test[[level]], col="gray20")) # 绘制对应标签 grid.text(label=level, x=unit(legend_x + 0.03, "npc"), y=unit(y_coords[level], "npc"), just="left", gp=gpar(fontsize=10)) }
关键细节说明
- 关闭默认图例(
legend=NULL)避免冲突,同时减少绘图区域的占用 - 通过
p@tracks[[1]]@dat直接读取绘图底层数据,确保堆叠层级的准确性 - 利用层级数量计算相对y坐标,无需手动调整固定数值,适配任意数量的堆叠样本
- 可灵活调整
legend_x的值来改变图例左右位置,用unit()的其他单位(如cm)微调尺寸
内容的提问来源于stack exchange,提问作者KeyboardCat
相关产品推荐
相关产品推荐

