2012-05-01 10 views
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?

ответ

3

enter image description here Это решает проблему с созданием легенды, которую замечает Гэвин.

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 что приписываемая стратегией для решения обмена между 2005 Габором Гротендик и Томасом Ламли.

+0

Спасибо за указатель' sapply (foo, as.expression) '. Я думаю, что я использовал кого-то на этом раньше, и теперь я об этом думаю. –

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().

+0

Может ли кто-нибудь объяснить, почему plotmath здесь не работает? Я что-то делаю глупо? –

+0

Спасибо, в моем примере V2 - это частота, а V1 - значение. V1 не всегда начинается с 1. Следовательно, среднее значение должно быть MEAN = 1,66, а не 3574,5. – neversaint

+1

@neversaint возглашает, извините. Починю. –

 Смежные вопросы

  • Нет связанных вопросов^_^