我创建了一个热图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)
我的选择是使用color
aes 并将变量设置为TRUE
orNA
并使用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 边界覆盖。
如何改进我的图表?还有另一种方法吗?谢谢你
似乎边界不是由实际上不存在的“不可见”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
边框应该是不可见的。
您可以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)