如何使用ggplot2使抖动点居中?

时间:2014-10-04 13:46:23

标签: r ggplot2 boxplot

我正在尝试重建多点图,如下图所示。 https://www.dropbox.com/s/9jqguesqd5gdm99/jitter%20plot.png

ggplot2中的 geom_dotplot position_jitter 都已尝试过。但这两个命令都不能成功。

由position_jitter创建的数字非常相似,但也存在一些差异。与上面提到的数字相比,position_jitter创建的点似乎太分散了。

这是我到目前为止的数字。 https://www.dropbox.com/s/athsgkjjrlwr15k/figure.png?dl=0 e.g。

value<-c(141573,  262616,   66773.8,    93032.2,    55528.8,    113125, 252954, 275581, 207854, 183300, 292946, 171510, 343565, 214436, 295871, 187196, 207352, 180356, 158110, 241769, 180112, 194007, 529168, 229267, 344257, 337311, 255109, 307389, 416108, 405033, 292260, 354368, 416811, 330420, 353017, 333997, 389285, 289870, 289224, 401641, 206481, 367379)
group<-factor(c(1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2))
quantile<-boxplot(value~group)
line<-quantile$stats
library(ggplot2)
gg<-ggplot()+geom_point(aes(x=group,y=value,color=group,fill=group),position=position_jitterdodge(jitter.width=0.3,dodge.width=0.7),size=4)+
geom_path(aes(x=c(0.8,1.2),y=c(line[3,1],line[3,1])),size=1)+geom_path(aes(x=c(1.8,2.2),y=c(line[3,2],line[3,2])),size=1)+geom_path(aes(x=c(0.9,0.9,1.1,1.1),y=c(line[2,1],line[2,1],line[2,1],line[2,1])),size=1.2)+geom_path(aes(x=c(0.9,0.9,1.1,1.1),y=c(line[4,1],line[4,1],line[4,1],line[4,1])),size=1.2)+geom_path(aes(x=c(1.9,1.9,2.1,2.1),y=c(line[2,2],line[2,2],line[2,2],line[2,2])),size=1.2)+geom_path(aes(x=c(1.9,1.9,2.1,2.1),y=c(line[4,2],line[4,2],line[4,2],line[4,2])),size=1.2)+geom_path(aes(x=c(1,1),y=c(line[2,1],line[4,1])),size=1.2)+geom_path(aes(x=c(2,2),y=c(line[2,2],line[4,2])),size=1.2)+
scale_colour_manual(name="",values = c("1"="#353F6B","2"="#994642"))+
theme_classic()+theme(legend.position="none")
gg

所以我的问题:当在ggplot2中使用抖动函数时,是否可以使异常值居中,就像第一个数字一样。你会建议用什么样的方法来创造这种形象?

由于

3 个答案:

答案 0 :(得分:2)

在ggplot2中,'jitteriness'可在两个方向配置,例如

data(mpg)
ggplot(mpg, aes(x=cyl, y=hwy, group=factor(cyl))) +
    geom_boxplot() +
    geom_jitter(position = position_jitter(height = .2, width = .2))

......看起来像这样:

geom_jitter 0.2

,而:

ggplot(mpg, aes(x=cyl, y=hwy, group=factor(cyl))) +
    geom_boxplot() +
    geom_jitter(position = position_jitter(height = .7, width = .7))

......对它有一种更“'喷枪”的感觉:

geom_jitter 0.7

你可以通过调整geom_jitter中的position参数来创建你想要的效果吗?

答案 1 :(得分:1)

这是到期的6年,但是最近遇到了这个问题,我在库(geom_beeswarm)中使用geom_beeswarm找到了一个不错的答案,并认为我应该将其发布在这里。

使用mpg使用geom_jitter复制上面的示例相当混乱:

data(mpg)
ggplot(mpg, aes(x=cyl, y=hwy, group=factor(cyl))) +
    geom_boxplot() +
    geom_jitter(position = position_jitter(height = .2, width = .2))

Jitter

geom_beeswarm使抖动点集中且清晰得多:

library(geom_beeswarm)
data(mpg)
ggplot(mpg, aes(x=cyl, y=hwy, group=factor(cyl))) +
    geom_boxplot() +
    geom_beeswarm()

beeswarm

答案 2 :(得分:0)

似乎你只需要调整jitter.width。我在代码中添加了alpha。请参阅#&lt;&lt; -

gg<- ggplot()+
  geom_point(aes(x=group,y=value,color=group,fill=group), 
             position=position_jitterdodge(jitter.width=0.1,  # <<- adjusted
                                           dodge.width=0.7), 
             size=4, alpha=0.7)+                              # <<- alpha added
  geom_path(aes(x=c(0.8,1.2),y=c(line[3,1],line[3,1])),size=1)+
  geom_path(aes(x=c(1.8,2.2),y=c(line[3,2],line[3,2])),size=1)+
  geom_path(aes(x=c(0.9,0.9,1.1,1.1),y=c(line[2,1],line[2,1],line[2,1],line[2,1])),size=1.2)+
  geom_path(aes(x=c(0.9,0.9,1.1,1.1),y=c(line[4,1],line[4,1],line[4,1],line[4,1])),size=1.2)+
  geom_path(aes(x=c(1.9,1.9,2.1,2.1),y=c(line[2,2],line[2,2],line[2,2],line[2,2])),size=1.2)+
  geom_path(aes(x=c(1.9,1.9,2.1,2.1),y=c(line[4,2],line[4,2],line[4,2],line[4,2])),size=1.2)+
  geom_path(aes(x=c(1,1),y=c(line[2,1],line[4,1])),size=1.2)+
  geom_path(aes(x=c(2,2),y=c(line[2,2],line[4,2])),size=1.2)+
  scale_colour_manual(name="",values = c("1"="#353F6B","2"="#994642"))+
  theme_classic()+theme(legend.position="none")
gg

enter image description here

只是旁注:我正在使用ggplot2 1.0.0