2013-03-28 5 views
5

Это следующий вопрос до этого вопроса: How to have a new line in a `bquote` expression used with `text`?Advanced легенда R: Участок

Но теперь у меня есть это в легенде, и это, кажется, чтобы изменить вещи.

Я попытался следующие:

test<-c(10:1) 
dummy1<-0.004323423 
dummy2<-0.054 
dummy3<-0.032 
plot(test,c(1:10)) 
legend("topright", 
legend=c(bquote(Qua_0,99^normal == .(round(dummy1,4))),bquote(Qua_0,95^normal == .(round(dummy2,4))),bquote(Qua_0,99^t == .(round(dummy3,4)))), 
bty = "n",lwd=2, cex=1, col=c("red","black","darkgreen"), lty=c(1,3,5)) 

Итак, я хочу, чтобы иметь

  1. Выражение правильно, так что индекс 0,95 правильно написано, а также мощность^correclty

  2. linebreak после знака равенства

  3. цветной текст, так же, как lign, так что первый будет красным

Я пытался реализовать ответы уже существующих должностей, но я не понял это, на вершине тоже не работает.

+0

Заканчивать [** этот ответ **] (HTTP://stackoverflow.com/a/15300449/1478381) к одному из моих вопросов от @agstudy. Я думаю, что это может помочь вам –

+0

@ SimonO101 mh нет, я не могу понять это ... –

+1

@ SimonO101 Это работает, потому что решение отображает два выражения на разных строках. Вы не можете сделать это в легенде, так как каждая запись должна быть на одной «строке», и только одно выражение для записи легенды может быть только одним. –

ответ

5

Сначала создайте вектор из трех выражений и используйте substitute, чтобы создать соответствующие значения фиктивных данных. Обратите внимание, что я использую as.expression, чтобы они не были сразу оценены, и использование atop для разрыва строки. Затем использовать этот вектор при вызове legend:

v <- c(
as.expression(substitute(atop(Qua[0.99]^normal == "", dummy), list(dummy=round(dummy1,4)))), 
as.expression(substitute(atop(Qua[0.95]^normal == "", dummy), list(dummy=round(dummy2,4)))), 
as.expression(substitute(atop(Qua[0.99]^t == "", dummy), list(dummy=round(dummy3,4)))) 
) 
cols <- c("red","black","darkgreen") 
legend("topright", legend=v, bty = "n",lwd=2, cex=1, col=cols, text.col=cols, lty=c(1,3,5)) 

цвет текста устанавливается с text.col. enter image description here

Если вы хотите придерживаться использования bquote, а не substitute:

v <- c(
    as.expression(bquote(atop(Qua[0.99]^normal == "", .(round(dummy1,4))))), 
    as.expression(bquote(atop(Qua[0.95]^normal == "", .(round(dummy2,4))))), 
    as.expression(bquote(atop(Qua[0.99]^t == "", .(round(dummy3,4))))) 
) 

Чтобы сделать нормальный и 0,99 полужирный, вы можете использовать bold в выражении:

v <- c(
as.expression(substitute(atop(Qua[bold(0.99)]^bold(normal) == "", dummy), list(dummy=round(dummy1,4)))), 
as.expression(substitute(atop(Qua[bold(0.95)]^bold(normal) == "", dummy), list(dummy=round(dummy2,4)))), 
as.expression(substitute(atop(Qua[bold(0.99)]^bold(t) == "", dummy), list(dummy=round(dummy3,4)))) 
) 

Но 0.99 не будет очень смелая на самом деле: enter image description here

Вы можете попробовать с текстом в нормальном размере, используя textstyle:

v <- c(
as.expression(substitute(atop(Qua[textstyle(0.99)]^textstyle(normal) == "", dummy), list(dummy=round(dummy1,4)))), 
as.expression(substitute(atop(Qua[textstyle(0.95)]^textstyle(normal) == "", dummy), list(dummy=round(dummy2,4)))), 
as.expression(substitute(atop(Qua[textstyle(0.99)]^textstyle(t) == "", dummy), list(dummy=round(dummy3,4)))) 
) 

и получить это: enter image description here

+0

ОК спасибо, но как я могу получить штриховую линию после знака равенства и цвета текста? –

+0

ОК, а разрыв строки после знака равенства? –

+0

@StatTistician единственный способ сделать это в легенде - использовать функцию atop' plotmath. Посмотрите, как это используется в моем ответе. –

5

Есть несколько вещей, которые были необходимы здесь , но основной из них - получение трех выражений в подходящем формате - просто c - их совместное использование не работает. Для этого я создаю список выражений, а затем sapply функцию as.expression над этим списком, чтобы получить «вектор выражений».

Я использую функцию plotmath atop, чтобы получить «linebreak»; это ставит свои аргументы, один поверх другого.

Чтобы получить 0,95 часть, которую я полагаю, это просто 0.95, но в вашей местности, на моей машине я должен был использовать функцию макета * с буквальным "," противопоставлять 0 и 95. Если это просто написать десятичное число, то в других локалях, которые используют . в качестве разделителя с десятичной запятой, это было бы необязательно. Я подозреваю, что в вашем регионе вы можете использовать вторую версию ниже, но писать [0,99] вместо [0.99], но я не знаю.

Если вы просто положить

bquote(atop(foo_0.99^normal ==, .round(bar, 4))) 

вы просто получите ошибку:

> bquote(atop(foo_0.99^normal ==, .round(bar, 4))) 
Error: unexpected ',' in "bquote(atop(foo_0.99^normal ==," 

Это происходит потому, что правая сторона == функции/оператора отсутствует. Поскольку вы не хотите ничего после == (в текущей строке!), Вам нужно использовать что-то, что не добавляет лишнего места, но дает действительную правую сторону для ==. Здесь я использую phantom(), который действует как заполнитель, но не оставляет места (поскольку я не даю ему никаких аргументов). Но вы также можете использовать == "", заменяя "" на phantom().

Чтобы получить текст в том же цвете, что и строка, используйте аргумент text.col.

Вот вещь, в полном объеме со всеми вашими запросами удовлетворяются за (после моды):

test <- 10:1 
dummy1 <- 0.004323423 
dummy2 <- 0.054 
dummy3 <- 0.032 
plot(test, 1:10) 

## list of expressions 
exprs <- 
    list(bquote(atop(Qua_0 * "," * 99^normal == phantom(), .(round(dummy1, 4)))), 
     bquote(atop(Qua_0 * "," * 95^normal == phantom(), .(round(dummy2, 4)))), 
     bquote(atop(Qua_0 * "," * 99^t == phantom(), .(round(dummy3, 4))))) 
## fudge to get them as an expression vector 
exprs <- sapply(exprs, as.expression) 

cols <- c("red", "black", "darkgreen") 
legend("topright", legend = exprs, bty = "n", lwd = 2, cex = 1, col = cols, 
     lty=c(1,3,5), text.col = cols) 

Похоже, что вы используете LaTeX _ получить верхний индекс. В plotmath вам нужно [ ]. Вы также заметите, что это не совсем так красиво типографически - между элементами легенды недостаточно места, но некоторое пространство между элементами внутри одной записи. Это связано с тем, что мы злоупотребляем atop, чтобы подделать новую строку. Мы можем справиться с этим, используя аргумент y.intersplegend. Увеличение его до 2 дает достаточное пространство.

Объединяя это, я хотел бы сделать следующее, чтобы удовлетворить все ваши требования:

plot(test, 1:10) 

## list of expressions 
exprs <- 
    list(bquote(atop(Qua[0.99]^normal == phantom(), .(round(dummy1, 4)))), 
     bquote(atop(Qua[0.95]^normal == phantom(), .(round(dummy2, 4)))), 
     bquote(atop(Qua[0.99]^t == phantom(), .(round(dummy3, 4))))) 
## fudge to get them as an expression vector 
exprs <- sapply(exprs, as.expression) 

cols <- c("red", "black", "darkgreen") 
legend("topright", legend = exprs, bty = "n", lwd = 2, cex = 1, col = cols, 
     lty=c(1,3,5), text.col = cols, y.intersp = 2) 

Это дает:

enter image description here

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