geom_tile:清洁对角瓷砖边框

时间:2018-11-09 15:43:48

标签: 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))

我的选择是使用color aes,并将变量设置为TRUENA,并使用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"))

enter image description here

但是渲染效果不是那么干净,边框似乎被“不可见”的NA边框所覆盖。

如何改善图表?还有其他方法吗? 谢谢

2 个答案:

答案 0 :(得分:4)

似乎边界不是由“不可见”的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"))

enter image description here

您的问题与another one有关,其中所有图块都有一个边框,目标是它们不重叠。然后可以调整图块大小以创建边框空间。但是,在这种情况下,通过调整磁贴大小,我们会产生一些间隙,这会使情况看起来更糟。

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"))

enter image description here

另一方面,它同意以下想法:无法在同一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))

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

答案 1 :(得分:4)

没有第二次geom_tile()通话:

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())

tiles