创建ggplot2网格,在一个因子中使用成对的级别作为“比较”的变量

时间:2016-02-27 18:08:58

标签: r ggplot2

让我们看看我是否设法正确解释了我的目标......

我有大量的数据点属于由因子变量控制的各种类别。通过将所有这些一起绘制在一起,无法观察它们是否具有任何特定结构(例如,具有更高密度的特定类别的区域),即使使用低alpha时也是如此,我试图在网格一次只有两个这样的类别(加上对角线中的单个类别)。

使用下面这个例子的非常hacky代码,我已经设法实现了我的目标:

fact <- factor(c('a', 'b', 'a', 'c', 'b', 'c'))

x <- c(1, 2, -1, 3, -4, 0.5)
y <- c(3, 1, 0.5, 6, 1, 2)

df <- data.frame(class = fact, fact = fact, x = x, y = y)

fact2 <- unique(df$fact)[
  as.numeric(unique(df$fact)) %x% rep(1, nrow(df))]

df <- do.call("rbind", replicate(length(unique(df$fact)),
                       df, simplify = F))
df$fact2 <- fact2

df2 <- df
df2$fact <- df$fact2
df2$fact2 <- df$fact

df3 <- unique(rbind(df, df2))

ggplot(subset(df3, as.numeric(fact) >= as.numeric(fact2)),
   aes(x=x, y=y)) +
  geom_point(aes(colour = class), size = 4) +
  facet_grid(fact ~ fact2)

enter image description here

但它需要通过明确复制数据点来使数据框膨胀,以显示在所有可能的因子组合中。更准确地说,行数以二次方式增加。显然,这不是像示例中的数据集那样的问题,但我觉得一旦我使用我的真实数据它就会变得非常低效。除了是一个非常丑陋的代码。

你能帮我找一个更优雅/更有效的方法来解决这个问题吗?

(如果您需要进一步澄清这个hacky代码正在做什么或者为什么我以特定的方式进行,请不要犹豫)

除此之外,正如您所看到的,我正在使用subset以避免重复信息出现在网格中,但如果有一种方法甚至可以跳过显示空白画布的话会更好。换句话说,你知道以前的情节是否可以某种方式转换为“阶梯”形状吗?

干杯,

弗兰

1 个答案:

答案 0 :(得分:0)

这是使用cowplot包并制作单独图表的另一种方法。

pl <- apply(expand.grid(levels(df$class), levels(df$class)), 1,
  function (cl) {
    ggplot(subset(df, class %in% cl), aes(x=x, y=y)) + 
      geom_point(aes(colour = class), size = 4) +
      xlim(range(df$x)) + ylim(range(df$y)) +
      scale_color_discrete(limits = levels(df$class), guide = FALSE)
  } )

cowplot::plot_grid(plotlist = pl)

enter image description here

你失去了传奇,但cowplot有很好的功能可以自己添加一些标签。

无论如何,在性能方面,这种方法也会复制您的数据,因为ggplot2将数据存储在其对象中(在这种情况下是子集)。我不希望它在这方面会比你自己的解决方案做得更好。