R语言热图中geom_point大小如何自适应缩放适配不同尺寸热图
解决方案
方案1:动态计算点尺寸(最简单,无需额外包)
逻辑:你的热图是n行n列的正方形,固定aspect.ratio=1,因此每个单元格的尺寸和n成反比,硬编码的size可以改成和n成反比的动态值,校准系数用你原来5*5时的适配值即可。
原示例中n=5时size=20适配刚好,因此动态公式为 size = 100/n (n为热图的行列数),不管n是5还是20都自动适配。
修改后的完整代码:
library(reshape) library(ggplot2) library(ggnewscale) # 定义热图维度,可随意修改 n <- 5 # Create matrix set.seed(1701) a <- sample(1:10, n*n, replace=TRUE) s <- matrix(a, nrow = n, ncol=n) s[upper.tri(s)] = t(s)[upper.tri(s)] rownames(s) <- colnames(s) <- paste0("x", 1:n) diag(s) <- 0 sDf <- melt(s) # create diagonal values diagDf <- data.frame( var1 = paste0("x", 1:n), var2 = paste0("x", 1:n), val = sample(1:5, n, replace = TRUE) ) # make plot ggplot(sDf, aes(X1,X2)) + geom_tile(aes(fill = value)) + scale_fill_gradientn(colors = rev(colorspace::sequential_hcl(palette = "Blues 3", n = 100))) + new_scale_fill() + # 动态计算点大小 geom_point(data = diagDf, aes(var1, var2, col = val), size = 100/n) + theme(aspect.ratio = 1)
如果调整导出图片的整体尺寸,只需要对应调整100这个校准系数即可。
方案2:使用相对单位(完全自适应,无需校准)
如果不想手动调整校准系数,可以直接用ggplot支持的相对绘图单位npc,点的直径直接按单元格的占比设置,不管热图维度、导出尺寸怎么变都能自动适配,只需要修改geom_point的参数即可:
geom_point(data = diagDf, aes(var1, var2, col = val), size = unit(0.9/n, "npc"))
这里的0.9代表点占单元格宽度的90%,可以根据你要的边距大小调整,比如要留更多边距就改成0.8,要填得更满就改成0.95。
注意事项
- 如果调整了坐标轴的
expand参数(比如给热图四周加了额外空白),可以对应调整上述两个方案里的系数适配即可。 - 如果是矩形热图(行列数不等),可以取行列数的最小值做计算,保证点不会溢出短边的单元格。
内容的提问来源于stack exchange,提问作者Electrino
相关产品推荐
相关产品推荐

