寻找可在ggplot散点图添加分类顶线的R包
实现目标图表的R方案
你要的这种带顶部分类标注条的图表,完全可以用ggplot2配合基础图层实现,不需要额外的特殊包;如果想简化分类条的绘制逻辑,也可以借助专门的工具包。以下是针对你的数据的具体实现方案:
步骤1:准备示例数据
你的示例数据如下(固定随机种子保证结果可复现):
library(tibble) set.seed(123) data1 <- tibble(seq = factor(1:20), value = rnorm(20, 10, 2), par_a = c(rep("S1", 6), rep("S2", 14)), par_b = c(rep("B1", 18), rep("S2", 2)) )
方案一:纯ggplot2手动实现
通过构建辅助数据绘制顶部分类色块,完全自定义程度高:
1. 构建分类条的位置数据
把分类变量的区间转换为X轴坐标:
# 给每个seq分配X轴数值位置 data1$x_pos <- as.integer(data1$seq) # 生成par_a的色块区间数据 par_a_ranges <- data1 %>% group_by(par_a) %>% summarise(xmin = min(x_pos) - 0.5, xmax = max(x_pos) + 0.5, ymin = max(data1$value) + 1, ymax = max(data1$value) + 2) # 生成par_b的色块区间数据 par_b_ranges <- data1 %>% group_by(par_b) %>% summarise(xmin = min(x_pos) - 0.5, xmax = max(x_pos) + 0.5, ymin = max(data1$value) + 2.5, ymax = max(data1$value) + 3.5)
2. 绘制完整图表
library(ggplot2) ggplot(data1, aes(x = x_pos, y = value)) + # 绘制顶部par_b分类色块 geom_rect(data = par_b_ranges, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = par_b), inherit.aes = FALSE) + # 绘制顶部par_a分类色块 geom_rect(data = par_a_ranges, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = par_a), inherit.aes = FALSE) + # 绘制主数据的线和点 geom_line(color = "#2c3e50") + geom_point(size = 2, color = "#e74c3c") + # 设置X轴刻度为seq分类值 scale_x_continuous(breaks = data1$x_pos, labels = data1$seq) + # 自定义填充色板 scale_fill_brewer(palette = "Set2") + # 调整主题样式 theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "bottom", legend.box = "vertical") + labs(x = "seq", y = "value", fill = "参数")
方案二:使用gggenes包简化绘制
如果你的分类变量是连续区块类的注释,gggenes包专门适配这类线性注释图表,能大幅简化代码:
# 安装并加载包 install.packages("gggenes") library(gggenes) ggplot(data1, aes(xmin = x_pos - 0.5, xmax = x_pos + 0.5, y = 1, fill = par_a)) + geom_gene_arrow() + facet_wrap(~par_b, ncol = 1) + # 叠加主数据的点和线 geom_point(data = data1, aes(x = x_pos, y = value), inherit.aes = FALSE, color = "#e74c3c") + geom_line(data = data1, aes(x = x_pos, y = value), inherit.aes = FALSE, color = "#2c3e50")
内容的提问来源于stack exchange,提问作者Radek Jaźwiec
相关产品推荐
相关产品推荐

