web-dev-qa-db-fra.com

Combinaison des fonctions paste () et expression () dans les étiquettes de tracé

Considérez cet exemple simple:

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

Ce que je veux, c'est que l'entrée de caractère définie par la variable 'labName,' xLab 'ou' yLab 'apparaisse à côté du X ^ 2 ou du y ^ 2 défini par l'expression (). Dans l'état actuel des choses, le texte "Nom du laboratoire" avec un indice est joint à l'expression en exposant.

Des pensées?

61
Aaron

Une solution alternative à celle de @Aaron est la fonction bquote(). Nous devons fournir une expression R valide, dans ce cas LABEL ~ x^2 Par exemple, où LABEL est la chaîne que vous souhaitez affecter à partir du vecteur labNames. bquote évalue le code R dans l'expression encapsulée dans .( ) et substitue le résultat à l'expression.

Voici un exemple:

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

(Notez que ~ Ajoute simplement un peu d'espacement. Si vous ne voulez pas d'espace, remplacez-le par * Et les deux parties de l'expression seront juxtaposées.)

63
Gavin Simpson

Utilisez substitute à la place.

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])))
26
Aaron

EDIT: ajout d'un nouvel exemple pour ggplot2 à la fin

Voir ? Plotmath pour les différentes opérations mathématiques dans R

Vous devriez pouvoir utiliser une expression sans coller. Si vous utilisez le symbole tilda (~) dans la fonction expression, il supposera qu'il y a un espace entre les caractères ou vous pouvez utiliser le symbole * sans mettre d'espace entre les arguments.

Parfois, vous devrez modifier les marges lorsque vous mettez des indices supérieurs sur l'axe des y.

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

enter image description here

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

enter image description here

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

enter image description here

J'espère que vous pourrez voir les différences entre les parcelles 1, 2 et 3 avec les différentes utilisations des symboles ~ et *. Une note supplémentaire, vous pouvez utiliser d'autres symboles tels que tracer le symbole de degré pour les températures pour ou mu, phi. Si vous souhaitez ajouter un indice, utilisez les crochets.

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

enter image description here

Voici un exemple de ggplot utilisant une expression avec un exemple absurde

require(ggplot2)

Ou si vous avez installé la bibliothèque pacman, vous pouvez utiliser p_load pour télécharger, charger et attacher automatiquement des packages complémentaires.

# 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

22
s_scolary

Très bel exemple d'utilisation de coller et substituer pour composer les symboles (mathplot) et les variables à http://vis.supstat.com/2013/04/mathematical-annotation-in-r/

Voici une adaptation 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)
7
WMash

Si x ^ 2 et y ^ 2 étaient des expressions déjà données dans la variable au carré, cela résout le problème:

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)

Veuillez noter le [[1]] derrière le carré [1]. Il vous donne le contenu de "expression (...)" entre les crochets sans aucun caractère d'échappement.

3
daniel.neumann