ggplot图中每个方面的不同颜色条
Different colourbar for each facet in ggplot figure
说,我制作了一个 gpplot2
情节,如下所示,有几个方面:
ggplot(iris) +
geom_tile(aes(x = Petal.Width, fill = Sepal.Width, y = Petal.Length)) +
facet_wrap(~Species)
请注意,所有三个图都有一个颜色条,但每个方面可能具有非常不同的值。是否可以为每个方面设置单独的颜色条?
之前有人问过。这是迄今为止我见过的最好的解决方案,但我认为从可视化的角度来看,拥有一个通用的调色板更为理想。
我同意 ,但违背了我更好的科学和设计判断,我试了一下。
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
.
将它们重新调整为一个方面内的百分位数
编辑更新:
在两个不同变量的情况下,您必须首先 "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)
说,我制作了一个 gpplot2
情节,如下所示,有几个方面:
ggplot(iris) +
geom_tile(aes(x = Petal.Width, fill = Sepal.Width, y = Petal.Length)) +
facet_wrap(~Species)
请注意,所有三个图都有一个颜色条,但每个方面可能具有非常不同的值。是否可以为每个方面设置单独的颜色条?
之前有人问过。这是迄今为止我见过的最好的解决方案,但我认为从可视化的角度来看,拥有一个通用的调色板更为理想。
我同意
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
.
编辑更新:
在两个不同变量的情况下,您必须首先 "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)