Легенда в две строки в R с использованием кавычек

#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-значение».