使用ggplot2绘制一组列对另一组

时间:2018-01-12 04:19:17

标签: r ggplot2 tidyr tidyverse

可以ggplot2用于创建一组列与另一组的绘图矩阵吗?

例如,使用下面的数据框绘制所有以' x'开头的列。对于以' y'开头的所有列,以生成图表网格。

require("tidyverse")

df <- tibble(
  x1 = sample(10),
  x2 = sample(10),
  x3 = sample(10),
  y1 = sample(10),
  y2 = sample(10)
)

如果不像上面的例子那样,列没有以常规模式命名 - 那么可以选择任意一组列吗?

提前致谢

3 个答案:

答案 0 :(得分:2)

最简单的方法可能只是循环所有可能的组合,制作相应的图,然后将所有组合成网格。

require("tidyverse")

df <- tibble(
  x1 = sample(10),
  x2 = sample(10),
  x3 = sample(10),
  y1 = sample(10),
  y2 = sample(10)
)


group1 <- c("x1", "x2", "x3") # set of variables along x axis
group2 <- c("y1", "y2") # set of variables along y axis

plotlist <- list()
for (x in group1) {
  for (y in group2) {
    p <- ggplot(df, aes_string(x, y)) + geom_point() + ggtitle(paste0(y, " versus ", x))
    plotlist <- append(plotlist, list(p))
  }
}

cowplot::plot_grid(plotlist = plotlist)

enter image description here

这里的最后一步使用了我写的cowplot包。或者,您可以使用egg包中的ggarrange将图形放入网格中。

答案 1 :(得分:2)

您可以使用tidyr::gather重新塑造其他方面:

df_long <- df %>% 
  gather(x_axis, x, contains("x")) %>% 
  gather(y_axis, y, contains("y"))
# A tibble: 60 x 4
   x_axis     x y_axis     y
    <chr> <int>  <chr> <int>
 1     x1    10     y1     6
 2     x1     6     y1    10
 3     x1     5     y1     3
 4     x1     7     y1     8
 5     x1     8     y1     2
 6     x1     1     y1     1
 7     x1     3     y1     5
 8     x1     9     y1     9
 9     x1     4     y1     7
10     x1     2     y1     4
# ... with 50 more rows

您可以使用任何其他contains选择功能代替tidyverse,或只提供原始列名称。

然后绘制:

ggplot(df_long, aes(x, y)) + 
    geom_point() + 
    facet_grid(y_axis ~ x_axis, switch = "both") +
    labs(x = NULL, y = NULL) +
    theme(strip.placement = "outside", strip.background = element_blank())

enter image description here

如果你需要自由秤,你可以换一下:

ggplot(df_long, aes(x, y)) + 
    geom_point() + 
    facet_wrap(~ interaction(y_axis, x_axis), scales = "free")

enter image description here

答案 2 :(得分:1)

为了完整起见,这是一个使用ggduo包中GGally的解决方案(我刚刚意识到的一个函数)

require(GGally)    
df %>% ggduo(columnsX = 1:3, columnsY = 4:5)