如何在散点图中添加箱线图和抖动效果

29
我正在使用以下命令生成带有抖动的散点图:
ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5],500,replace=T))
library(lattice)
stripplot(NUMS~GRP,data=ddf, jitter.data=T)

我希望在这些点上添加箱线图(每组一个)。我尝试搜索,但找不到可以绘制所有点(而不仅仅是异常值)并带有抖动效果的代码。请问如何解决这个问题。感谢您的帮助。


1
它必须是格子图吗?否则尝试像这样的 with(ddf, { boxplot(NUMS~GRP); points(jitter(as.numeric(GRP)), NUMS, col=rgb(0,0,0,.2), cex=.5, pch=19) }) - lukeA
使用基本图形是首选。你的解决方案非常好。谢谢。 - rnso
这个能用ggplot2完成吗?我尝试了{ggplot(ddf,aes(x=GRP, y=NUMS))+geom_boxplot()+geom_jitter()},但它产生了太多的散点图- 是否可以减少抖动? - rnso
请参考以下相关问题,了解有关组内点抖动的信息:https://dev59.com/QWEi5IYBdhLWcg3wPKWx - Brian D
4个回答

48

这是使用基本图形的一种方法。

boxplot(NUMS ~ GRP, data = ddf, lwd = 2, ylab = 'NUMS')
stripchart(NUMS ~ GRP, vertical = TRUE, data = ddf, 
    method = "jitter", add = TRUE, pch = 20, col = 'blue')

输入图像描述


是的,它运行得非常好。谢谢。我之前尝试了stripplot和boxplot,但它们都没有起作用。 - rnso
3
add = TRUE 参数非常重要。 :) - Rich Scriven
仅使用 add=T 可能不足以呈现效果,因为 {stripplot(NUMSGRP,data=ddf, jitter=T) ; boxplot(NUMSGRP,data=ddf, add=T)} 无法正常工作;显然需要先放置一个“plot”,然后再添加点或图表。 - rnso
4
stripplot 是在 lattice 包中的函数。stripchart 是基础绘图函数。 - Rich Scriven
多年使用R编程,我竟然不知道R基础中的stripchart函数。非常好! - igorkf

25

要在ggplot2中实现此操作,请尝试:

ggplot(ddf, aes(x=GRP, y=NUMS)) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(position=position_jitter(width=.1, height=0))

箱线图和抖动图的ggplot2版本

显然,您可以根据自己的喜好调整position_jitter() 的宽度和高度参数(虽然我建议使用height=0,因为高度抖动会使您的绘图不准确)。


3

我编写了一个名为spreadPoints()的R函数,它在basiclotteR包中。该包可以使用以下代码直接安装到您的R库中:

install.packages("devtools")
library("devtools")
install_github("JosephCrispell/basicPlotteR")

对于提供的示例,我使用以下代码生成了下面的示例图。
ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5],500,replace=T))

boxplot(NUMS ~ GRP, data = ddf, lwd = 2, ylab = 'NUMS')

spreadPointsMultiple(data=ddf, responseColumn="NUMS", categoriesColumn="GRP",
                     col="blue", plotOutliers=TRUE)

enter image description here

这是一个正在进行中的工作(由于缺乏输入公式,它的使用有些笨拙!)但它提供了一种非随机的方法来在X轴上分布点,同时也可以作为数据的类小提琴图总结。如果您感兴趣,请查看源代码code

1
看起来不错。是否有可能只用一行代码绘制所有组,而不是为每个组重复代码:spreadPoints(ddf[ddf$GRP=="A", "NUMS"], position=1, col="blue", plotOutliers=TRUE) - rnso
@rnso 我创建了一个额外的函数 spreadPointsMultiple(),可以通过单个命令为多个箱线图分散点(请参见上面的编辑)。我目前正在努力让 spreadPoints() 的第一个参数可以是公式。感谢您指出这一点 :-) - Joseph Crispell

2
针对“lattice”解决方案:
最初的回答:针对"lattice"解决方案:
library(lattice)
ddf = data.frame(NUMS = rnorm(500), GRP = sample(LETTERS[1:5], 500, replace = T))
bwplot(NUMS ~ GRP, ddf, panel = function(...) {
  panel.bwplot(..., pch = "|")
  panel.xyplot(..., jitter.x = TRUE)})

默认的中位数点符号已经改为一条带有 pch = "|" 的线。可以通过 trellis.par.set() 函数调整箱线图和盒须图的其他属性,如 box.umbrellabox.rectangle 。通过名为 factor 的变量可以调整抖动的数量,其中 factor = 1.5 将其增加了50%。 lattice solution to boxplot with scatter (图片来源:链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接