请求为ggplot2绘制的分面柱状图添加渐变色
为分面柱状图添加渐变色的解决方案
修正原代码的冗余问题
原代码同时使用了facet_wrap(~name)和facet_grid(~name),会导致分面重复,只需保留其中一个即可。此外,position_stack()在分面场景下是多余的,因为每个分面仅对应一个分组的数值。
方式一:基于数值的全局渐变色(推荐)
这种方式让每个柱子的填充色根据数值大小渐变,直观反映数值高低,实现起来最简单:
library("ggplot2") library(tidyverse) # 读取数据(如果用本地文件,替换为read.delim(file="TEST2.txt", header = TRUE)) topfun <- tibble( Name = c("DNA damage", "Telomerase", "DNA repair", "Envelope repair"), WT1 = c(50, 60, 90, 45), MUT1 = c(40, 55, 80, 30), WT2 = c(45, 55, 80, 35), MUT2 = c(5, 2, 4, 6) ) topfun %>% pivot_longer(-Name) %>% ggplot(aes(x = Name, y = value, fill = value)) + geom_col(color="black") + coord_flip() + facet_wrap(~name, ncol = 2) + # 设置分面为2列,布局更美观 theme(axis.text = element_text(size=13)) + # 使用viridis渐变配色,也可替换为scale_fill_gradient(low="white", high="blue")自定义 scale_fill_viridis_c(option = "plasma", name = "Expression Level") + labs(x = "Functional Item", y = "Value")
说明:
- 将
fill映射到value,让颜色随数值变化 scale_fill_viridis_c是ggplot2内置的色盲友好型渐变配色,option参数可切换不同色系(如"viridis"、"magma"等)- 若需要自定义渐变,可改用
scale_fill_gradient(low = "#f0f9ff", high = "#2563eb")设置首尾颜色
方式二:为每个分组设置独立渐变色
如果需要区分野生型(WT)和突变型(MUT)的色调,可为每个分组单独定义渐变色系:
library("ggplot2") library(tidyverse) topfun <- tibble( Name = c("DNA damage", "Telomerase", "DNA repair", "Envelope repair"), WT1 = c(50, 60, 90, 45), MUT1 = c(40, 55, 80, 30), WT2 = c(45, 55, 80, 35), MUT2 = c(5, 2, 4, 6) ) # 归一化每个分组的数值到0-1范围,用于匹配渐变颜色 topfun_long <- topfun %>% pivot_longer(-Name) %>% group_by(name) %>% mutate(norm_value = scales::rescale(value)) # 为每个分组定义渐变配色(浅到深) group_palettes <- list( WT1 = scales::gradient_n_pal(c("#e6f7ff", "#1890ff"))(seq(0, 1, length.out = 4)), MUT1 = scales::gradient_n_pal(c("#fff7e6", "#fa8c16"))(seq(0, 1, length.out = 4)), WT2 = scales::gradient_n_pal(c("#f0f5ff", "#2f54eb"))(seq(0, 1, length.out = 4)), MUT2 = scales::gradient_n_pal(c("#fff1f0", "#ff4d4f"))(seq(0, 1, length.out = 4)) ) # 为每个数据点匹配对应分组的渐变颜色 topfun_long <- topfun_long %>% mutate(fill_color = case_when( name == "WT1" ~ group_palettes$WT1[rank(norm_value)], name == "MUT1" ~ group_palettes$MUT1[rank(norm_value)], name == "WT2" ~ group_palettes$WT2[rank(norm_value)], name == "MUT2" ~ group_palettes$MUT2[rank(norm_value)] )) # 绘图 ggplot(topfun_long, aes(x = Name, y = value, fill = fill_color)) + geom_col(color="black") + coord_flip() + facet_wrap(~name, ncol = 2) + theme(axis.text = element_text(size=13)) + # 使用identity映射自定义颜色,并添加颜色图例 scale_fill_identity(name = "Level", guide = "colorbar", labels = c("Low", "Medium", "High"), breaks = c(group_palettes$WT1[1], group_palettes$WT1[2], group_palettes$WT1[4])) + labs(x = "Functional Item", y = "Value")
说明:
- 每个分组使用独立的渐变色调,野生型用蓝色系,突变型用橙/红色系,便于区分
- 通过
scales::rescale归一化数值,确保每个分组内的颜色渐变范围一致
内容的提问来源于stack exchange,提问作者Venkata Narasimha Kadali
相关产品推荐
相关产品推荐

