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

ggplot2热图自定义图例:指定OR值标记未全部显示问题求助

问题

用ggplot2绘制OR值(odds ratio)填充的热图,OR值范围0-200,希望图例显示0.1、1、10、50、100、200这几个指定刻度,但当前生成的图例无法全部展示这些标记。

当前代码

# 示例数据框
segments <- c("TssA", "TssBiv", "BivFlnk",  "EnhBiv","ReprPC",  "ReprPCWk", "Quies", "TssAFlnk", "TxFlnk", "Tx", "TxWk", "EnhG", "Enh", "ZNF/Rpts", "Het")
OR <- c(1.4787622, 46.99886002, 11.74417278, 4.49223136, 204.975818, 1.85228517, 0.85762414, 0.67926846, 0.33696213, 0.06532777, 0.10478027, 0.07462983, 0.06501252, 1.32922162, 0.32638438)
df <- data.frame(segments, OR)
map <- df %>% mutate(tissue = 'colon')

ggplot(map, aes(tissue,segments, fill = OR))+ 
  geom_tile(colour="gray80")+
  theme_bw()+
  coord_equal()+
  scale_fill_gradientn(colours=c("lightskyblue1", "white","navajowhite","lightsalmon", "orangered2", "indianred1"),
                       values=rescale(c(0.1, 1, 10, 50, 100, 200)), 
                       guide="colorbar", 
                       breaks=c(0.1, 1, 10, 50, 150, 200))

当前图例效果

当前图例效果

期望图例效果

目标图例效果


解决方法

问题排查与修改点:

  1. 修正breaks参数笔误:原代码中将目标刻度100误写为150,先修正该错误;
  2. 强制显示所有指定刻度:默认colorbar会自动调整刻度展示逻辑,需通过guide_colorbar()强制开启所有指定刻度,同时设置显示上下限刻度;
  3. 截断超出范围的数据:数据中存在OR=204.97超过设定的200上限,需设置limits = c(0.1, 200)避免颜色溢出;
  4. 优化图例空间:调整图例高度,确保所有刻度有足够展示空间。

修改后完整代码

library(ggplot2)
library(scales)
library(dplyr)

# 示例数据框
segments <- c("TssA", "TssBiv", "BivFlnk",  "EnhBiv","ReprPC",  "ReprPCWk", "Quies", "TssAFlnk", "TxFlnk", "Tx", "TxWk", "EnhG", "Enh", "ZNF/Rpts", "Het")
OR <- c(1.4787622, 46.99886002, 11.74417278, 4.49223136, 204.975818, 1.85228517, 0.85762414, 0.67926846, 0.33696213, 0.06532777, 0.10478027, 0.07462983, 0.06501252, 1.32922162, 0.32638438)
df <- data.frame(segments, OR)
map <- df %>% mutate(tissue = 'colon')

ggplot(map, aes(tissue, segments, fill = OR))+ 
  geom_tile(colour="gray80")+
  theme_bw()+
  coord_equal()+
  scale_fill_gradientn(
    colours = c("lightskyblue1", "white","navajowhite","lightsalmon", "orangered2", "indianred1"),
    values = rescale(c(0.1, 1, 10, 50, 100, 200)),
    limits = c(0.1, 200),  # 截断超出范围的OR值
    breaks = c(0.1, 1, 10, 50, 100, 200),  # 指定正确的目标刻度
    guide = guide_colorbar(
      ticks = TRUE,  # 显示刻度线
      draw.ulim = TRUE,  # 显示上限刻度
      draw.llim = TRUE,  # 显示下限刻度
      barheight = unit(8, "cm")  # 调整图例高度,确保所有刻度展示
    )
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:40:41