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

咨询:以2为阈值的基因表达正负垂直条形图绘制及命名

问题解答

图表名称

你要做的这种以固定阈值为基准、展示数值与阈值差值的双向条形图,正式名称是双向条形图(Diverging Bar Chart),也常被称为差值条形图。

解决方案(基于ggplot2)

针对你需要展示差值、双向分色、处理大量基因标注与拆分的需求,下面是完整实现步骤:

1. 数据预处理

先计算RQ与2的差值,定义颜色分组,同时处理缺失值:

library(tidyverse)

# 计算差值、定义颜色分组,过滤缺失值
df_processed <- df_example %>%
  mutate(
    diff = RQ - 2,
    color_group = ifelse(diff > 0, "高于阈值", "低于阈值")
  ) %>%
  drop_na(diff) # 也可根据需求用fill替换NA,而非直接过滤

# 按基因排序(可选,让图表更整洁)
df_processed <- df_processed %>% arrange(gen)

2. 拆分数据集

将55个基因拆分为两部分,比如前28个和后27个:

# 获取唯一基因列表
unique_genes <- unique(df_processed$gen)
# 拆分基因组
gene_group1 <- unique_genes[1:28]
gene_group2 <- unique_genes[29:55]

# 拆分数据集
df_group1 <- df_processed %>% filter(gen %in% gene_group1)
df_group2 <- df_processed %>% filter(gen %in% gene_group2)

3. 绘制第一部分图表

p1 <- ggplot(df_group1, aes(x = gen, y = diff, fill = color_group)) +
  geom_col(width = 0.7) +
  # 设置对应颜色
  scale_fill_manual(values = c("高于阈值" = "red", "低于阈值" = "green")) +
  # 将基因标注放在条形上方/下方,避免X轴重叠
  geom_text(aes(label = gen), vjust = ifelse(df_group1$diff > 0, -0.5, 1.5), size = 3) +
  # 添加阈值参考线(y=0对应RQ=2)
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
  labs(y = "RQ与阈值2的差值", title = "基因表达差值图(第一部分)") +
  # 隐藏X轴原标签,改用条形上方的标注
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.grid.major.y = element_line(color = "gray90"))

print(p1)

4. 绘制第二部分图表

复用逻辑替换数据集即可:

p2 <- ggplot(df_group2, aes(x = gen, y = diff, fill = color_group)) +
  geom_col(width = 0.7) +
  scale_fill_manual(values = c("高于阈值" = "red", "低于阈值" = "green")) +
  geom_text(aes(label = gen), vjust = ifelse(df_group2$diff > 0, -0.5, 1.5), size = 3) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
  labs(y = "RQ与阈值2的差值", title = "基因表达差值图(第二部分)") +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        panel.grid.major.y = element_line(color = "gray90"))

print(p2)

你原有代码的问题说明

  1. 前两段代码直接用RQ作为条形高度,未计算与2的差值,且Y轴从0开始,导致低于2的部分无法显示,自然看不到向下的条形
  2. 第三段代码中的index变量不存在,这是直接报错的核心原因,同时逻辑上也未处理差值计算

内容的提问来源于stack exchange,提问作者Javier Hernando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:30:59