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

ggplot多变量热图绘制:pivot_longer数据转换报错求助

解决pivot_longer类型冲突报错及蛋白表达热图绘制方案

错误原因

pivot_longer报错「无法合并CellLine 和Protein1 」,本质是指定转换的列中同时包含字符型细胞系列和数值型蛋白列,两种数据类型无法合并到同一value列,导致类型冲突。你用cols=3:45按位置指定转换范围,容易因列数变化或列位置误判,把细胞系列包含进转换范围。

解决方案

1. 修正宽转长代码(核心)

放弃按位置索引列,改用排除细胞系列的方式精准指定转换范围,避免类型冲突:

library(tidyr)
library(dplyr)

# 宽格式转长格式,排除CellLines列(实际数据中的细胞系列名)
CtrlsMatrixed <- ControlsDF %>% 
  pivot_longer(
    cols = -CellLines,  # 排除细胞系列,转换所有蛋白列
    names_to = "GeneSignature",
    values_to = "ExpressionValue",  # 明确值列名称
    values_ptypes = list(ExpressionValue = double())  # 强制值列为数值型,彻底避免类型问题
  )

2. ggplot绘制热图代码

基于转换后的长格式数据,绘制符合需求的热图:

library(ggplot2)

ggplot(CtrlsMatrixed, aes(x = GeneSignature, y = CellLines, fill = ExpressionValue)) +
  geom_tile(color = "white") +  # 瓦片添加白色边框,增强区分度
  scale_fill_gradient(low = "#f7fbff", high = "#08306b") +  # 蓝白渐变配色,可自行调整
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1),  # x轴蛋白名旋转90度,避免重叠
    panel.grid = element_blank(),  # 移除网格线,突出热图
    axis.title = element_text(size = 12, face = "bold")
  ) +
  labs(
    x = "蛋白标志物",
    y = "细胞系",
    fill = "表达值"
  )

关键说明

  • 用cols = -CellLines替代位置索引,无论数据列数如何变化,都能精准排除细胞系列,从根源解决类型冲突
  • values_ptypes参数强制值列为数值型,确保后续颜色映射逻辑正常
  • 热图的颜色渐变、主题样式可根据需求自行调整,比如替换scale_fill_gradient为scale_fill_viridis_c()使用更友好的配色

内容的提问来源于stack exchange,提问作者Jeremy bravo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:46:01