Combinar funciones paste () y expression () en etiquetas de gráficos


Considere este simple ejemplo:

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

Lo que quiero es la entrada de caracteres definida por la variable ' labName, 'xLab 'o' yLab ' aparecerá junto a la X^2 o y^2 definida por la expresión(). Tal como está, el texto real 'labName' con un subíndice se une a la expresión superíndice.

¿Algún pensamiento?

 56
Author: Léo Léopold Hertz 준영, 2011-02-11

5 answers

Una solución alternativa a la de @Aaron es la función bquote(). Necesitamos proporcionar una expresión R válida, en este caso LABEL ~ x^2 por ejemplo, donde LABEL es la cadena que desea asignar desde el vector labNames. bquote evalúa el código R dentro de la expresión envuelta en .( ) y sustituye el resultado en la expresión.

Aquí hay un ejemplo:

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

(Tenga en cuenta que el {[7] } solo agrega un poco de espacio, si no desea el espacio, reemplácelo con * y las dos partes de la la expresión será yuxtapuesta.)

 56
Author: Gavin Simpson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-14 13:47:06

Use substitute en su lugar.

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])))
 22
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-11 22:00:10

EDITAR: se agregó un nuevo ejemplo para ggplot2 al final

Ver ?plotmath para las diferentes operaciones matemáticas en R

Debería poder usar la expresión sin pegar. Si usa el símbolo tilda ( ~ ) dentro de la función de expresión asumirá que hay un espacio entre los caracteres, o podría usar el símbolo * y no pondrá un espacio entre los argumentos

A veces tendrá que cambiar los márgenes en que está poniendo superíndices en el eje 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")

introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

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

introduzca la descripción de la imagen aquí

Esperemos que pueda ver las diferencias entre las parcelas 1, 2 y 3 con los diferentes usos de los símbolos ~ y*. Una nota adicional, usted puede utilizar otros símbolos tales como trazar el símbolo de grado para temperaturas para o mu, phi. Si desea agregar un subíndice, use los corchetes.

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

introduzca la descripción de la imagen aquí

Aquí hay un ejemplo de ggplot usando expression con un ejemplo sin sentido

require(ggplot2)

O si tiene instalada la biblioteca pacman, puede usar p_load para descargar, cargar y adjuntar automáticamente paquetes de complementos

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

introduzca la descripción de la imagen aquí

 16
Author: anotherFishGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-02 15:53:50

Muy buen ejemplo usando pegar y sustituir para tipografiar ambos símbolos (mathplot) y variables en http://vis.supstat.com/2013/04/mathematical-annotation-in-r /

Aquí está una adaptación de 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)
 4
Author: WMash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-20 17:52:29

Si x^2 e y^2 eran expresiones ya dadas en la variable al cuadrado, esto resuelve el 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)

Tenga en cuenta el [[1]] detrás cuadrado[1]. Te da el contenido de " expresión(...) "between the brackets without any escape characters.

 2
Author: daniel.neumann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 13:27:47