2013-03-28 17 views
5

Questo è un follow-up questione di questa domanda: How to have a new line in a `bquote` expression used with `text`?leggenda avanzato in R: Trama

Ma ora ho in una leggenda e questo sembra cambiare le cose.

ho provato la seguente:

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

Quindi, voglio avere

  1. l'espressione corretta, in modo che l'indice di 0,95 sia correttamente scritto e anche il potere^correclty

  2. linea dopo il segno di uguale

  3. testo colorato, lo stesso del lign, quindi il primo sarebbe in rosso

ho cercato di attuare le risposte dei posti già esistenti, ma non ho capito, in cima è anche non funziona.

+0

Partenza [** questa risposta **] (http://stackoverflow.com/a/15300449/1478381) a una delle mie domande da @agstudy. Penso che potrebbe aiutarti –

+0

@ SimonO101 mh no, non riesco a capirlo ... –

+1

@ SimonO101 Funziona perché la soluzione traccia due espressioni su linee diverse. Non è possibile farlo in una legenda poiché ogni voce deve trovarsi su una singola "linea" e può esistere solo un'espressione per voce della legenda. –

risposta

5

Prima creare un vettore di 3 espressioni e utilizzare substitute per creare i valori fittizi appropriati. Si noti che sto utilizzando as.expression in modo che non vengano valutati immediatamente e l'uso di atop per l'interruzione di riga. Quindi utilizzare quel vettore al momento della chiamata 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)) 

Il colore del testo è impostato con text.col. enter image description here

Se si vuole attaccare per l'utilizzo del bquote piuttosto che 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))))) 
) 

per rendere il normale e 0.99 grassetto, è possibile utilizzare bold nell'espressione:

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

Ma il 0,99 non ci sarà molto audace in realtà: enter image description here

si può provare con il testo in formato normale utilizzando 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)))) 
) 

e ottenere questo: enter image description here

+0

ok grazie, ma come posso ottenere un'interruzione di riga dopo il segno di uguale e il colore del testo? –

+0

ok e l'interruzione di riga dopo il segno di uguale? –

+0

@StatTistician l'unico modo per farlo in una legenda è usare la funzione plotmath 'atop'. Guarda come questo è usato nella mia risposta. –

5

Ci sono diverse cose che erano necessarie qui , ma il principale è ottenere le 3 espressioni in un formato adatto - semplicemente c -le loro insieme non funziona. Per questo, creo un elenco di espressioni e successivamente la funzione sapply nella funzione as.expression per ottenere un "vettore di espressioni".

Uso la funzione plotmath atop per ottenere una "interruzione di riga"; questo pone i suoi argomenti, uno sopra l'altro.

per ottenere la parte 0,95, che presumo è solo 0.95 ma nel vostro locale, sulla mia macchina ho dovuto usare la funzione di layout * con un letterale "," di giustapporre l'0 e 95. Se questo è solo per scrivere un decimale quindi in altre localizzazioni che usano . come separatore decimale, questo non sarebbe necessario. Sospetto che nelle tue impostazioni locali, puoi utilizzare la seconda versione di seguito ma scrivendo [0,99] anziché [0.99], ma non lo so.

Se hai appena messo

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

si era appena ottiene un errore:

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

Questo è perché il lato destro della == funzione/operatore non è presente. Dato che non vuoi nulla dopo lo == (sulla linea corrente!), Devi usare qualcosa che non aggiunge spazio extra ma fornisce un lato destro valido per ==. Qui uso phantom() che funge da segnaposto ma non lascia spazio (dato che non fornisco argomenti). Ma puoi anche usare == "", sostituendo "" per phantom().

Per ottenere il testo dello stesso colore della riga, utilizzare l'argomento text.col.

Qui è la cosa in pieno con tutte le vostre richieste soddisfatti (in qualche modo):

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) 

Sembra che si sta utilizzando il LaTeX _ per ottenere apice. Nel diagramma è necessario [ ]. Noterai anche che non è così bello tipograficamente --- non c'è abbastanza spazio tra le voci della legenda, ma uno spazio tra gli elementi all'interno di una singola voce. Questo perché stiamo abusando di atop per falsificare la nuova riga. Possiamo gestirlo utilizzando l'argomento y.intersp di legend. Aumentandolo a 2 si ottiene uno spazio sufficiente.

Combinando questo, vorrei fare le seguenti operazioni per soddisfare tutte le vostre esigenze:

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) 

Questo produce:

enter image description here