2012-07-20 25 views
22

Ich habe einen Datenrahmen, der im Laufe der Zeit mehrere Messungen erfasst, dass ich eine 3x1 Facette visualisieren möchte. Jede Kennzahl enthält jedoch unterschiedliche Einheiten/Maßstäbe, die von benutzerdefinierten Umwandlungen und Kennzeichnungsschemata profitieren würden.Variierende Achsenetiketten Formatierer pro Facette in ggplot/R

Also, meine Frage ist: Wenn die Einheiten und Skalen über verschiedene Facetten unterschiedlich sind, wie kann ich einen benutzerdefinierten Formatierer oder Transformation (d. H. Log10) auf eine bestimmte Achse innerhalb einer Facette angeben?

Zum Beispiel lassen Sie uns sagen, ich habe die Daten:

df = data.frame(dollars=10^rlnorm(50,0,1), counts=rpois(50, 100)) 
melted.df = melt(df, measure.var=c("dollars", "counts")) 

Wie würde man gehen auf eine 2x1 Facette zeigt Dollar und zählt über den Index mit labels=dollars und scale_y_continuous(trans = "log10", ...) für die df$dollars Daten einrichten?

Vielen Dank!

+0

nicht einfach, denke ich ... –

+0

Ja. Scheißt. Ich bin gerade auf diesen Link gestoßen, wo jemand ein ähnliches Problem hatte: http://comments.gmane.org/gmane.comp.lang.r.gplot2/4496. –

+0

Wahrscheinlich einfacher, zwei getrennte Plots zu machen und sie zusammen zu ordnen. –

Antwort

40

Wie Sie herausgefunden haben, gibt es keine einfache Lösung, aber es kommt viel auf. Da diese Art von Ding so oft gefragt wird, finde ich es hilfreich zu erklären warum das ist schwer, und schlagen eine mögliche Lösung vor.

Meine Erfahrung ist, dass die Menschen im Grunde den Zweck der Facettierung mißverstehen zu ggplot2 oder Gitter Grafiken kommen (oder trellising, in Gitter). Diese Funktion wurde mit einer sehr spezifischen Idee entwickelt: die Visualisierung von Daten über mehrere Gruppen hinweg, die eine gemeinsame Skala teilen. Es kommt von etwas, das das Prinzip der kleinen Vielfachen genannt wird und von Tufte und anderen vertreten wird.

Das Platzieren von Platten nebeneinander mit sehr unterschiedlichen Maßstäben ist etwas, das visuelle Design-Experten neigen zu vermeiden, weil es im besten Fall irreführend sein kann. (Ich schimpfe Sie nicht hier, nur die Begründung zu erklären ...)

Aber natürlich, sobald Sie dieses großartige Werkzeug in der Öffentlichkeit haben, wissen Sie nie, wie die Leute es verwenden werden. So wird es gestreckt: Die Anforderungen kommen in die Fähigkeit, die Skalen je nach Panel variieren zu lassen und verschiedene Aspekte des Plots für jedes Panel getrennt einzustellen. Und so facettiert in ggplot2 wurde weit über seine ursprüngliche Absicht erweitert.

Eine Konsequenz daraus ist, dass einige Dinge schwierig zu implementieren sind, einfach aufgrund der ursprünglichen Designabsicht der Funktion. Dies ist wahrscheinlich ein solches Beispiel.

Ok, genug Erklärung. Hier ist meine Lösung.

Der Trick hier ist zu erkennen, dass Sie nicht Diagramme grafisch darstellen, die eine Skala teilen. Für mich bedeutet das, dass Sie gar nicht daran denken sollten, Facettierungen zu verwenden. Stattdessen jede Parzelle separat machen, und ordnen sie zusammen in einem Grundstück:

library(gridExtra) 

p1 <- ggplot(subset(melted.df,variable == 'dollars'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() + 
      scale_x_log10(labels = dollar_format()) 

p2 <- ggplot(subset(melted.df,variable == 'counts'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() 

grid.arrange(p1,p2) 

enter image description here

ich auf das, was gerade erraten haben geom_* Sie verwenden wollten, und ich bin sicher, das ist nicht wirklich Was Sie planen wollten, aber es illustriert zumindest das Prinzip.

+0

Vielen Dank für die aufschlussreiche Antwort! Ich verstehe die Implikationen der Abkehr von den ursprünglichen Designvorgaben für ggplot2 völlig. Praktisch gesagt, ich habe zwei Datensätze, in denen einer einer normalen Verteilung folgt, während der andere einer logarithmischen Normalverteilung folgt, also hoffte ich, diese visuell normalisierten Daten über die Zeit hinweg vergleichen zu können. Haben Sie irgendwelche Einsichten zum richtigen Ausrichten der Flächen? Ich bin schon einmal auf die 'ggExtra'-Bibliothek gestoßen, die angeblich dafür Ad-hoc-Unterstützung bietet, aber ich würde mich über jede Richtung freuen. –

+0

@StefanNovak Ich bin froh, dass es hilfreich war! Ich möchte nochmals betonen, dass ich Ihre Design-Entscheidungen nicht kritisiert habe. Ein Grundsatz von SO-Fragen ist, dass sie "für immer leben" und so dazu beitragen, mehr als nur den ursprünglichen Fragesteller zu dienen. Wie gesagt, das kommt immer wieder auf, so dass meine Erklärung eher auf zukünftige Leser als auf Sie gerichtet war. – joran

+1

@StefanNovak Nun, die hacky Weise, es zu tun ist, die Achsen-Tick-Etiketten so anzupassen, dass sie die gleiche Anzahl von Ziffern haben, selbst wenn das bedeutet, die Etiketten mit Leerzeichen zu füllen. Ich bin mir sicher, dass das schon vorher gefragt wurde ... Ich werde sehen, ob ich etwas relavent finden kann. – joran