在剧情的图例中包含自定义文字

时间:2012-05-01 10:40:28

标签: r plot

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

> 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中自动实现?

2 个答案:

答案 0 :(得分:3)

enter image description here这解决了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")

哪个给出了

custom legend

我不确定为什么plotmath代码没有显示==和排版= ...将不得不调查。

要查看读取?bquote的内容,它解释了它可以用于用动态数据替换表达式的组件。包含在.( )中的任何内容都将被表达式的包装部分中指定的对象的值替换。因此foo == .(bar)将查找名为bar的对象,并将bar的值插入表达式中。如果bar包含1.3,那么应用bquote(foo == .(bar))后的结果将与expression(foo == 1.3)类似。

我的函数addMyLegend()的其余部分应该是相当自我解释的,如果没有阅读?legend。请注意,您可以通过legend()中的...将任何参数传递给addMyLegend()