使用ggplot2绘制带颜色渐变分组的癌症类型饼图
解决方案:ggplot2绘制分层渐变饼图
1. 准备环境与示例数据
先加载所需工具包,同时构造匹配需求的示例metadata数据集:
library(ggplot2) library(dplyr) library(colorspace) # 用于生成颜色渐变,也可手动指定 # 构造示例数据 set.seed(123) metadata <- data.frame( Cancer_Type = sample(c("CancerA", "CancerB", "CancerC", "CancerD"), 500, replace = TRUE), dataset = sample(c("Dataset1", "Dataset2", "Dataset3"), 500, replace = TRUE), row.names = paste0("Sample_", 1:500) )
2. 统计分组样本量
按Cancer_Type和dataset分组统计样本数,这是绘制饼图的核心数据:
count_data <- metadata %>% count(Cancer_Type, dataset, name = "sample_count") %>% arrange(Cancer_Type)
3. 定义分层渐变颜色
给四种癌症分配主色,再为每个癌症下的数据集生成对应主色的渐变子色:
# 定义四种癌症的主色 main_colors <- c( "CancerA" = "#E74C3C", # 红色 "CancerB" = "#3498DB", # 蓝色 "CancerC" = "#2ECC71", # 绿色 "CancerD" = "#F39C12" # 橙色 ) # 为每个Cancer_Type + dataset组合生成渐变色 gradient_colors <- lapply(names(main_colors), function(cancer) { # 获取当前癌症下的数据集数量 dataset_num <- nrow(filter(count_data, Cancer_Type == cancer)) # 生成从主色到浅色调的渐变 lighten(main_colors[cancer], seq(0, 0.4, length.out = dataset_num)) }) %>% unlist() # 命名颜色:用interaction(Cancer_Type, dataset)作为匹配键 names(gradient_colors) <- with(count_data, interaction(Cancer_Type, dataset))
4. 绘制分层渐变饼图
用ggplot2绘制饼图,通过填充映射关联分组组合,指定自定义渐变颜色:
ggplot(count_data, aes(x = "", y = sample_count, fill = interaction(Cancer_Type, dataset))) + geom_bar(stat = "identity", width = 1) + # 转换为饼图坐标系 coord_polar("y", start = 0) + # 应用自定义渐变颜色 scale_fill_manual(values = gradient_colors) + # 添加标签:显示癌症类型与对应样本量(可选) geom_text(aes(label = paste0(Cancer_Type, "\n", sample_count)), position = position_stack(vjust = 0.5)) + # 去除冗余元素,简化饼图样式 theme_void() + labs(fill = "Cancer + Dataset")
关键说明
- 用
interaction(Cancer_Type, dataset)作为填充映射,确保每个子块能单独分配颜色 colorspace::lighten可快速生成主色的浅色调渐变,也可手动替换为自定义色值theme_void()用于移除坐标轴、背景等无关元素,让饼图更简洁
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

