让我们看看我是否设法正确解释了我的目标......
我有大量的数据点属于由因子变量控制的各种类别。通过将所有这些一起绘制在一起,无法观察它们是否具有任何特定结构(例如,具有更高密度的特定类别的区域),即使使用低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)
但它需要通过明确复制数据点来使数据框膨胀,以显示在所有可能的因子组合中。更准确地说,行数以二次方式增加。显然,这不是像示例中的数据集那样的问题,但我觉得一旦我使用我的真实数据它就会变得非常低效。除了是一个非常丑陋的代码。
你能帮我找一个更优雅/更有效的方法来解决这个问题吗?
(如果您需要进一步澄清这个hacky代码正在做什么或者为什么我以特定的方式进行,请不要犹豫)
除此之外,正如您所看到的,我正在使用subset
以避免重复信息出现在网格中,但如果有一种方法甚至可以跳过显示空白画布的话会更好。换句话说,你知道以前的情节是否可以某种方式转换为“阶梯”形状吗?
干杯,
弗兰
答案 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)
你失去了传奇,但cowplot
有很好的功能可以自己添加一些标签。
无论如何,在性能方面,这种方法也会复制您的数据,因为ggplot2
将数据存储在其对象中(在这种情况下是子集)。我不希望它在这方面会比你自己的解决方案做得更好。