2011-02-11 2 views
49

Considerate questo semplice esempio:La combinazione di pasta() e di espressione() Funzioni nella trama etichette

labNames <- c('xLab','yLabl') 
plot(c(1:10),xlab=expression(paste(labName[1], x^2)),ylab=expression(paste(labName[2], y^2))) 

Quello che voglio è per l'immissione di caratteri definito dalla variabile 'labName, 'XLAB' o 'yLab' per apparire accanto a X^2 o y^2 definito dall'espressione(). Così com'è, il testo attuale "labName" con un pedice è unito all'espressione in apice.

Qualche idea?

risposta

49

Una soluzione alternativa a quella del @Aaron è la funzione bquote(). È necessario fornire un'espressione R valida, ad esempio LABEL ~ x^2, dove LABEL è la stringa che si desidera assegnare dal vettore labNames. bquote valuta il codice R all'interno dell'espressione spostata in .() e sostituisce il risultato nell'espressione.

Ecco un esempio:

labNames <- c('xLab','yLab') 
xlab <- bquote(.(labNames[1]) ~ x^2) 
ylab <- bquote(.(labNames[2]) ~ y^2) 
plot(c(1:10), xlab = xlab, ylab = ylab) 

(Si noti la ~ aggiunge solo un po 'di distanza, se non si vuole lo spazio, sostituirlo con * e le due parti dell'espressione saranno giustapposte .)

20

Utilizzare invece substitute.

labNames <- c('xLab','yLab') 
plot(c(1:10), 
    xlab=substitute(paste(nn, x^2), list(nn=labNames[1])), 
    ylab=substitute(paste(nn, y^2), list(nn=labNames[2]))) 
+8

Siete ragazzi gemelli? =) – aL3xa

3

bellissimo esempio con pasta e sostituto per comporre entrambi i simboli (mathplot) e le variabili in http://vis.supstat.com/2013/04/mathematical-annotation-in-r/

Ecco un adattamento ggplot

library(ggplot2) 
x_mean <- 1.5 
x_sd <- 1.2 
N <- 500 

n <- ggplot(data.frame(x <- rnorm(N, x_mean, x_sd)),aes(x=x)) + 
    geom_bar() + stat_bin() + 
    labs(title=substitute(paste(
      "Histogram of random data with ", 
      mu,"=",m,", ", 
      sigma^2,"=",s2,", ", 
      "draws = ", numdraws,", ", 
      bar(x),"=",xbar,", ", 
      s^2,"=",sde), 
      list(m=x_mean,xbar=mean(x),s2=x_sd^2,sde=var(x),numdraws=N))) 

print(n) 
11

EDIT: aggiunto un nuovo esempio per ggplot2 alla fine

Vedi plotmath per le diverse operazioni matematiche in R

Si dovrebbe essere in grado di usare l'espressione, senza pasta?. Se si utilizza il simbolo tilda (~) all'interno della funzione expression, si presuppone che ci sia uno spazio tra i caratteri, oppure si potrebbe usare il simbolo * e non inserirà uno spazio tra gli argomenti

A volte è necessario per cambiare i margini nel mettere gli apici sull'asse y.

par(mar=c(5, 4.3, 4, 2) + 0.1) 
plot(c(1:10), xlab = expression(xLab ~ x^2 ~ m^-2), 
    ylab = expression(yLab ~ y^2 ~ m^-2), 
    main="Plot 1") 

enter image description here

plot(c(1:10), xlab = expression(xLab * x^2 * m^-2), 
    ylab = expression(yLab * y^2 * m^-2), 
    main="Plot 2") 

enter image description here

plot(c(1:10), xlab = expression(xLab ~ x^2 * m^-2), 
    ylab = expression(yLab ~ y^2 * m^-2), 
    main="Plot 3") 

enter image description here

Speriamo che si può vedere le differenze tra trame 1, 2 e 3 con i vari usi del ~ e * simboli. Una nota in più, è possibile utilizzare altri simboli, come ad esempio il simbolo del grado per temperature per o mu, phi. Se vuoi aggiungere un pedice usa le parentesi quadre.

plot(c(1:10), xlab = expression('Your x label' ~ mu[3] * phi), 
    ylab = expression("Temperature (" * degree * C *")")) 

enter image description here

Ecco un esempio ggplot usando l'espressione con un esempio di assurdità

require(ggplot2) 

Oppure, se sei la libreria pacman installato è possibile utilizzare p_load per scaricare automaticamente e caricare e allegare aggiungere -on pacchetti

# require(pacman) 
# p_load(ggplot2) 

data = data.frame(x = 1:10, y = 1:10) 

ggplot(data, aes(x,y)) + geom_point() + 
    xlab(expression(bar(yourUnits) ~ g ~ m^-2 ~ OR ~ integral(f(x)*dx, a,b))) + 
    ylab(expression("Biomass (g per" ~ m^3 *")")) + theme_bw() 

enter image description here

+0

Ho iniziato a utilizzare ggplot come strumento principale di tracciamento e questo metodo funziona anche per ggplot – anotherFishGuy

1

Se x^2 e y^2 erano espressioni già indicate nella variabile al quadrato, questo risolve il problema:

labNames <- c('xLab','yLab') 
squared <- c(expression('x'^2), expression('y'^2)) 

xlab <- eval(bquote(expression(.(labNames[1]) ~ .(squared[1][[1]])))) 
ylab <- eval(bquote(expression(.(labNames[2]) ~ .(squared[2][[1]])))) 

plot(c(1:10), xlab = xlab, ylab = ylab) 

prega di notare la [[1]] dietro quadrata [1]. Ti dà il contenuto di "espressione (...)" tra parentesi senza caratteri di escape.