2016-09-16 11 views
7

Ich habe eine ggplot2 Linegraph mit zwei Zeilen mit signifikanten Überlappung. Ich versuche position_jitterdodge() so zu verwenden, dass sie besser sichtbar sind, aber ich kann die Linien und Punkte nicht auf beide Arten von Jitter bekommen. Ich versuche nur die Punkte und die Linie horizontal zu schwanken (da ich keine Veränderung auf der Y-Achse vorschlagen möchte). Hier ist ein MWE:R: Wie geom_line und geom_point in ggplot2 linegraph gejittert werden?

## Create data frames 
dimension <- factor(c("A", "B", "C", "D")) 
df <- data.frame("dimension" = rep(dimension, 2), 
       "value" = c(20, 21, 34, 32, 
          20, 21, 36, 29), 
       "Time" = c(rep("First", 4), rep("Second", 4))) 
## Plot it 
ggplot(data = df, aes(x = dimension, y = value, 
         shape = Time, linetype = Time, group = Time)) + 
    geom_line(position = position_jitterdodge(dodge.width = 0.45)) + 
    geom_point(position = position_jitterdodge(dodge.width = 0.45)) + 
    xlab("Dimension") + ylab("Value") 

, die das hässliche produziert:

Line/point mismatch

ich natürlich etwas grundlegend falsch hier haben: Was muss ich tun, um das geom_point Jitter des Jitter geom_line zu machen folgen?

Antwort

11

Eine andere Option nur für die horizontale wäre position_dodge anzugeben und diese an das Argument position für jedes geom übergeben.

pd <- position_dodge(0.4) 

ggplot(data = df, aes(x = dimension, y = value, 
         shape = Time, linetype = Time, group = Time)) + 
    geom_line(position = pd) + 
    geom_point(position = pd) + 
    xlab("Dimension") + ylab("Value") 

enter image description here

+0

Schön, das funktioniert auch und ist sehr einfach. – drgibbon

+1

Ich würde auf jeden Fall Johns Lösung als die am besten geeignete Antwort @drgibbon markieren. – hrbrmstr

+0

Danke - obwohl ich neugierig bin, warum? Beide scheinen dasselbe zu erreichen. Eine der Eigenschaften von ggplot, die mich erstaunt, ist, wie viele Möglichkeiten es gibt, scheinbar das Gleiche zu erreichen. Das war einfach so, wie ich es wusste ... – JohnSG

7

Eine Lösung ist manuell um die Punkte Jitter:

df$value_j <- jitter(df$value) 

ggplot(df, aes(dimension, value_j, shape=Time, linetype=Time, group=Time)) + 
    geom_line() + 
    geom_point() + 
    labs(x="Dimension", y="Value") 

enter image description here

Die horizontale Lösung für Ihre diskrete X-Achse ist nicht so sauber (es ist sauber under the covers wenn ggplot2 tut es, da es die Griffe Achse und Punkt-Transformationen für Sie ganz gut), aber es ist machbar:

df$dim_j <- jitter(as.numeric(factor(df$dimension))) 

ggplot(df, aes(dim_j, value, shape=Time, linetype=Time, group=Time)) + 
    geom_line() + 
    geom_point() + 
    scale_x_continuous(labels=dimension) + 
    labs(x="Dimension", y="Value") 

enter image description here

+0

Danke, das war schnell. Ich habe gerade meine Frage dahingehend aktualisiert, dass ich versuche, nur horizontalen Jitter zu bekommen, ist das möglich? – drgibbon

+1

@drgibbon würden Sie den Jitter dem x-Wert (Dimension) nicht den y-Wert (value_j) hinzufügen. Oder mit geom_jitter können Sie 'height = 0' einstellen, um nur horizontalen Jitter zu machen. – C8H10N4O2

+0

Die horizontale Lösung hinzugefügt, aber es ist ein bisschen hokey, da Ihre X-Achse nicht mehr wirklich diskret ist (wie die Antwort sagt, ggplot2 macht das sauber unter die Decke für Sie)). – hrbrmstr

Verwandte Themen