0

假设我有一个看起来像这样的数据。

> print(dat)
V1    V2
1  1 11613
2  2  6517
3  3  2442
4  4   687
5  5   159
6  6    29

# note that V2 is the frequency and V1 does not always start with 1. 


> plot(dat,main=title,type="h")
   # legend()??

现在我要做的是绘制直方图,并将平均值和标准差作为图例包含在内。在上面的例子中,标准差等于 0.87,平均值等于 1.66。

如何在 R 中自动实现这一点?

4

2 回答 2

3

在此处输入图像描述这解决了 Gavin 注意到的图例创建问题。

require(Hmisc) 
myMean <- wtd.mean(dat$V1, dat$V2)
mySD <- sqrt(wtd.var(dat$V1, dat$V2))
plot(dat,main="title",type="h")

L= list( bquote(Mean== .(myMean)), bquote(SD== .(mySD) ) ) 
legend('topright', legend=sapply(L, as.expression))

这是从我在 2010 年发布的 Rhelp 上的一个答案中提取的,该答案将解决方案的策略归因于 Gabor Grothendieck 和 Thomas Lumley 之间的 2005 年交流。

于 2012-05-01T14:33:43.267 回答
2

这非常接近:

dat <- data.frame(V1 = 1:6, V2 = c(11613, 6517, 2442, 687, 159, 29))

addMyLegend <- function(data, where = "topright", digits = 3, ...) {
    MEAN <- round(mean(data), digits = digits)
    SD <- round(sd(data), digits = digits)
    legend(where, legend = list(bquote(Mean == .(MEAN)), 
                                bquote(SD == .(SD))),
           ...)
}

plot(dat, type = "h")
addMyLegend(dat$V1, digits = 2, bty = "n")

这使

自定义图例

我不确定为什么 plotmath 代码没有显示==和排版=...必须调查一下。

要查看正在发生的事情,请阅读?bquote它解释说它可以用来用动态数据替换表达式的组件。任何被包裹的东西.( )都将被表达式包裹部分中命名的对象的值替换。因此foo == .(bar)将寻找一个名为的对象bar并将值插入bar到表达式中。如果bar包含1.3,则应用后的结果bquote(foo == .(bar))将类似于expression(foo == 1.3)

如果没有阅读,我的其余功能addMyLegend()应该是相当不言自明的?legend。请注意,您可以通过 in 传递legend()任何...参数addMyLegend()

于 2012-05-01T11:02:38.123 回答