当使用facet_wrap和geom_tile时,改变填充比例

时间:2013-06-09 03:54:43

标签: r ggplot2 tile facet

在ggplot2中一起使用函数geom_tilefacet_wrap时,如何设置审美fill的不同限制,作为可以设置为{scales的选项free/free_y/free_x {1}}中的{1}}

以下是显示问题的示例。对于data.frame facet_wrap中的不同typedf的范围可能会如此不同。如果我们使用相同的审美限制z,那么fill部分具有非常小的价值的一些panle将很难看到细节。

z

2 个答案:

答案 0 :(得分:3)

解决此问题的一种方法是标准化填充变量,以便所有方面的比例相似。

library(dplyr)
tmp1 <- group_by(tmp,type) # grouping the data by type
tmp2 <- mutate(tmp1, z1 = (z-mean(z))/sd(z)) #groupwise standardization 
ggplot(tmp2,aes(x,y))+geom_tile(aes(fill=z1))+facet_wrap(~type,scales="free")

我希望有fill=std(z)这样的内容,以便我不必手动标准化。

答案 1 :(得分:3)

我知道这是一个老问题,但我最近遇到了同样的问题,想出了我想分享的这个解决方案。诀窍是使用geom_tile()中的nest()收集嵌套数据框中各个tidyr图所需的数据集,然后使用map2()包中的purrr函数以及用于创建单个图的包装函数:

library(tidyverse)

pp <- function (n,r=4) {
  x <- seq(-r*pi, r*pi, len=n)
  df <- expand.grid(x=x, y=x)
  df$r <- sqrt(df$x^2 + df$y^2)
  df$z <- cos(df$r^2)*exp(-df$r/6)
  df
}
tmp <- pp(20)
tmp$type <- rep(1:4,each=nrow(tmp)/4)
tmp$z <- tmp$z*(10^(tmp$type))

plot_func <- function(df, name) {
  ggplot(data = df, aes(x = x, y = y, fill = z)) +
    geom_tile() +
    scale_fill_continuous(name = name)
}

nested_tmp <- tmp %>% 
  group_by(type) %>% 
  nest() %>% 
  mutate(plots = map2(data, type, plot_func)) 

gridExtra::grid.arrange(grobs = nested_tmp$plots)

Grid-plot of maps with different color scale

嵌套数据框包含两个列表列,其中包含数据集和图:

> nested_tmp
# A tibble: 4 × 3
     type               data    plots
    <int>             <list>   <list>
  1     1 <tibble [100 × 4]> <S3: gg>
  2     2 <tibble [100 × 4]> <S3: gg>
  3     3 <tibble [100 × 4]> <S3: gg>
  4     4 <tibble [100 × 4]> <S3: gg>    

从这里可以很容易地修改plot_func()以微调图。