2017-03-09 2 views
0

In meinem Verständnis nehmen die Stat-Methoden von ggplot Arrays von Werten und berechnen neue Werte, die durch bestimmte Ästhetik angezeigt werden können. Ich möchte, dass die Größe der Punkte proportional zur Summe einer numerischen Variablen innerhalb jeder Gruppe ist (eindeutige x, y Kombinationen). Ich war überrascht, dass, wenn es mehr als eine Werte in einer Gruppe gab, mehrere Punkte anstelle von einem Punkt, der die Summe aller Punkte darstellt, gezeichnet wurden. Hier ist ein minimales Arbeitsbeispiel:Wie man ggplot stat_sum der Größenästhetik zuordnet?

ex_data <- data.frame(
    a = sort(rep(letters[1:4], 5)), 
    b = rep(letters[6:7], 10), 
    c = rnorm(20, 1000, 500), 
    d = rep(c('h', 'h', 'i', 'i'), 5) 
) 

p <- ggplot(ex_data, 
    aes(x = b, y = a, size = log10(c), color = d, shape = d)) + 
    geom_point(stat = 'sum', alpha = 0.33) + 
    scale_radius(guide = guide_legend(title = 'c (log)')) + 
    scale_color_manual(values = c('cyan', 'magenta'), 
        guide = guide_legend(title = 'd'), 
        labels = c('h', 'i')) + 
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw() 

print(p) 

Dank niedrige alpha es sichtbar ist, dass zum Beispiel bei c-f und a-f mehr Punkten der gleichen Farbe übereinander aufgetragen. Wie kann ich erreichen, dass für jede Farbe an jeder Stelle ein Punkt vorhanden ist und die Größe dieser Markierungen die Summe aller Werte der Variablen log10(c) innerhalb dieser Gruppe darstellt?

+0

Wie kann es einen Punkt, wenn Sie zwei Farben zuordnen auf dieser Koordinate? Welche Farbe sollte dieser Punkt haben? Und welche Form? – Axeman

+0

Ich meine einen Punkt für jede Farbe, aber nicht 2 Punkte der gleichen Farbe an der gleichen Stelle – deeenes

+1

Im Allgemeinen finde ich 'stat_summary' nützlich für einfach zusammenfassende Funktionen auf der' y' Ästhetik. Es klingt so, als würde man den Datensatz bis auf einen einzelnen Wert von "c" für jede "a"/"b"/"d" Kombination zusammenfassen. Es ist wahrscheinlich am einfachsten, dies außerhalb von ggplot zu tun, indem Sie das verdichtete Datenset verwenden, um das gewünschte Diagramm zu erstellen. – aosmith

Antwort

0

Es sieht aus wie stat='sum' der Lage ist, zusammen zu arbeiten, nur mit y Ästhetik, daher müssen wir die Daten aggregieren und Statistiken anwenden, bevor zu ggplot gehen. Hier ist ein Arbeitsbeispiel mit dplyr. (Anmerkung: Stapelüberlauf Rezensenten nicht erlauben Sie mir MAK77 Antwort und akzeptieren zu bearbeiten, das ist der einzige Grund, warum ich eine neue Antwort schreibe.)

require(dplyr) 
require(ggplot2) 

ex_data <- data.frame(
    a = sort(rep(letters[1:4], 5)), 
    b = rep(letters[6:7], 10), 
    c = rnorm(20, 1000, 500), 
    d = rep(c('h', 'h', 'i', 'i'), 5) 
) 

ex_data_2 <- ex_data %>% 
     group_by(a, b, d) %>% 
     mutate(csum = sum(c)) %>% 
     summarise_all(first) 

p <- ggplot(ex_data_2, 
      aes(x = b, y = a, size = log(csum), color = d, shape = d)) + 
    geom_point(alpha = 0.33) + 
    scale_radius(guide = guide_legend(title = 'c (log)')) + 
    scale_color_manual(values = c('cyan', 'magenta'), 
        guide = guide_legend(title = 'd'), 
        labels = c('h', 'i')) + 
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw() 
p 
1

Ich glaube, Sie müssen die Daten irgendwie umformen. Hier mein Beispiel ist (mit data.table und dplyr)

ex_data_2 <- data.table(ex_data) %>% 
    .[, list(c = sum(c), 
      d = which.max(table(d))), by = list(a, b)] %>% 
    .[, d := c('c', 'd')[d]] 
p <- ggplot(ex_data_2, 
      aes(x = b, y = a, size = log(c), color = d, shape = d)) + 
    geom_point(stat = 'sum', alpha = 0.33) + 
    scale_radius(guide = guide_legend(title = 'c (log)')) + 
    scale_color_manual(values = c('cyan', 'magenta'), 
         guide = guide_legend(title = 'd'), 
         labels = c('h', 'i')) + 
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw() 
p 
+0

'Fehler in sort.list (y): 'x' muss für 'sort.list' atomar sein Haben Sie 'sort' in einer Liste aufgerufen?' – Axeman

+0

danke für die Antwort! Ich lasse den Code laufen und es fällt an jedem Punkt eine Stufe von "d" ab, also habe ich entweder Cyan oder Magenta (ich vermute wegen 'which_max (table (d))'. Andere Sache ist, dass auf diese Weise das 'stat' funktioniert nicht sinnvoll, genug, um "Größe" an die Hauptästhetik zu übergeben, so dass diese Bequemlichkeit von ggplot nicht ausgenutzt werden kann. – deeenes

Verwandte Themen