8

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

以下是显示问题的示例。对于不同type的 data.frame df,范围z可能会如此不同。如果我们用同样的审美界限fill,一些z价值很小的面板,将很难看到细节。

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))
ggplot(tmp,aes(x,y))+geom_tile(aes(fill=z))+facet_wrap(~type,scales="free")
4

2 回答 2

7

我知道这是一个老问题,但我最近遇到了同样的问题并想出了我想分享的这个解决方案。诀窍是使用from收集geom_tile()嵌套数据框中各个图所需的数据集,然后使用包中的函数和包装函数来创建各个图:nest()tidyrmap2()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)

具有不同色标的地图的网格图

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

> 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()以微调图。

于 2017-03-21T17:52:41.597 回答
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)这样我就不必手动标准化。

于 2014-09-16T05:12:23.987 回答