web-dev-qa-db-fra.com

Lettres en indice dans le libellé de l'axe ggplot

Un autre graphique pour la publication, un autre jour passé à peaufiner les choses dans ggplot2 ... Suis-je whinging? Je ne suis pas sûr...

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

J'essaie de comprendre comment insérer des lettres en indice dans une étiquette d'axe. Le premier exemple fonctionne comme s'il s'agissait d'un nombre, dès que vous avez un caractère entre crochets, il échoue. Blah [indice (1d)] est essentiellement ce dont j'ai besoin, mais je ne vois pas comment le faire pour me laisser avoir des lettres en indice. J'ai essayé des variantes, notamment paste (), etc.

Bien sûr, pour ajouter à la frustration ...

labs(y=expression(Blah[12])) - cela fonctionne

labs(y=expression(Blah[d])) - cela fonctionne

labs(y=expression(Blah[d1])) - cela fonctionne

labs(y=expression(Blah[1d])) - cela échoue.

Pensées?

58
nzcoops

Je peux penser à deux meilleurs moyens que d'utiliser 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"]))

Les jetons (ou "noms" ou "symboles") dans R ne sont pas supposés commencer par des chiffres. Donc, vous contournez cette limitation en citant ou en séparant 1 et d par un séparateur autre que l’espace, le * _ opérateur. Cela "rejoint" ou "lie" un littéral numérique pur avec un symbole ou un jeton R légal.

Pour obtenir un signe de pourcentage désabonné, il suffit de:

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

Pour mettre entre parenthèses autour du signe de pct:

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

Le % Le caractère a une signification particulière dans l'analyse R, car il signifie le début d'un opérateur infixe défini par l'utilisateur. Donc, l'utiliser comme un littéral nécessite qu'il soit cité. Le même raisonnement nécessite de citer "pour" et "dans", car ils appartiennent au groupe "mots réservés" pour R. Il existe d'autres mots réservés (mais for et in sont ceux qui me font trébucher le plus souvent.) Type:

 ?Reserved
64
42-

D'accord. Je jure que je n'ai pas posté ceci juste pour y répondre moi-même, malgré la rapidité avec laquelle je l'ai eu (toujours comme ça quand on pose une question!)

C'est ici:

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

Je pensais qu'il était préférable d'afficher la réponse plutôt que de supprimer la question car cela pourrait aider quelqu'un d'autre un jour.

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

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

8
nzcoops