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

nic*_*ong 7 r facet tile ggplot2

当使用功能geom_tilefacet_wrap一起在GGPLOT2,如何设置的审美的不同的限制fill,作为选项scales,可以被设定为free/free_y/free_xfacet_wrap

以下是显示问题的示例.对于typedata.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")
Run Code Online (Sandbox Code Playgroud)

emi*_*ltb 8

我知道这是一个老问题,但我最近遇到了同样的问题,并提出了我想分享的解决方案。关键是要收集所需个人数据集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)
Run Code Online (Sandbox Code Playgroud)

不同色阶地图的网格图

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

> 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>    
Run Code Online (Sandbox Code Playgroud)

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


Mah*_*der 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")
Run Code Online (Sandbox Code Playgroud)

我希望有类似的东西fill=std(z),这样我就不必手动标准化。