2017-03-10 2 views
9

Ich versuche ein Linien- und Punktdiagramm mit Fehlerbalken zu erstellen. Es hat verschiedene Faktoren, jedoch haben einige Faktoren nur einen Wert. Ich habe herausgefunden, dass, wenn ich position_dodge verwende, einer der Einzelwertfaktoren einen viel breiteren Fehlerbalken im Vergleich zu den anderen Fehlerbalken in den Graphen hat. Irgendwie hat position_dodge Einfluss auf die Breite der Fehlerleiste. Ich habe niemanden gefunden, der das gleiche Problem hatte, also hoffe ich, dass mir jemand helfen kann.ggplot2 position_dodge beeinflusst die Breite des Fehlerbalkens

Die Dummy-Daten:

require(ggplot2) 

x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,3,3,5) 
y <- c(3,5,6,3,5,3,5,6,2,6,3,7,3,6,2,1,5,8,7) 
se <- x*0.2 
treatment <- c("A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","E", "F", "G") 
data <- data.frame(x, y, se ,treatment) 
data$treatment <- as.factor(data$treatment) 

Zuerst ein Grundstück ohne position_dodge - alles ist in Ordnung

# Without position dodge 
myplot <- ggplot(data, aes(x=x, y=y, group= treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat="identity", size = 1) + 
    geom_point(stat="identity", size = 3, shape = 21) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2) 

myplot 

plot without position_dodge

Jetzt ein Grundstück mit Position ausweichen:

# With position dodge 
myplot <- ggplot(data, aes(x=x, y=y, group= treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat="identity", size = 1, position=position_dodge(width=0.2)) + 
    geom_point(stat="identity", size = 3, shape = 21, position=position_dodge(width=0.2)) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2, position=position_dodge(width=0.2)) 

myplot 

Plot with position_dodge

Wie Sie sehen können, hat die Fehlerleiste auf der rechten Seite eine viel größere Breite im Vergleich zu den anderen Fehlerbalken. Dies liegt wahrscheinlich daran, dass für diesen Punkt keine überlappenden x-Variablen vorhanden sind und die Fehlerbalken eine normale Größe haben können. Ich würde immer noch gerne wissen, wie ich die Fehlerbalken auf die gleiche Breite bekommen kann.

+0

Vielleicht relevantes Thema: https://github.com/tidyverse/ggplot2/issues/1068 – zx8754

+0

Ja wohl, wenn man sich die zweite Kurve aussehen, werden die Punkte bei x = 3 auch eine kleinere Fehlerleiste. Dies liegt wahrscheinlich daran, dass die Breite der Fehlerleiste durch die Anzahl der Gruppen bestimmt wird. – Marinka

+0

Ja, der Speicherplatz wird von der Anzahl der Punkte geteilt, und die horizontale Linie wird kürzer. Lösung könnte sein, manuelles Ausweichen einzuführen, zum Beispiel "x = 1" ist für 4 Punkte, "x = c (1, 1.02, 1.04, 1.06)", dann entferne Auswahloption. – zx8754

Antwort

4

Wie @aosmith schlägt vor, die Lösung für dieses ist die Breite der Fehlerbalken auf die Anzahl der Punkte mit diesem x zu skalieren. Dies muss jedoch nicht manuell erfolgen. Im Folgenden verwende ich dplyr, um eine neue Spalte im data.frame basierend auf der Anzahl der Punkte bei diesem x zu erstellen. Ich habe auch die group und fill Zuordnungen entfernt, da keiner hier benötigt wird (vorausgesetzt, die Form wird in die Version eines gefüllten Kreises geändert, der durch colour statt fill gefärbt wird). Um Wiederholungen zu vermeiden, habe ich die position einmal definiert und dann eine Variable für jede geom verwendet.

library(dplyr) 
data <- data %>% 
    group_by(x) %>% 
    mutate(
    width = 0.1 * n() 
) 

pos <- position_dodge(width = 0.2) 
myplot <- 
    ggplot(data, 
     aes(
      x = x, 
      y = y, 
      colour = treatment, 
      width = width 
     )) + 
    geom_line(size = 1, position = pos) + 
    geom_point(size = 3, shape = 16, position = pos) + 
    geom_errorbar(aes(ymin = y - se, ymax = y + se), position = pos) 

myplot 

Final image

+0

Danke für die Antwort, das löst das Problem. – Marinka

1

Ein etwas umständliches Workaround, das ich in der Vergangenheit verwendet habe, ist die manuelle Einstellung der Breite jedes Fehlerbalkens unter Verwendung von width innerhalb von aes. Die Anzahl der Werte in jeder Gruppe gibt an, wie stark die einzelnen Fehlerbalken skaliert werden sollen.

Zum Beispiel, wenn ich eine Gruppe mit einem einzelnen Wert und eine Gruppe mit 3 Werten habe, muss die Gruppe von 3 width 3 mal größer sein als die Gruppe von 1 width.

Ihr Fall ist viel komplizierter, da Sie eine Gruppe von 1, eine Gruppe von 6 und 3 Gruppen von 4 haben. Sie könnten damit beginnen, herauszufinden, was eine gute Breite für die einzelne Gruppe ist. Ich wählte .1. Also muss die Gruppe von 6 .6 breit sein und die Gruppe von 4 muss .4 breit sein.

Dann ist der Trick herauszufinden, die Reihenfolge der Linien gezeichnet werden, um die Breiten zu erhalten. Dies ist einfacher für einfachere Situationen.

Plot Code:

ggplot(data, aes(x = x, y = y, group = treatment, fill = treatment, colour = treatment)) + 
    geom_line(stat = "identity", size = 1, position = position_dodge(width = 0.2)) + 
    geom_point(stat = "identity", size = 3, shape = 21, position = position_dodge(width = 0.2)) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se, 
        width = c(rep(.4, 8), rep(.6, 4), rep(.4, 4), .6, .6, .1)), 
       position = position_dodge(width = 0.2)) 

enter image description here

+0

Danke für die Antwort, ich habe Nick Kennedys Antwort akzeptiert, da er mit einer automatischen Lösung kam. – Marinka

Verwandte Themen