You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 18:30:16