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

R中如何筛选存在有效VALUE的CLASS并生成无空白heatmap?

解决R中热图空白问题:保留至少含一个非0值的CLASS组

问题根源

直接用filter(df, VALUE>0)会删除组内VALUE=0的单行数据,导致该CLASS在热图中缺失对应样本的位置,进而出现空白方块。我们需要的是剔除所有样本全为0的CLASS组,而非组内单个0值行。

解决步骤及代码示例

1. 构造示例数据

library(dplyr)
library(tidyr)
library(pheatmap)

# 模拟你的数据结构
df <- tibble(
  CLASS = rep(c("A", "B", "C", "D"), each = 3),
  SAMPLE = rep(c("X", "Y", "Z"), 4),
  VALUE = c(1, 0, 2, 0, 3, 0, 4, 5, 0, 0, 0, 0)
)

2. 筛选符合条件的CLASS组

先找出所有至少包含一个非0值的CLASS,再保留这些组的全部数据(包括组内0值行):

# 提取有效CLASS列表
valid_classes <- df %>%
  group_by(CLASS) %>%
  filter(any(VALUE > 0)) %>%
  pull(CLASS) %>%
  unique()

# 过滤原数据,仅保留有效CLASS的所有行
filtered_df <- df %>%
  filter(CLASS %in% valid_classes)

3. 转换为热图所需格式并绘图

热图工具通常需要宽格式数据(行=CLASS,列=SAMPLE),转换后即可生成无空白的热图:

# 转宽格式并设置行名为CLASS
heatmap_matrix <- filtered_df %>%
  pivot_wider(names_from = SAMPLE, values_from = VALUE) %>%
  column_to_rownames("CLASS")

# 生成热图
pheatmap(heatmap_matrix)

用ggplot2绘制热图(可选)

如果偏好ggplot2风格,可直接用长格式数据绘图:

library(ggplot2)
ggplot(filtered_df, aes(x = SAMPLE, y = CLASS, fill = VALUE)) +
  geom_tile(color = "white") +
  scale_fill_gradient(low = "white", high = "#2c3e50") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

内容的提问来源于stack exchange,提问作者Andrea Colautti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:32:48