2016-09-16 17 views
7

Mam linegraph ggplot2 z dwoma liniami o znacznym zachodzeniu na siebie. Próbuję użyć position_jitterdodge(), aby były bardziej widoczne, ale nie mogę uzyskać linii i punktów do obu jitterów w ten sam sposób. Próbuję jittera punktów i linii tylko poziomo (ponieważ nie chcę sugerować żadnej zmiany na osi Y). Oto MWE:R: Jak jitter zarówno geom_line, jak i geom_point w linegraphie ggplot2?

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

która produkuje brzydkie:

Line/point mismatch

ja oczywiście coś fundamentalnie złego tutaj: Co należy zrobić, aby geom_point jitter śledzić geom_line jitter?

Odpowiedz

11

Inną opcją tylko horyzontalną byłoby podanie position_dodge i przekazanie jej do argumentu position dla każdego geoma.

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

Fajnie, ten też działa i jest bardzo łatwy. – drgibbon

+1

Zdecydowanie oznaczyłbym rozwiązanie Johna jako najbardziej odpowiednią odpowiedź @drgibbon. – hrbrmstr

+0

Dzięki - choć jestem ciekawy, dlaczego? Obaj wydają się robić to samo. Jedną z cech ggplot, która mnie zadziwia, jest to, jak wiele sposobów na pozór osiąga to samo. Tak się złożyło, że wiedziałem, że ... – JohnSG

7

Jednym z rozwiązań jest ręcznie drgać punkty:

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

Pozioma rozwiązanie dla dyskretnej osi X nie jest tak czysty (to czysty under the covers gdy ggplot2 robi to, ponieważ uchwyty oś i punkt przemiany dla ciebie bardzo ładnie), ale jest to wykonalne:

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

Dzięki, że był szybki. Właśnie zaktualizowałem moje pytanie, ponieważ próbuję uzyskać poziomy jitter, czy to możliwe w ten sposób? – drgibbon

+1

@drgibbon dodajesz jitter do wartości x (wymiar), a nie do wartości y (value_j). Lub używając geom_jitter możesz ustawić 'height = 0', aby wykonać poziomy jitter tylko – C8H10N4O2

+0

Dodano rozwiązanie horyzontalne, ale jest trochę hokey, ponieważ twoja oś X nie jest już tak naprawdę dyskretna (jak stwierdza odpowiedź, ggplot2 robi to czysto pod kołdrą dla ciebie). – hrbrmstr