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))
当前图例效果

期望图例效果

解决方法
问题排查与修改点:
- 修正breaks参数笔误:原代码中将目标刻度
100误写为150,先修正该错误; - 强制显示所有指定刻度:默认colorbar会自动调整刻度展示逻辑,需通过
guide_colorbar()强制开启所有指定刻度,同时设置显示上下限刻度; - 截断超出范围的数据:数据中存在OR=204.97超过设定的200上限,需设置
limits = c(0.1, 200)避免颜色溢出; - 优化图例空间:调整图例高度,确保所有刻度有足够展示空间。
修改后完整代码
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
相关产品推荐
相关产品推荐

