ggplot图中每个方面的不同颜色条
Posted
技术标签:
【中文标题】ggplot图中每个方面的不同颜色条【英文标题】:Different colourbar for each facet in ggplot figure 【发布时间】:2021-10-02 20:13:47 【问题描述】:说,我制作了一个类似以下的gpplot2
情节,其中包含多个方面:
ggplot(iris) +
geom_tile(aes(x = Petal.Width, fill = Sepal.Width, y = Petal.Length)) +
facet_wrap(~Species)
请注意,所有三个图都有一个颜色条,但每个方面可能具有非常不同的值。每个方面是否可以有一个单独的颜色条?
【问题讨论】:
我认为小倍数(分面)的重点是能够比较和对比不同的子组;具有不同的色阶会否定意图。考虑到这一点,我认为您的问题的解决方案是创建单独的图,并将它们并排显示在一个公共页面上。 我认为你是对的。真正的情节并不是真正的子群,只是我想一起展示的东西,所以也许单独的情节是要走的路。我只是想让我的代码更简洁一点,这似乎是一种简单的方法。 【参考方案1】:我同意Alex's answer,但在我更好的科学和设计判断的情况下,我尝试了一下。
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()
当然,然后你会复制很多标签,这很烦人。此外,您会丢失x
和y
的比例信息,因为您将每个物种绘制为单独的图,而不是单个图的各个方面。您可以通过在该 ggplot 调用中添加 ... + coord_cartesian(xlim = range(iris$Petal.Width), ylim = range(iris$Petal.Length)) + ...
来修复轴。
老实说,唯一有意义的方法是比较两个不同的变量进行填充,这就是为什么您不关心在绘图之间比较它们的真实值的原因。一个不错的选择是使用dplyr::group_by()
和dplyr::percent_rank
将它们重新缩放到构面内的百分位数。
编辑更新:
在两个不同变量的情况下,您必须首先“融化”数据,我假设您已经这样做了。在这里,我用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)
【讨论】:
谢谢,@Brian。我正在绘制的东西实际上是不同的变量,所以有不同的比例是有意义的。我只是想在我的代码中尽可能简短,facet_wrap
似乎是一个简单的捷径。【参考方案2】:
Separate palettes for facets in ggplot facet_grid
以前有人问过。这是迄今为止我见过的最好的解决方案,但是我认为从可视化的角度来看,使用通用调色板更理想。
【讨论】:
我不认为这与我要问的完全一样,因为 colourbar 对于该解决方案中的所有图都是相同的。以上是关于ggplot图中每个方面的不同颜色条的主要内容,如果未能解决你的问题,请参考以下文章