使用 position_jitterdodge 在分面图中子集点

subsetting points in a faceted plot using position_jitterdodge

我想在 ggplot 中创建一个图形,使用 alpha 参数强调点的子集。每个点代表五个变量的组合:

因为许多点彼此共享部分或完全重叠,所以我想使用 position = position_jitterdodge 参数抖动这些点,以 (1) 在其 x 轴变量中将值分成组,以及 (2 ) 将颜色应用于每个离散组。

当我尝试将 alpha 参数应用于这些点的子集时,我的问题就出现了。在我尝试生成此图时,我的点没有在它们各自的 x 轴位置内的那些组中排列。发生这种情况是因为(在此示例中)这些组中的一个在该子集中完全缺少数据。因此,对于一半的图,该图会自动将这些剩余的点挤得更近,但对于所有组都有一些数据要绘制的另一半则不会。我错误地在 x 轴上的分组点之间有效地创建了两个不同的宽度。

我想强迫它停止这样做,并且非常感谢任何人可以提供有关如何这样做的帮助。

这是我的问题的典型示例:

xval <- rep(c(rep("a", 160), rep("b", 160)),2)
yval <- c(runif(320, min = 0.51, max = 0.99), runif(310, min = 0.01, max = 0.49), rep(NA, 10))
yfacet <- rep(c(rep("night", 10), rep("day", 10)),32)
xfacet <- rep(c(rep("apples", 20), rep("oranges", 20)), 16)
colorgroup <- rep(c(rep("first", 40), rep("second", 40), rep("third", 40), rep("whoops", 40)),4)

df <- data.frame(xval, yval, xfacet, yfacet, colorgroup)
df$yfacet <- factor(df$yfacet, levels = c("night", "day"))

如果我尝试在没有任何子集的情况下绘制这些数据,我所有的点都会按预期排列到那些抖动和闪避的 x 轴组中。请注意 ggplot 发出的警告,指出有 10 个缺失值 - 这些值从图中所有面板的最右下角缺失...... colorgroup 中的蓝色“哎呀”点=40=]oranges ~ day facet, in group b of the x-axis:

ggplot() +
  geom_point(data = df,
             aes(x=xval, y=yval, color=colorgroup),
             position = position_jitterdodge(jitter.width = 0.1)) +
  facet_grid(xfacet ~ yfacet) +
  scale_color_manual(values = c("red", "black", "orange", "blue"))

我的意图是采用相同的绘图,但仅对 yval 大于 0.5 的那些点使用 alpha 参数。这是我使用的论点,它在同一个右下角面板中产生了一个问题 - 请注意 day ~ oranges 方面,在 x 轴 b组,点数不再排队?我想知道我可能会做些什么来解决这个对齐问题:

ggplot() +
  geom_point(data = df %>% filter(yval > 0.5),
             aes(x=xval, y=yval, color=colorgroup),
             position = position_jitterdodge(jitter.width = 0.1),
             alpha = 0.1) +
  geom_point(data = df %>% filter(yval <= 0.5),
             aes(x=xval, y=yval, color=colorgroup),
             position = position_jitterdodge(jitter.width = 0.1)) +
  facet_grid(xfacet ~ yfacet) +
  scale_color_manual(values = c("red", "black", "orange", "blue"))

感谢您的关心和帮助

试试这个方法。您可以根据 y 值来调节 alpha 参数以分配透明级别。在您的方法中,您使用过滤器。最好尽量把所有的美学元素都设置在ggplot2中,以免出现不对齐等问题。这里的代码:

library(ggplot2)
#Plot
ggplot() +
  geom_point(data = df,
             aes(x=xval, y=yval,
                 color=colorgroup,alpha=ifelse(yval>0.5,0.5,1)),
             position = position_jitterdodge(jitter.width = 0.1)) +
  facet_grid(xfacet ~ yfacet) +
  scale_color_manual(values = c("red", "black", "orange", "blue"))+
  scale_alpha(guide = 'none')

输出: