假设我有一个看起来像这样的数据。
> 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中自动实现?
答案 0 :(得分: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))
这是从an answer on Rhelp that I posted in 2010拉出来的,将解决方案的策略归因于Gabor Grothendieck和Thomas Lumley之间的2005年交流。
答案 1 :(得分: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
。请注意,您可以通过legend()
中的...
将任何参数传递给addMyLegend()
。