使用ggplot2在箱线图中未对齐点

时间:2018-03-12 16:35:16

标签: r ggplot2

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

ggplot(data=P4L_melt, aes(variable, y=value)) + geom_boxplot(aes(fill=Species), alpha=0.7, lwd=0.5, outlier.shape=NA) + geom_point(position=position_jitterdodge(jitter.width=0),aes(group=Species, colour=Species), alpha=0.5)

我得到这个情节: enter image description here

似乎没问题。如您所见,我们有三组(红色,绿色,蓝色),各自的观察结果与箱形图重叠。

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

2 个答案:

答案 0 :(得分:1)

似乎geom_boxplot和position_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

2)将该列用作geom_point中的x位置

ggplot(data=P4L_melt, aes(variable, y=value)) + 
  geom_boxplot(aes(fill=Species), alpha=0.7, lwd=0.5, outlier.shape=NA) + 
  geom_point(aes(x=x, group=Species, colour=Species), alpha=0.5) 

result..

答案 1 :(得分:1)

好的,这是另一次尝试,也许是在顶部:)

1) 安装最新的ggplot2版本:

install.packages('tidyverse')
library('tidyverse')

2) 从我的github下载我的修改版本的position-dodge2.r及其依赖项position-collide.r

3) 将这些文件放在项目的工作目录中,并且:

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)