Come posso fare in modo che i formati di testo personalizzati ggplot2 dalle funzioni di scala dell'asse seguano le specifiche di formato impostate in theme ()?

Aug 18 2020

Voglio cambiare la notazione scientifica sugli assi ggplot2 da un formato come 3.23e+6a 3.23 × 10^6. Per fortuna questa domanda ha trovato risposta qui: come cambio la formattazione dei numeri su un asse con ggplot?

Funziona bene per i casi di base. Tuttavia, non funziona quando si desidera modificare la formattazione dell'etichetta dell'asse. Ciò è illustrato da questo esempio:

library(tidyverse)
ggplot(mpg, aes(displ, hwy*10^9)) + geom_point()

#makes the scientific notation using "AeB" explicitly write out Ax10^B
fancy_scientific <- function(l) {
  # turn in to character string in scientific notation
  l <- format(l, scientific = TRUE)
  # quote the part before the exponent to keep all the digits
  l <- gsub("^(.*)e", "'\\1'e", l)
  # turn the 'e+' into plotmath format
  l <- gsub("e", "%*%10^", l)
  # return this as an expression
  parse(text=l)
}


ggplot(mpg, aes(displ, hwy*10^9)) + 
  theme_classic() +
  geom_point() + 
  scale_y_continuous(labels= fancy_scientific)  +
 theme(text = element_text(face = "bold")) 


Che produce:

Il problema è che il testo dell'asse Y non è in grassetto come specificato nella chiamata a theme. Quando uso browserper vedere cosa sta succedendo all'interno di fancy_scientificvedo che restituisce un oggetto di classe "espressione" che in questo caso viene stampato come expression('2'%*%10^+01, '3'%*%10^+01, '4'%*%10^+01)mentre la funzione scales::scientific, che può essere usata per forzare la notazione scientifica del tipo che voglio evitare ma è conforme in base alle specifiche del tema impostate, restituisce direttamente un vettore di stringhe. Quando modifico fancy_scientificper restituire un vettore di stringhe come '2'%*%10^+01se fossero renderizzate direttamente sull'asse Y visualizzato.

Quindi la domanda è: come faccio a rendere l'output della fancy_scientificfunzione conforme alle specifiche del mio tema?

Risposte

JordanMandel Aug 20 2020 at 02:54

Un modo per farlo, come suggerito dal commento, è il ggtextpacchetto.

library(tidyverse)
library(ggtext)
ggplot(mpg, aes(displ, hwy*10^9)) + geom_point()


#makes the scientific notation using "AeB" explicitly write out Ax10^B
fancy_scientific <- function(l) {
  # turn in to character string in scientific notation
  l <- format(l, scientific = TRUE)
  # quote the part before the exponent to keep all the digits
  l <- gsub("^(.*)e", "'\\1'e", l)
  # turn the 'e+' into plotmath format
  l <- gsub("e", "%*%10^", l)
  # return this as an expression
  parse(text=l)
}


ggplot(mpg, aes(displ, hwy*10^9)) + 
  theme_classic() +
  geom_point() + 
  scale_y_continuous(labels= fancy_scientific)  +
  theme(text = element_text(face = "bold"), 
        axis.text.y = element_markdown(face = "bold")) 

Se esegui questo codice, tuttavia, noterai alcuni problemi. Ci sono virgolette attorno al numero iniziale, che possono essere eliminate cancellando le virgolette singole in l <- gsub("^(.*)e", "'\\1'e", l). Ricevo un errore quando specifico textcome element_markdown()perché apparentemente ci sono alcuni valori predefiniti che devono essere impostati per altre parti del testo. Quindi devo impostare specificamente axis.text.ycome element_markdown. Ciò lascia il problema di visualizzare un segno dei tempi reali. Farò una domanda di follow-up su questo perché ho risposto alla domanda su come applicare la formattazione in grassetto, anche se sono anche curioso di sapere come impostare element_markdowncorrettamente i valori predefiniti in modo da poterlo utilizzare per specificare textanziché axis.text.y.