我有一个用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,并将变量设置为TRUE
或NA
,并使用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"))
但是渲染效果不是那么干净,边框似乎被“不可见”的NA边框所覆盖。
如何改善图表?还有其他方法吗? 谢谢
答案 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"))
您的问题与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"))
另一方面,它同意以下想法:无法在同一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())