在ggplot图中为每个分面设置不同的颜色条

3

假设我用gpplot2制作了下面这样的图形,并包含了多个方面:

ggplot(iris) + 
  geom_tile(aes(x = Petal.Width, fill = Sepal.Width, y = Petal.Length)) +
  facet_wrap(~Species)

请注意,三个图形共用一个颜色条,但每个分面可能具有非常不同的值。是否可以为每个分面单独使用颜色条?

enter image description here


1
我认为小多面板(facetting)的重点在于能够比较和对比不同的子组;拥有不同的颜色比例尺有点否定了这个意图。考虑到这一点,我认为解决您的问题的方法是创建单独的图形,并将它们并排显示在一个共同的页面上。 - baptiste
我觉得你是对的。真正的情节并不是子组,只是我想一起展示的东西,所以也许单独的情节是解决方法。我只是想用更简洁的代码,这似乎是一种简单的方式。 - Dan
3个回答

3

我同意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()

enter image description here

当然,这样做会产生大量重复的标签,令人讨厌。此外,通过将每个物种作为单独图形而不是单个图形的facet来绘制,你会失去xy比例尺信息。你可以通过在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)

enter image description here


谢谢,@Brian。我正在绘制的是不同的变量,因此使用不同的比例尺是有意义的。我只是试图在我的代码中尽可能简洁,并且facet_wrap似乎是一个简单的捷径。 - Dan

2

ggplot中facet_grid的不同调色板

这个问题之前已经被问过了。这是我目前看到的最好的解决方案,但从可视化的角度来看,使用相同的调色板更为理想。


2
我认为这不是我所问的同一件事情,因为在那个解决方案中,colourbar 对于所有图形都是相同的。 - Dan

0

the colour scheme

如果这是你想要的,那么有一个简单的技巧可以实现。
tf1 <- iris
tf1$COL <- rep(1:50, each=3)

ggplot(tf1) + 
  geom_tile(aes(x = Petal.Width, fill = interaction(Petal.Length,COL), y = Petal.Length)) +
  facet_wrap(~Species, scales = "free") + theme(legend.position="none")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接