如何删除 geom_tile 中图块之间的空白区域并更改图块大小

How to remove empty spaces between tiles in geom_tile and change tile size

我有一个结构如下的 df:

    id   col1  col2  col3
#1  A     1     3     3
#2  B     2     2     3
#3  C     1     2     3
#4  D     3     1     1

我想创建一个“类似热图”的图形,其中 col1-col3 被视为一个因子变量(有五个级别 1-5,此处未全部显示)并根据它们的值获得不同的颜色。我已经通过以下代码取得了相对较远的进展:

df <- melt(df, id.vars="id")
p <- ggplot(df, aes(x=variable, y=id, label=value, fill=as.factor(value))) + 
  geom_tile(colour="white", alpha=0.2, aes(width=0.4)) +
  scale_fill_manual(values=c("yellow", "orange", "red", "green", "grey")) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
  labs(x = "Value", y="id") +
  scale_x_discrete(expand=c(0,0))+
  scale_y_discrete(expand=c(0,0))

但是,出于某种原因,我的图块之间在 x 轴上(即每个因子级别之间)有很大的灰色空白空间。 输出图像看起来像这样

此外,我在每个图块的中间都有这些细白线
所以我想做的是: 1- 改变瓷砖的大小和形状(希望它是正方形并且比现在小) 2- 删除图块中间的白线。

谢谢!

图块之间的间隙:将 width=0.4 更改为 width=1 或将其删除。

图块之间的白线:它们来自参数 colour="white" - 如果需要,请将其删除

图块上的线是背景线,考虑到透明度参数 alpha=0.2 - 将其更改为更高的值或在末尾 + theme(panel.grid.major = element_blank()) 删除线

总结:

ggplot(df, aes(x=variable, y=id, label=value, fill=as.factor(value))) + 
  geom_tile(alpha=0.2) +
  scale_fill_manual(values=c("yellow", "orange", "red", "green", "grey")) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
  labs(x = "Value", y="id") +
  scale_x_discrete(expand=c(0,0))+
  scale_y_discrete(expand=c(0,0))+
  theme(panel.grid.major = element_blank())

OP。我注意到,在您对另一个答案的回应中,您对问题进行了一些提炼。我建议您编辑您的原始问题以反映您想要做的一些事情,但这里是总结您想知道的内容的总体情况:

  • 如何去除图块之间的灰色space
  • 如何让方块变小
  • 如何让瓷砖更方正

以下是依次解决每个问题的方法。

如何去除图块之间的灰色 space

这已经在评论和@dy_by 的另一个回答中得到了回答。 tile geom 具有 width 属性,它决定了相对于坐标系 的图块有多大 ,其中 width=1 表示图块“接触”另一个。这部分很重要,因为瓦片的大小不同于瓦片相对于坐标系的大小。如果设置 width=0.4,则图块的大小将设置为占据 x 和 y 中一个离散值之间区域的 40%。这意味着,如果您有除 width=1 以外的任何值,那么您将在方块之间有“space”。

如何让方块变成正方形

tilegeom 绘制的是方形图块,因此输出中的图块不是正方形的原因与 geom 无关 - 它与坐标系和图形设备绘图有关它在你的程序中。默认情况下,ggplot2 将以与图形设备相匹配的宽高比绘制坐标系。更改设备视口的大小(window),坐标系(和图块)的纵横比也会发生变化。有一种简单的方法可以将其固定为“正方形”,即使用 coord_fixed()。您可以设置任何您想要的纵横比,但默认情况下,它将设置为 1(正方形)。

如何让方块变小

同样,您的图块大小不受 geom_tile() 函数...或坐标系控制。它由您在图形设备中设置的视口控制。请注意,坐标系和几何图形将调整大小,但文本将保持不变。这意味着,如果您缩小视口或 window,您的图块会变小,但文本的大小(相对而言)会显得更大。通过调用 ggsave() 用不同的参数为 width= 和你的情节来试试这个。

放在一起

因此,这是我关于如何更改代码以解决所有这些问题的建议。请注意,我还建议您将主题更改为 theme_classic() 或类似内容,默认情况下会删除网格线并将背景颜色设置为白色。它适用于像这样的瓦片地图。

p <- ggplot(df, aes(x=variable, y=id, label=value, fill=as.factor(value))) + 
  geom_tile(colour="white", alpha=0.2, width=1) +
  scale_fill_manual(values=c("yellow", "orange", "red", "green", "grey")) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
  labs(x = "Value", y="id") +
  scale_x_discrete(expand=c(0,0))+
  scale_y_discrete(expand=c(0,0)) +
  coord_fixed() +
  theme_classic()
p

现在用不同的 width= 设置保存该图,以向您展示大小调整的变化情况。您不必指定 height=,因为纵横比固定为 1。

ggsave("example_big.png", plot=p, width=12)

ggsave("example_small.png", plot=p, width=3)