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?
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.)
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])))
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")
plot(1:10, xlab = expression(xLab * x^2 * m^-2),
ylab = expression(yLab * y^2 * m^-2),
main="Plot 2")
plot(1:10, xlab = expression(xLab ~ x^2 * m^-2),
ylab = expression(yLab ~ y^2 * m^-2),
main="Plot 3")
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 *")"))
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()
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)
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.