首页 > 解决方案 > 在ggplot2中添加新geom作为新行,防止绘图分层

问题描述

我很确定这很容易做到,但我似乎找不到将这个问题查询到谷歌或堆栈的正确方法,所以我们在这里:

我有一个在 ggplot2 中制作的图,它利用geom_jitter(),有效地为因子中的每个元素创建一行并绘制其值。我想为geom_violin()绘图添加一个补充,但只是将额外的geom_函数添加到绘图代码中会返回两层: thejitter和 the violin,一层在另一层之上(如通常预期的那样)。

编辑:

这就是情节的样子: 在此处输入图像描述 如何在violin不生成第二个情节的情况下将其作为单独的行?支线任务:我怎样才能让jitterviolingeoms 交错?(即元素A抖动行后面跟着元素A小提琴行,然后元素B抖动行后面跟着元素B小提琴行)

这是制作它所需的最低代码(没有所有theme()装饰):

P1 <- ggplot(data=TEST_STACK_SUB, aes(x=E, y=C, col=A)) + 
theme(... , aspect.ratio=0.3) + 
geom_point(position = position_jitter(w = 0.30, h = 0), alpha=0.2, size=0.5) +
geom_violin(data=TEST_STACK_SUB, mapping=aes(x=E, y=C), position="dodge") +
scale_x_discrete() +
scale_y_continuous(limits=c(0,1), breaks=seq(0,1,0.1), 
                  labels=c(seq(0,1,0.1))) + 
scale_color_gradient2(breaks=seq(0,100,20), 
                      limits=c(0,100), 
                      low="green3",
                      high="darkorchid4",
                      midpoint=50,
                      name="") +
coord_flip()

options(repr.plot.width=8, repr.plot.height=2)
plot(P1)

这是生成它的数据子集(供您尝试):

标签: rggplot2layerviolin-plotjitter

解决方案


如何将您的因子作为连续变量来操作并在aes()调用中轻推条目,如下所示:

library(dplyr)
library(ggplot2)

set.seed(42)

tibble(x = rep(c(1, 3), each = 10), 
       y = c(rnorm(10, 2), rnorm(10))) -> plot_data

ggplot(plot_data) + 
  geom_jitter(aes(x = x - 0.5, y = y), width = 0.25) + 
  geom_violin(aes(x = x + 0.5, y = y, group = x), width = 0.5) + 
  coord_flip() + 
  labs(x = "x") + 
  scale_x_continuous(breaks = c(1, 3), 
                     labels = paste("Level", 1:2), 
                     trans = scales::reverse_trans())

绘图输出


推荐阅读