#r #plot #legend
#r #график #легенда
Вопрос:
Я хочу построить легенду, используя bquote
, но у меня проблема с добавлением двух строк в мою легенду. Например:
Это работает:
plot(1:10)
r2=0.99
legend("topleft",legend=bquote(R^{2} ~ "=" ~.(r2)),bty = "n")
Но если я добавлю вторую строку:
plot(1:10)
r2=0.99
pval=0.01
legend("topleft",legend=c(bquote(R^{2} ~ "=" ~.(r2)),paste("P-value =",pval)),bty = "n")
Весь первый элемент моего вектора в легенде «развернут». Почему это?
Ответ №1:
Это потому, что c
-функция не может объединить несколько экземпляров типа объекта, возвращаемого bquote
. Большинство людей думают, что это bquote
возвращает выражения R, но это не так. Он возвращает вызовы, и они не объединяются в списки. Вам нужно применить expression
функцию к элементам, возвращаемым несколькими вызовами bquote
, чтобы получить их в список ‘expression’. Это было объяснено Томасом Ламли на Rhelp в 2005 году:
legend("topleft",legend=do.call( 'expression',
list( bquote( R^{2} == .(r2)),
bquote( "P-value" == .(pval))) ),
bty = "n")
Существует альтернативный подход, если вы хотите преобразовать этот аргумент в legend , который позволил бы связывать выражения вместе с c()
. Переопределите кавычки, чтобы вернуть выражение:
bquote2 <- function (expr, where = parent.frame())
{
unquote <- function(e) if (is.pairlist(e))
as.pairlist(lapply(e, unquote))
else if (length(e) <= 1L)
e
else if (e[[1L]] == as.name("."))
eval(e[[2L]], where)
else as.call(lapply(e, unquote))
as.expression( unquote(substitute(expr)) )
}
legend("topleft",
legend=c( bquote2(R^{2} ~ "=" ~.(r2)),
bquote2(paste("P-value =",pval))),
bty = "n")
Комментарии:
1. Ах! Я полагал, что это языковые объекты, но я не знал, что их можно так комбинировать.
2. Если бы bquote действительно возвращал выражение, я полагаю, вы смогли бы использовать
c
, поскольку списки выражений являются объектами, подобными списку. Я посмотрю, смогу ли я внести изменения в его код.
Ответ №2:
Мне удалось создать что-то вроде того, что вы хотите, с помощью следующего:
textleg <- substitute(atop(paste(R^2==k),
plain(P-value)==j), list(k = r2, j=pval))
legend("topleft",legend=textleg,bty = "n")
Редактировать:
@ 42- высказал предположение, что добавление кавычек превратит мой знак минуса в ‘P-value’ в дефис:
Комментарии:
1. Да, это довольно близко. Я просто все еще раздражен тем, что строки не выровнены должным образом: P
2. (Действительно незначительный момент): Я согласен с вашими усилиями использовать больше операторов plotmath, но знак минус между
P
иvalue
становится шире, чем если бы вы указали «P-значение».