Come cambio la formattazione dei numeri su un asse con ggplot?


131

Sto usando R e ggplot per disegnare un grafico a dispersione di alcuni dati, tutto va bene tranne che i numeri sull'asse y stanno uscendo con formattazione esponente in stile computer, cioè 4e + 05, 5e + 05, ecc. Questo ovviamente inaccettabile, quindi voglio ottenerlo per visualizzarli come 500.000, 400.000 e così via. Anche ottenere una notazione esponente adeguata sarebbe accettabile.

Il codice per la trama è il seguente:

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

Qualsiasi aiuto molto apprezzato.


30
Fai attenzione a descrivere le ggplotopzioni predefinite come "ovviamente inaccettabili". Vuoi dire che hai una preferenza personale per un formato diverso. Un numero nel formato 4e+05è notazione scientifica e sarebbe la formattazione preferita in un'ampia varietà di applicazioni.
Andrie,

53
4e + 05 non è una notazione scientifica, è un'approssimazione al computer di una notazione scientifica. Non sarebbe accettabile in nessun giornale di stampa che mi viene in mente, quindi lo considero inaccettabile per la mia tesi di laurea.
Jack Aidley,

Risposte:


126

Un'altra opzione è formattare le etichette dei tick degli assi con virgole utilizzando il pacchetto scalese aggiungendo

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

alla tua dichiarazione ggplot.

Se non si desidera caricare il pacchetto, utilizzare:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

9
Incredibile che un problema così banale richieda il caricamento di un nuovo pacchetto.
luchonacho,

Cordiali saluti, questo funziona anche con scale_y_log10 (labels = scales :: virgola), e sto assumendo altre scale in ggplot2. Ottimi consigli!
TheProletariat,

66

Ho anche trovato un altro modo di fare ciò che dà una corretta notazione 'x10 (apice) 5' sugli assi. Lo sto postando qui nella speranza che possa essere utile ad alcuni. Ho preso il codice da qui, quindi non pretendo alcun credito per questo, che giustamente va a Brian Diggs.

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

Che puoi quindi usare come

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 

10
Se non si desidera che 0 venga stampato come "0 x 10⁺⁰", aggiungere quanto segue sotto la format(...)riga:l <- gsub("0e\\+00","0",l)
semi-estrinseco

1
Se si desidera eseguire altri casi speciali, è più semplice aggiungerne altri gsub()direttamente dopo format(), testando ciò che viene format()restituito per il proprio caso in una console separata.
semiestrinseco,

3
aggiungi questo prima dell'ultimo gsubcomando: # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)e dopo di esso: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)per renderlo nel formato normalmente usato nei documenti.
John_West,

44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

Quando provo questo, ricevo un errore che il formatter è un argomento inutilizzato? Ha bisogno di un altro pacchetto o qualcosa del genere?
Jack Aidley,

4
Ho modificato il codice per includerlo library(scales)e utilizzarlo, commache dovrebbe funzionare meglio della funzione che avevo prima.
DiscreteCircle

16

Sono in ritardo qui, ma nel caso altri desiderino una soluzione semplice, ho creato una serie di funzioni che possono essere chiamate come:

 ggplot + scale_x_continuous(labels = human_gbp)

che ti danno numeri leggibili dall'uomo per gli assi x o y (o qualsiasi numero in generale davvero).

Puoi trovare le funzioni qui: Github Repo Basta copiare le funzioni nel tuo script in modo da poterle chiamare.


10

Trovo utile la risposta suggerita da Jack Aidley.

Volevo buttare via un'altra opzione. Supponiamo di avere una serie con molti numeri piccoli e che tu voglia assicurarti che le etichette degli assi scrivano il punto decimale completo (es. 5e-05 -> 0.0005), quindi:

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy) 

23
Questo può essere abbreviato utilizzando una funzione anonima: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})perché non esiste un formattatore predefinito come quello, l'inferno lo sa.
eMPee584,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.