R中的箱线图显示平均值

Posted

技术标签:

【中文标题】R中的箱线图显示平均值【英文标题】:Boxplot in R showing the mean 【发布时间】:2011-01-30 09:07:18 【问题描述】:

有谁知道在 R 中生成箱线图的方法,其中一条线(或另一个符号)的值对应于平均值?

谢谢!

【问题讨论】:

【参考方案1】:

从包PerformanceAnalytics 中检查chart.Boxplot。它允许您定义用于分布均值的符号。

默认情况下,chart.Boxplot(data) 命令将均值添加为红色圆圈,将中值添加为黑线。

这是带有样本数据的输出; MWE:

#install.packages(PerformanceAnalytics)    
library(PerformanceAnalytics)
chart.Boxplot(cars$speed)

【讨论】:

【参考方案2】:

我也认为 chart.Boxplot 是最好的选择,它为您提供了均值的位置,但如果您有一个带有返回值的矩阵,您只需要一行代码即可在一张图中获取所有箱线图。

这是一个小型 ETF 投资组合示例。

library(zoo)
library(PerformanceAnalytics)
library(tseries)
library(xts)

VTI.prices = get.hist.quote(instrument = "VTI", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))

VEU.prices = get.hist.quote(instrument = "VEU", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))

VWO.prices = get.hist.quote(instrument = "VWO", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))


VNQ.prices = get.hist.quote(instrument = "VNQ", start= "2007-03-01", end="2013-03-01",
                       quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                       compression = "m", retclass = c("zoo"))

TLT.prices = get.hist.quote(instrument = "TLT", start= "2007-03-01", end="2013-03-01",
                        quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                        compression = "m", retclass = c("zoo"))

TIP.prices = get.hist.quote(instrument = "TIP", start= "2007-03-01", end="2013-03-01",
                         quote = c("AdjClose"),provider = "yahoo",origin ="1970-01-01", 
                         compression = "m", retclass = c("zoo"))

index(VTI.prices) = as.yearmon(index(VTI.prices))
index(VEU.prices) = as.yearmon(index(VEU.prices))
index(VWO.prices) = as.yearmon(index(VWO.prices))

index(VNQ.prices) = as.yearmon(index(VNQ.prices))
index(TLT.prices) = as.yearmon(index(TLT.prices))
index(TIP.prices) = as.yearmon(index(TIP.prices))

Prices.z=merge(VTI.prices, VEU.prices, VWO.prices, VNQ.prices, 
           TLT.prices, TIP.prices)

colnames(Prices.z) = c("VTI", "VEU", "VWO" , "VNQ", "TLT", "TIP")

returnscc.z = diff(log(Prices.z))

start(returnscc.z)
end(returnscc.z)
colnames(returnscc.z) 
head(returnscc.z)

返回矩阵

ret.mat = coredata(returnscc.z)
class(ret.mat)
colnames(ret.mat)
head(ret.mat)

返回矩阵的箱线图

chart.Boxplot(returnscc.z, names=T, horizontal=TRUE, colorset="darkgreen", as.Tufte =F,
          mean.symbol = 20, median.symbol="|", main="Return Distributions Comparison",
          element.color = "darkgray", outlier.symbol = 20, 
          xlab="Continuously Compounded Returns", sort.ascending=F)

您可以尝试更改mean.symbol,并删除或更改median.symbol。 希望它有所帮助。 :)

【讨论】:

【参考方案3】:

根据@James 和@Jyotirmoy Bhattacharya 的回答,我想出了这个解决方案:

zx <- replicate (5, rnorm(50))
zx_means <- (colMeans(zx, na.rm = TRUE))
boxplot(zx, horizontal = FALSE, outline = FALSE)
points(zx_means, pch = 22, col = "darkgrey", lwd = 7)

(详情请参阅this 帖子)

如果您想在水平箱形图中添加点,请参阅this 帖子。

【讨论】:

【参考方案4】:

ggplot2:

p<-qplot(spray,count,data=InsectSprays,geom='boxplot')
p<-p+stat_summary(fun.y=mean,shape=1,col='red',geom='point')
print(p)

【讨论】:

【参考方案5】:
abline(h=mean(x))

对于水平线(如果您将箱线图水平定向,则使用 v 而不是 h 作为垂直线),或者

points(mean(x))

为了一点。使用参数pch 更改符号。您可能还想为它们着色以提高可见度。

请注意,这些是在您绘制箱线图之后调用的。

如果您使用公式接口,则必须构造均值向量。比如取?boxplot的第一个例子:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")
means <- tapply(InsectSprays$count,InsectSprays$spray,mean)
points(means,col="red",pch=18)

如果您的数据包含缺失值,您可能希望将tapply 函数的最后一个参数替换为function(x) mean(x,na.rm=T)

【讨论】:

您能否在 boxplot graphics 帮助的第一个示例中解释如何做到这一点? boxplot(count ~ spray, data = InsectSprays, col = "lightgray") 我现在已经将它作为示例添加到答案中 abline 只是在整个绘图中添加一条水平线,而不是在箱线图的框内。如果不使用ggplot2,我找不到任何解决方法。有人吗?

以上是关于R中的箱线图显示平均值的主要内容,如果未能解决你的问题,请参考以下文章

使用多个连接的箱线图更改 Matplotlib 中的轴刻度

如何在r中的箱线图之间创建单独的线图

如何在具有多个组的箱线图顶部创建单独的线

R - 左下角带有标签的箱线图

如何用R中的样本组制作特定行的箱线图

如何在ggplot的箱线图中按组绘制平均值