85 votes

Lettres en indice dans l'étiquette de l'axe du ggplot

J'essaie de comprendre comment avoir des lettres en indice dans une étiquette d'axe.

dat <- data.frame(x = rnorm(100), y = rnorm(100))
ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1]))

dat <- data.frame(x = rnorm(100), y = rnorm(100))
ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1d]))

Le premier exemple fonctionne car il s'agit simplement d'un nombre, mais dès qu'il y a un caractère entre les crochets, il échoue. Blah[subscript(1d)] est essentiellement ce dont j'ai besoin, mais je n'arrive pas à comprendre comment il peut me permettre d'avoir des lettres en subscript. J'ai essayé des variantes, notamment paste() .

Les exemples suivants montrent un comportement étrange :

labs(y=expression(Blah[12])) # this works
labs(y=expression(Blah[d])) # this works
labs(y=expression(Blah[d1])) # this works
labs(y=expression(Blah[1d])) # this fails

Réflexions ?

84voto

BondedDust Points 105234

La raison pour laquelle la dernière échoue est que les arguments de expression sont soumis à l'analyseur syntaxique de R et une erreur est renvoyée s'ils ne satisfont pas au test visant à déterminer s'ils peuvent être une syntaxe R correcte. La chaîne ou le jeton 1d n'est pas un jeton (ou symbole) R valide. Il serait possible de le décomposer en jetons R valides et de le "connecter" avec des opérateurs non spatiaux, de le mettre en retrait ou d'utiliser des guillemets ordinaires. Je pense que l'une ou l'autre de ces solutions est meilleure que l'utilisation de paste :

 ggplot(dat, aes(x=x,y=y)) +
     geom_point() +
     labs(y=expression(Blah[1*d]))
 ggplot(dat, aes(x=x,y=y)) +
     geom_point() +
     labs(y=expression(Blah["1d"]))

Dans R, les jetons (ou "noms" ou "symboles") ne sont pas censés commencer par des chiffres. Vous pouvez donc contourner cette limitation en mettant des guillemets ou en séparant les éléments suivants 1 y d par un séparateur non spatial, le * de l'opérateur. Il "joint" ou "lie" un littéral numérique pur avec un symbole R ou un jeton légal.

Pour obtenir un pourcentage, il suffit de signer sans être inscrit :

 ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1*d]*"%"))

Pour mettre des parens autour du signe pct :

expression(Blah[1*d]*"(%)")

Le % a une signification particulière dans l'analyse syntaxique R, puisqu'il signifie le début d'un opérateur infixe défini par l'utilisateur. Son utilisation en tant que littéral nécessite donc qu'il soit mis entre guillemets. Le même raisonnement exige que "for" et "in" soient mis entre guillemets, car ils font partie du groupe des "mots réservés" pour R. Il existe d'autres mots réservés, (mais for y in sont ceux qui me font le plus souvent trébucher). Type :

 ?Reserved

Un autre "truc" consiste à utiliser des guillemets pour les chiffres à l'intérieur d'une même ligne. italic() si vous souhaitez les mettre en italique. Les chiffres non cités ne sont pas mis en italique dans cette fonction.

Mises en garde : paste est une fonction plotmath sauf il a une sémantique différente de celle du base::paste function . En particulier, il n'a pas d'argument "sep". Vous ne pouvez donc jamais obtenir d'espace entre les arguments imprimés et si vous essayez d'insérer un élément sans espace, une seule instance apparaîtra après tous les autres arguments étiquetés en tant que sep=" " .

paste0 n'est pas une fonction plotmath et ne sera donc pas interprétée, mais apparaîtra "non traitée" avec ses arguments non traités entre parenthèses.

14voto

nzcoops Points 2156

Je jure que je n'ai pas posté cette question pour y répondre moi-même, malgré la rapidité avec laquelle j'ai reçu la réponse (c'est toujours le cas lorsqu'on pose une question !).

Le voici :

ggplot(dat, aes(x=x,y=y)) +
    geom_point() +
    labs(y=expression(Blah[1][d]))

J'ai pensé qu'il valait mieux publier la réponse plutôt que de supprimer la question, car elle pourrait aider quelqu'un d'autre un jour.

Blahs" mis à part, ce que je voulais en fait, c'était expression(paste("Hb", A[1][c]," (%)",sep=""))

Pourquoi paste0() ne fonctionne pas ici me dépasse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X