使用facet_grid时,是否可以为x和y(例如大小)以外的美学设置自由刻度?

时间:2019-02-07 16:55:24

标签: r ggplot2 facet-wrap facet-grid

facet_grid和facet_wrap具有 scales 参数,据我所知,该参数允许每个图将x和/或y轴的比例调整为要绘制的数据。由于根据ggplot的语法,x和y只是众多美学中的两种,并且每种美学都有一定的标度,因此我认为可以选择让每种美学自由是合理的,但是到目前为止,我还没有发现一种方法。

我试图特别针对“大小”进行设置,因为有时变量会以不同的数量级存在,具体取决于我用于构面的组,并且每个组具有相同的比例会阻止看到组内差异。

可复制的示例:

set.seed(1)
x <- runif(20,0,1)
y <- runif(20,0,1)
groups <- c(rep('small', 10), rep('big', 10))
size_small <- runif(10,0,1)
size_big   <- runif(10,0,1) * 1000

df <- data.frame(x, y, groups, sizes = c(size_small, size_big))

以及用于绘图的辅助功能:

basic_plot <- function(df) ggplot(df) + 
  geom_point(aes(x, y, size = sizes, color = groups)) + 
  scale_color_manual(values = c('big' = 'red', 'small' = 'blue')) +
  coord_cartesian(xlim=c(0,1), ylim=c(0,1))

如果我按原样绘制数据,则会得到以下信息:

basic_plot(df)

Non faceted plot

蓝点相对较小,但是我们无能为力。 如果我们添加构面:

basic_plot(df) +
  facet_grid(~groups, scales = 'free')

Faceted plot

蓝点继续很小。但我想利用我将数据一分为二并允许大小比例调整为每个图的数据这一事实。我想要以下内容:

plot_big <- basic_plot(df[df$groups == 'big',])
plot_small <- basic_plot(df[df$groups == 'small',])

grid.arrange(plot_big, plot_small, ncol = 2)

What I want

是否可以不采用这种微观管理或手动重新缩放以下尺寸来完成?

df %>% 
  group_by(groups) %>% 
  mutate(maximo = max(sizes),
         sizes = scale(sizes, center = F)) %>% 
  basic_plot() +
  facet_grid(~groups)

我可以做到这些,我只是想看看我是否没有错过其他选择,或者是否误解了图形语法。

谢谢您的时间!

1 个答案:

答案 0 :(得分:2)

如前所述,调用facet_wrap时可以保持原始情节的美感。由于需要分组图,因此请考虑用base::by包装的do.call(子集数据框架功能):

do.call(grid.arrange, 
        args=list(grobs=by(df, df$groups, basic_plot), 
                  ncol=2,
                  top="Grouped Point Plots"))

Grouped Plot Output


如果您需要共享图例,我总是使用@Steven Lockton's answer

中的这个包装器
do.call(grid_arrange_shared_legend, by(df, df$groups, basic_plot))

Shared Legend Plot Output