我同意Alex的回答,但是违背了我的科学和设计判断,我还是尝试了一下。
require(gridExtra)
require(dplyr)
iris %>% group_by(Species) %>%
do(gg = {ggplot(., aes(Petal.Width, Petal.Length, fill = Sepal.Width)) +
geom_tile() + facet_grid(~Species) +
guides(fill = guide_colourbar(title.position = "top")) +
theme(legend.position = "top")}) %>%
.$gg %>% arrangeGrob(grobs = ., nrow = 1) %>% grid.arrange()
当然,这样做会产生大量重复的标签,令人讨厌。此外,通过将每个物种作为单独图形而不是单个图形的facet来绘制,你会失去x
和y
比例尺信息。你可以通过在ggplot调用中添加... + coord_cartesian(xlim = range(iris$Petal.Width), ylim = range(iris$Petal.Length)) + ...
来修正坐标轴。
说实话,这只有在比较填充的两个不同变量时才有意义,这就是为什么你不关心在图之间比较它们的真实值。一个好的替代方法是使用dplyr :: group_by()
和 dplyr :: percent_rank
在facets内对它们进行百分位数重新缩放。
编辑更新:
在两个不同变量的情况下,你必须先“melt”数据,我假设你已经这样做了。这里我将其与iris
数据一起重复。然后,你可以通过检查两个变量的百分位数而不是绝对值来查看它们的相对值。
iris %>%
tidyr::gather(key = Sepal.measurement,
value = value,
Sepal.Length, Sepal.Width) %>%
group_by(Sepal.measurement) %>%
mutate(percentilevalue = percent_rank(value)) %>%
ggplot(aes(Petal.Length, Petal.Width)) +
geom_tile(aes(fill = percentilevalue)) +
facet_grid(Sepal.measurement ~ Species) +
scale_fill_continuous(limits = c(0,1), labels = scales::percent)
facet_wrap
似乎是一个简单的捷径。 - Dan这个问题之前已经被问过了。这是我目前看到的最好的解决方案,但从可视化的角度来看,使用相同的调色板更为理想。