用R语言绘制箱线图,标记每个箱子的样本量(N)。

19
在R中,是否有一种方法可以创建一个箱线图,在箱子(某处)中显示“N=(样本大小)”?varwidth逻辑根据样本大小调整框的宽度,但这不允许在不同的图之间进行比较。顺便说一句,我是按照以下方式使用boxplot命令,其中“f1”是一个因子:
boxplot(xvar ~ f1, data=frame, xlab="input values", horizontal=TRUE)
5个回答

38

这里是一些ggplot2代码。它将在样本均值处显示样本大小,使标签多功能!

首先,一个简单的函数fun.data

give.n <- function(x){
   return(c(y = mean(x), label = length(x)))
}

现在,为了演示钻石数据

ggplot(diamonds, aes(cut, price)) + 
   geom_boxplot() + 
   stat_summary(fun.data = give.n, geom = "text")

你可能需要调整文本大小使其看起来更好看,但现在你有了一个样本大小的标签,这也给出了偏度的感觉。


运行得很好,看起来也很漂亮。谢谢! - J Miller
6
如果我使用geom_boxplot(aes(fill=factor(f2)))进行ggplot绘图,其中f2是第二个因子-是否有一种变化的stat_summary可以使“子框”接收自己的N? - J Miller
4
示例代码以节省空间:ggplot(mpg, aes(manufacturer, hwy, fill = factor(year))) + geom_boxplot() + stat_summary(fun.data = give.n, geom = "text", position = position_dodge(height = 0, width = 0.75), size = 3) 您可能需要手动调整传递给position_dodge()中的width值。 - JoFrhwld
2
位置显示“未使用的参数”。我想知道是否可以更改N计数的位置,因为它不容易在箱线图中看到。谢谢。 - Mac
盒须图中的线是“中位数”,因此最好使用“y=median(x)”——请参见https://dev59.com/0WUo5IYBdhLWcg3w2CaJ#15720769中的答案。 - Fuhrmanator

11

你可以使用names参数在每个因子名称旁边写上n

如果你不想自己计算n,你可以使用这个小技巧:

# Do the boxplot but do not show it
b <- boxplot(xvar ~ f1, data=frame, plot=0)
# Now b$n holds the counts for each factor, we're going to write them in names
boxplot(xvar ~ f1, data=frame, xlab="input values", names=paste(b$names, "(n=", b$n, ")"))

如何在每个条形图的水平线上方放置n个数字? - Dinesh
@Dinesh:使用“text”函数。您可以通过查看“stats”参数来找到中位数的值。例如:text(seq_along(f1), b$stats[3,], b$n) - nico

5
要在条形图的顶部显示 n,您可以使用以下带有 boxplot 提供的 stat 细节的 text
b <- boxplot(xvar ~ f1, data=frame, plot=0)
text(1:length(b$n), b$stats[5,]+1, paste("n=", b$n))

b的stats字段是一个矩阵,每列包含一个组/图的下须极值、下四分位数、中位数、上四分位数和上须极值。

1

gplots包提供了boxplot.n函数,根据文档说明它会生成一个标注有观测值数量的箱线图


0

我找到了一个解决方法,使用Envstats包。需要下载、加载和激活此包:

library(Envstats)

stripChart(与stripchart不同)会向图表中添加一些值,例如n值。首先我绘制了箱线图。然后我在stripChart中使用了add=T。显然,在stripChart代码中隐藏了许多东西,以便它们不会显示在箱线图上。这是我用于stripChart的代码,以隐藏大多数项目。

Boxplot带有集成的stripChart以显示n值:

stripChart(data.frame(T0_G1,T24h_G1,T96h_G1,T7d_G1,T11d_G1,T15d_G1,T30d_G1), show.ci=F,axes=F,points.cex=0,n.text.line=1.6,n.text.cex=0.7,add=T,location.scale.text="none")

箱线图

boxplot(data.frame(T0_G1,T24h_G1,T96h_G1,T7d_G1,T11d_G1,T15d_G1,T30d_G1),main="All Rheometry Tests on Egg Plasma at All Time Points at 0.1Hz,0.1% and 37 Set 1,2,3", names=c("0h","24h","96h","7d ", "11d", "15d", "30d"),boxwex=0.6,par(mar=c(8,4,4,2)))

然后是stripChart

stripChart(data.frame(T0_G1,T24h_G1,T96h_G1,T7d_G1,T11d_G1,T15d_G1,T30d_G1), show.ci=F,axes=F,points.cex=0,n.text.line=1.6,n.text.cex=0.7,add=T,location.scale.text="none")

您可以随时调整数字(n值)的高度,以使其适合您想要的位置。


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