在ggplot2中一起使用函数geom_tile
和facet_wrap
时,如何设置审美fill
的不同限制,作为可以设置为{scales
的选项free/free_y/free_x
{1}}中的{1}}
以下是显示问题的示例。对于data.frame facet_wrap
中的不同type
,df
的范围可能会如此不同。如果我们使用相同的审美限制z
,那么fill
部分具有非常小的价值的一些panle将很难看到细节。
z
答案 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)
嵌套数据框包含两个列表列,其中包含数据集和图:
> 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()
以微调图。