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
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
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")
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()
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")
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()
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()