首页 > 解决方案 > 缩放热图上的geom_point大小以正确适合R?

问题描述

基本上,我有一个包含一些点的热图。我试图做的是针对不同大小的热图以合理的方式自动重新调整点的大小。例如,如果我有一个看起来像这样的热图:

library(reshape)
library(ggplot2)
library(ggnewscale)

# Create matrix
set.seed(1701)
a <- sample(1:10,100, replace=TRUE)
s <- matrix(a, nrow = 5, ncol=5)
s[upper.tri(s)] = t(s)[upper.tri(s)]
rownames(s) <- colnames(s) <- paste0("x", 1:5)
diag(s) <- 0
sDf <- melt(s)

# create diagonal values
diagDf <- data.frame(
  var1 = c(paste0("x", 1:5)),
  var2 = c(paste0("x", 1:5)),
  val = c(2,5,3,1,5)
)

# 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 = 20) +
  theme(aspect.ratio = 1) 

热图示例

所以在上图中,对角线包含geom_points并且它们的大小手动设置为size = 20...。这适用于本示例,但问题是:如果热图尺寸更改为 20x20,则将大小硬编码为等于 20 韩元由于重叠和点太大等而无法工作。

所以我想做的是想出一种方法,它会自动调整点的大小以有效地填充它们所包含的正方形,而不会重叠、太大或太小。

关于我如何做到这一点的任何建议?

标签: rggplot2

解决方案


我会做这样的事情:

library(reshape)
library(ggplot2)
library(ggnewscale)

n <- 5
# Create matrix
set.seed(1701)
a <- sample(1:10,100, 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 = c(paste0("x", 1:n)),
  var2 = c(paste0("x", 1:n)),
  val = sample(1:5,n,replace = T)
)

# 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 = 1/sqrt(nrow(sDf))*80) +
  theme(aspect.ratio = 1) 

这里点的大小取决于矩阵的维度。

3x3、5x5 和 10x10 矩阵的输出示例

在此处输入图像描述


推荐阅读