2011-01-15 9 views
25

Ich habe folgendes Problem: Ich möchte eine diskrete und eine kontinuierliche Variable auf einem Boxplot visualisieren, in dem letzterer einige extrem hohe Werte hat. Das macht den Boxplot bedeutungslos (die Punkte und sogar der "Körper" des Charts sind zu klein), deshalb möchte ich das auf einer Log10-Skala zeigen. Mir ist bewusst, dass ich die extremen Werte aus der Visualisierung weglassen könnte, aber das ist nicht beabsichtigt.Transformiere nur eine Achse auf log10 mit ggplot2

Nehmen wir ein einfaches Beispiel mit Diamanten Daten sehen:

m <- ggplot(diamonds, aes(y = price, x = color)) 

alt text

Das Problem hier ist nicht ernst, aber ich hoffe, dass man sich vorstellen kann, warum ich möchte die Werte bei einer log10 Skala sehen . Versuchen wir es:

m + geom_boxplot() + coord_trans(y = "log10") 

alt text

Wie Sie die y-Achse ist log10 skaliert sehen und sieht gut aus, aber es gibt ein Problem mit der x-Achse, die die Handlung sehr merkwürdig macht.

Das Problem tritt nicht mit scale_log auf, aber das ist keine Option für mich, da ich einen benutzerdefinierten Formatierer auf diese Weise nicht verwenden kann. Z.B .:

m + geom_boxplot() + scale_y_log10() 

alt text

Meine Frage: jemand eine Lösung kennt die boxplot mit log10 Skala auf der y-Achse plotten, die Etiketten frei mit einer formatter Funktion wie in diesem thread formatiert werden könnte?


die Frage bearbeiten Beantworter auf Antworten und Kommentare basierend zu helfen:

Was ich wirklich nach: ein log10 transformierte Achse (y) mit nicht wissenschaftlichen Etiketten. Ich möchte es wie Dollar (formatter=dollar) oder irgendein kundenspezifisches Format beschriften.

Wenn ich @ hadley Vorschlag versuchen, erhalte ich die folgenden Warnungen:

> m + geom_boxplot() + scale_y_log10(formatter=dollar) 
Warning messages: 
1: In max(x) : no non-missing arguments to max; returning -Inf 
2: In max(x) : no non-missing arguments to max; returning -Inf 
3: In max(x) : no non-missing arguments to max; returning -Inf 

bei unveränderter y-Achse Etiketten:

alt text

+2

T Das ist ein Fehler in 'coord_trans' - aber Sie können benutzerdefinierte Bezeichnungen für' scale_y_log10' angeben ... – hadley

+0

Danke @hadley, ich sollte etwas vermissen, aber zB.'+ scale_y_continous (Formatierer = Dollar)' funktioniert einfach nicht. Ich kann das Ergebnis eines Formatierer nicht sehen und ich bekomme auch drei 'In max (x): keine nicht fehlenden Argumente zu max; "Warnmeldungen" zurückgeben. – daroczig

+0

@daroxzig: Die Beispiele, die ich für das Formatiererargument gesehen habe, haben alle zitierte Namen, also vielleicht 'formatter =" dollar "'? –

Antwort

16

Die einfachste ist, einfach den Namen der Formatierer Argument geben der Protokollfunktion:

m + geom_boxplot() + scale_y_continuous(formatter='log10') 

ED IT: Oder wenn Sie mögen, dass dann nicht eine dieser erscheint das gleiche Ergebnis zu erhalten:

m <- ggplot(diamonds, aes(y = price, x = color), log="y"); m + geom_boxplot() 
m <- ggplot(diamonds, aes(y = price, x = color), log10="y"); m + geom_boxplot() 

EDIT2 & 3: Weitere Experimente (nach dem ein Verwerfen, die erfolgreich versucht, „$“ Zeichen zu setzen vor protokollierten Werte):

