ggplot scale_y_log10 () problema

Ho riscontrato un problema interessante con il ridimensionamento utilizzando ggplot. Ho un set di dati che posso tracciare bene usando la scala lineare di default, ma quando uso scale_y_log10 () i numeri vanno via. Ecco alcuni esempi di codice e due immagini. Notare che il valore massimo nella scala lineare è ~ 700 mentre il ridimensionamento del registro ha un valore di 10 ^ 8. Ti mostro che l’intero set di dati è lungo solo ~ 8000 voci, quindi qualcosa non va bene.

Immagino che il problema abbia a che fare con la struttura del mio set di dati e il binning poiché non riesco a replicare questo errore su un set di dati comune come “diamanti”. Tuttavia non sono sicuro che sia il modo migliore per risolvere i problemi.

grazie, zach cp


Modifica: bdamarest può riprodurre il problema di scala sul set di dati del diamante in questo modo:

example_1 = ggplot(diamonds, aes(x=clarity, fill=cut)) + geom_bar() + scale_y_log10(); print(example_1) 

 #data.melt is the name of my dataset > ggplot(data.melt, aes(name, fill= Library)) + geom_bar() > ggplot(data.melt, aes(name, fill= Library)) + geom_bar() + scale_y_log10() > length(data.melt$name) [1] 8003 

scala linearescala di registro

ecco alcuni dati di esempio … e penso di vedere il problema. Il set di dati fuso originale poteva essere lungo ~ 10 ^ 8 righe. Forse i numeri di riga vengono utilizzati per le statistiche?

 > head(data.melt) Library name group 221938 AB Arthrofactin glycopeptide 235087 AB Putisolvin cyclic peptide 235090 AB Putisolvin cyclic peptide 222125 AB Arthrofactin glycopeptide 311468 AB Triostin cyclic depsipeptide 92249 AB CDA lipopeptide > dput(head(test2)) structure(list(Library = c("AB", "AB", "AB", "AB", "AB", "AB" ), name = c("Arthrofactin", "Putisolvin", "Putisolvin", "Arthrofactin", "Triostin", "CDA"), group = c("glycopeptide", "cyclic peptide", "cyclic peptide", "glycopeptide", "cyclic depsipeptide", "lipopeptide" )), .Names = c("Library", "name", "group"), row.names = c(221938L, 235087L, 235090L, 222125L, 311468L, 92249L), class = "data.frame") 

AGGIORNARE:

I numeri di riga non sono il problema. Ecco gli stessi dati grafici che utilizzano lo stesso asse xe il colore di riempimento e il ridimensionamento è completamente corretto:

 > ggplot(data.melt, aes(name, fill= name)) + geom_bar() > ggplot(data.melt, aes(name, fill= name)) + geom_bar() + scale_y_log10() > length(data.melt$name) [1] 8003 

inserisci la descrizione dell'immagine quiinserisci la descrizione dell'immagine qui

geom_bar e scale_y_log10 (o qualsiasi scala logaritmica) non funzionano bene insieme e non danno risultati attesi.

Il primo problema fondamentale è che le barre vanno a 0, e su una scala logaritmica, 0 viene trasformato in infinito negativo (che è difficile da tracciare). La greppia attorno a questo di solito inizia da 1 piuttosto che da 0 (poiché $ \ log (1) = 0 $), non traccia nulla se ci sono 0 conteggi, e non ti preoccupare della distorsione perché se è necessaria una scala di log probabilmente non non mi interessa essere fuori da 1 (non necessariamente vero, ma …)

Sto usando l’esempio di diamonds mostrato da @dememarest.

Fare questo in generale è trasformare la coordinata, non la scala (più sulla differenza più tardi).

 ggplot(diamonds, aes(x=clarity, fill=cut)) + geom_bar() + coord_trans(ytrans="log10") 

Ma questo dà un errore

 Error in if (length(from) == 1 || abs(from[1] - from[2]) < 1e-06) return(mean(to)) : missing value where TRUE/FALSE needed 

che deriva dal problema dell'infinito negativo.

Quando si utilizza una trasformazione di scala, la trasformazione viene applicata ai dati, quindi vengono eseguite le statistiche e le disposizioni, quindi le scale vengono etichettate nella trasformazione inversa (approssimativamente). Puoi vedere cosa sta succedendo scoppiando i calcoli tu stesso.

 DF <- ddply(diamonds, .(clarity, cut), summarise, n=length(clarity)) DF$log10n <- log10(DF$n) 

che dà

 > head(DF) clarity cut n log10n 1 I1 Fair 210 2.322219 2 I1 Good 96 1.982271 3 I1 Very Good 84 1.924279 4 I1 Premium 205 2.311754 5 I1 Ideal 146 2.164353 6 SI2 Fair 466 2.668386 

Se tracciamo questo nel modo normale, otteniamo il grafico a barre previsto:

 ggplot(DF, aes(x=clarity, y=n, fill=cut)) + geom_bar(stat="identity") 

inserisci la descrizione dell'immagine qui

e scalare l'asse y dà lo stesso problema dell'utilizzo dei dati non pre-riassunti.

 ggplot(DF, aes(x=clarity, y=n, fill=cut)) + geom_bar(stat="identity") + scale_y_log10() 

inserisci la descrizione dell'immagine qui

Possiamo vedere come si verifica il problema log10() valori log10() dei conteggi.

 ggplot(DF, aes(x=clarity, y=log10n, fill=cut)) + geom_bar(stat="identity") 

inserisci la descrizione dell'immagine qui

Sembra scale_y_log10 quello con scale_y_log10 , ma le etichette sono 0, 5, 10, ... invece di 10 ^ 0, 10 ^ 5, 10 ^ 10, ...

Quindi, utilizzando scale_y_log10 rende i conteggi, li converte in registri, impila questi registri e quindi visualizza la scala nel modulo anti-log. Tuttavia, i registri di impilamento non sono una trasformazione lineare, quindi ciò che gli hai chiesto di fare non ha alcun senso.

La linea di fondo è che i grafici a barre in pila su una scala di log non hanno molto senso perché non possono iniziare a 0 (dove dovrebbe essere il fondo di una barra), e il confronto di parti della barra non è ragionevole perché la loro dimensione dipende su dove sono in pila. Considerato invece qualcosa come:

 ggplot(diamonds, aes(x=clarity, y=..count.., colour=cut)) + geom_point(stat="bin") + scale_y_log10() 

inserisci la descrizione dell'immagine qui

O se vuoi davvero un totale per i gruppi che impilano le barre di solito ti danno, puoi fare qualcosa come:

 ggplot(diamonds, aes(x=clarity, y=..count..)) + geom_point(aes(colour=cut), stat="bin") + geom_point(stat="bin", colour="black") + scale_y_log10() 

inserisci la descrizione dell'immagine qui