geom_tile :清洁对角瓷砖边框

Jul*_*rre 5 r ggplot2

我创建了一个热图geom_tile,其中 x 和 y 值相同并以相同的方式排序。我想在图表对角线的瓷砖周围放置黑色边框。

set.seed(42L)
data <- data.frame(x = rep(letters[1:3], each = 3L), 
                   y = rep(letters[1:3], 3L), 
                   fill = rnorm(9L))
Run Code Online (Sandbox Code Playgroud)

我的选择是使用coloraes 并将变量设置为TRUEorNA并使用scale_color_manual删除NA值的灰色边框。

data$diag <- data$x == data$y
data$diag[!data$diag] <- NA

ggplot(data, aes(x = x, y = y, fill = fill)) +
  geom_tile(aes(color = diag), size = 2) +
  scale_color_manual(guide = FALSE, values = c(`TRUE` = "black"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

但是渲染不是那么干净,边界似乎有点被“不可见”的 NA 边界覆盖。

如何改进我的图表?还有另一种方法吗?谢谢你

Jul*_*ora 6

似乎边界不是由实际上不存在的“不可见”NA 边界覆盖,而是由图块本身覆盖。这意味着我们正在处理层的顺序。然后我们可以尝试的是首先添加一个平原geom_tile,然后添加另一个geom_tile仅使用对角线瓷砖数据的边框。那是,

ggplot(data, aes(x = x, y = y, fill = fill)) + geom_tile() +
  geom_tile(data = data[!is.na(data$diag), ], aes(color = diag), size = 2) +
  scale_color_manual(guide = FALSE, values = c(`TRUE` = "black"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您的问题与另一个问题有关,其中所有瓷砖都有边框,目标是让它们不重叠。然后可以调整平铺大小以创建边框空间。然而,在这种情况下,通过调整瓦片大小,我们会产生一些间隙,这会让事情看起来更糟。

ggplot(data, aes(x = x, y = y, fill = fill)) +
  geom_tile(aes(color = diag), width = 0.98, height = 0.98, size = 2) +
  scale_color_manual(guide = FALSE, values = c(`TRUE` = "black"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

另一方面,它同意在同一个geom_tile调用中无法调整图层顺序的想法。

最后,受@utubun 回答启发的另一种选择。

data$diag <- data$x == data$y
ggplot(data[order(data$diag), ], aes(x = x, y = y, fill = fill)) +
  geom_tile(aes(color = diag), size = 2) +
  scale_color_manual(guide = FALSE, values = c(`TRUE` = "black", `FALSE` = NA))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们对调用内部的数据进行排序,但还需要指定FALSE边框应该是不可见的。


utu*_*bun 6

您可以geom_tile()通过更改原始 data.frame 的顺序(确保最后绘制带边框的图块)而无需第二次调用即可达到所需的结果:

set.seed(42L)
dat <- data.frame(x = rep(letters[1:3], each = 3L), 
                   y = rep(letters[1:3], 3L), 
                   fill = rnorm(9L)) %>%
  dplyr::mutate(isdiag = (x == y)) %>%
  arrange(isdiag)

  ggplot(dat, aes(x = x, y = y, fill = fill)) +
  geom_tile(size = 2, colour = dat$isdiag) +
  theme_bw() +
  theme(axis.title = element_blank())
Run Code Online (Sandbox Code Playgroud)

瓷砖