fmtExpLg10 <- function(x) paste(round_any(10^x/1000, 0.01) , "K $", sep="") 
ggplot(diamonds, aes(color, log10(price))) + 
geom_boxplot() + 
scale_y_continuous("Price, log10-scaling", formatter = fmtExpLg10) 

alt text

Anmerkung hinzugefügt Mitte 2017 Kommentare über Paket-Syntax ändern:

scale_y_continuous (Formatierer = 'log10') ist jetzt scale_y_continuous (trans = 'log10') (ggplot2 v2.2.1)

+0

Danke @DWin, aber das ist nicht das, was ich gesucht habe. Auf diese Weise werden die Beschriftungen der y-Achse in log10 konvertiert, aber die Achse wird nicht transformiert. Was ich gerne bekommen würde: eine umgewandelte Achse (y) mit nicht wissenschaftlichen Bezeichnungen. – daroczig

+0

@daroczig: Sehen Sie, ob dies befriedigender ist. Ich hätte geschworen, dass ich beim ersten Mal, als ich meine erste Lösung hatte, sogar Zehnerpotenzen bekommen habe, aber ich kann es nicht reproduzieren. Vielleicht war ich so konzentriert auf die x-Positionen zu sehen, dass ich die offensichtlichen Probleme übersehen habe –

+0

Danke @DWin, ich habe gerade Ihre Vorschläge getestet, aber wie ich sehen kann, geben beide Befehle das gleiche zurück: das erste Bild, das ich an meine Frage angehängt habe. Was ich gerne bekommen würde: die letzten Plots in meiner Frage (Nr. 3 und 4, da sie gleich sind) mit anpassbarer Etikettenformatierung. – daroczig

0

Ich glaube, ich habe es schließlich durch einige manuelle Transformationen mit den Daten zu tun vor Visualisierung:

d <- diamonds 
# computing logarithm of prices 
d$price <- log10(d$price) 

Und eine Formatierer später Compute erarbeiten 'zurück' der logarithmischen Daten:

formatBack <- function(x) 10^x 
# or with special formatter (here: "dollar") 
formatBack <- function(x) paste(round(10^x, 2), "$", sep=' ') 

Und die Handlung mit bestimmten Formatierer ziehen:

m <- ggplot(d, aes(y = price, x = color)) 
m + geom_boxplot() + scale_y_continuous(formatter='formatBack') 

alt text

Sorry an die Community, die Sie mit einer Frage zu stören ich vorher gelöst haben könnte! Der lustige Teil ist: Ich habe hart gearbeitet, um dieses Komplott vor einem Monat arbeiten zu lassen, aber es ist mir nicht gelungen. Nachdem ich hier gefragt habe, habe ich es verstanden.

Wie auch immer, dank @DWin für die Motivation!

12

Ich hatte ein ähnliches Problem und diese Skala für mich wie ein Charme:

breaks = 10**(1:10) 
scale_y_log10(breaks = breaks, labels = comma(breaks)) 

, wie Sie die Zwischenebene wollen, auch (10^3.5), müssen Sie die Formatierung zwicken:

breaks = 10**(1:10 * 0.5) 
m <- ggplot(diamonds, aes(y = price, x = color)) + geom_boxplot() 
m + scale_y_log10(breaks = breaks, labels = comma(breaks, digits = 1)) 

Nach der Ausführung ::

enter image description here

+0

Ich habe gerade bemerkt, dass [sehr ähnliches Problem] (http://stackoverflow.com/questions/2906855/how-to-override-ggplot2s-axis-formatting) die gleiche Lösung hat. –

+2

danke, dass Sie meine Aufmerksamkeit auf diese alternative Lösung gelenkt haben, die mit der Angabe des einfachen 'Dollar'-Formatierers oder mit dem Schreiben einer benutzerdefinierten Lösung abgeschlossen wäre:' + scale_y_log10 (breaks = breaks, labels = dollar (breaks)) ' – daroczig

Verwandte Themen