R 使用ggplot2的箱线图中未对齐的点

R 使用ggplot2的箱线图中未对齐的点,r,ggplot2,R,Ggplot2,当我使用此数据集()运行此ggplot2代码时 我得到这个情节: 看起来还不错。如您所见,我们有三组(红色、绿色、蓝色),各自的观察值与箱线图重叠 但是,如果我们关注左下角,那里不存在红色组,我们会看到蓝色和绿色点未对齐(在DC1、DC2和DC3中)。 我如何编辑代码来解决这个问题?看起来像geom\u boxplot和position\u jitterdodge对待NA的方式不同 这里有一个(不雅观的)解决方法: 1) 在df中创建一列,指定点的x位置: library(ggplot2) P

当我使用此数据集()运行此ggplot2代码时

我得到这个情节:

看起来还不错。如您所见,我们有三组(红色、绿色、蓝色),各自的观察值与箱线图重叠

但是,如果我们关注左下角,那里不存在红色组,我们会看到蓝色和绿色点未对齐(在DC1、DC2和DC3中)。
我如何编辑代码来解决这个问题?

看起来像geom\u boxplot和position\u jitterdodge对待NA的方式不同

这里有一个(不雅观的)解决方法:

1) 在df中创建一列,指定点的x位置:

library(ggplot2)
P4L_melt <- read.table('P4L_melt.txt')

P4L_melt$x <- as.numeric(gsub('DC', '', P4L_melt$variable))
P4L_melt$variable <- factor(P4L_melt$variable, levels = paste('DC', unique(P4L_melt$x), sep=''))
P4L_melt$x[P4L_melt$Species=='A'] <- P4L_melt$x[P4L_melt$Species=='A'] - 0.25
P4L_melt$x[P4L_melt$Species=='C'] <- P4L_melt$x[P4L_melt$Species=='C'] + 0.25
P4L_melt$x[P4L_melt$Species=='B'&P4L_melt$variable%in%c('DC1', 'DC2', 'DC3')] <- P4L_melt$x[P4L_melt$Species=='B'&P4L_melt$variable%in%c('DC1', 'DC2', 'DC3')] - 0.2
P4L_melt$x[P4L_melt$Species=='C'&P4L_melt$variable%in%c('DC1', 'DC2', 'DC3')] <- P4L_melt$x[P4L_melt$Species=='C'&P4L_melt$variable%in%c('DC1', 'DC2', 'DC3')] - 0.05

好的,这是另一种尝试,可能是过度的:)

(一) 安装最新的ggplot2版本:

install.packages('tidyverse')
library('tidyverse')
(二) 从我的网站下载我的修改版position-dodge2.r及其依赖项position collide.r

(三) 将这些文件放在项目的工作目录中,然后:

source('position-collide.R')
source('position-dodge2.R')
4) 现在这段代码应该给你你想要的

ggplot(data=P4L_melt, aes(variable, y=value)) +
  geom_boxplot(aes(fill=Species), alpha=0.7) +
  geom_point(aes(colour=Species), position=position_dodge2(width=0.75), alpha=0.5)

请在问题中添加数据我编辑了我的帖子,并提供了下载数据集@pogiba的链接,因为生成的图像肯定是我想要的。但是,您必须手动编辑代码才能实现它。我有30多个情节要画,每一个都有自己的特点。能不能用更自动的方式来描绘它们?它们有多“奇特”?它们有什么不同?很难做出100%的通用解决方案…哇!令人惊叹的!谢谢你的代码@frostell,它们工作得很好!他们解决了问题!很高兴它能起作用!请让我知道,如果有任何错误/意想不到的行为与国防部,我会尝试和修复它。。还对ggplot2回购进行了PR,让我们看看他们是否将其合并:)
source('position-collide.R')
source('position-dodge2.R')
ggplot(data=P4L_melt, aes(variable, y=value)) +
  geom_boxplot(aes(fill=Species), alpha=0.7) +
  geom_point(aes(colour=Species), position=position_dodge2(width=0.75), alpha=0.5)