2017-10-30 4 views
1

Für Lehrzwecke suche ich mehrere Verteilungen auf einem Graphen zu erstellen und zu plotten. Der Code, den ich verwendet haben, dies zu tun ist:Plotten mehrerer Dichteverteilungen auf einem Plot

library(ggplot2) 
library(ggfortify) 

# Create an initial graph with 1 distribution 
p3 <- ggdistribution(dnorm, 
       seq(-5, 10,length=1000), 
       colour='blue', 
       mean=0.15, 
       sd=0.24, 
       fill='blue') 

# Update p3 with second distribution 
p3 <- ggdistribution(dnorm, seq(-5, 10,length=1000), 
     mean = 1.11, 
     sd = 0.55, 
     colour='green', 
     fill='green',p=p3) 

# View p3 
p3 

Zunächst scheint groß, weil es ein Diagramm mit den beiden Verteilungen erzeugt:

Two distributions on one graph

Die Probleme beginnen, wenn ich versuche zu ändern das Aussehen des Graphen.

(1) Wenn ich zuerst versuche, die Y-Achsenskalierung so zu ändern, dass sie von 0 bis 1 statt der Prozentwerte reicht, kann ich das tun, aber den Distributionen passiert etwas . Hier ist der Code ich verwende:

p3 <- p3 + ylim(0,1) + xlim (-2, 6) + labs(title="Plotting Multiple Distributions", x="Mean difference", y="Density") 

Und das gibt die dieses Diagramm:

enter image description here

Ratschläge, wie ich die y-Achse verändern kann, ohne die Verteilung zu ruinieren würde sehr geschätzt werden !

(2) Zweitens, wenn ich versuche, 2 Zeilen Code entlang der Achsen hinzufügen mit:

p3 <- p3 + geom_segment(aes(x=0, y=0, xend=0, yend=0.98), 
        size=1,  
        arrow = arrow(length = unit(0.4,"cm"))) 
p3 <- p3 + geom_segment(aes(x=-2, y=0, xend=6, yend=0), 
        size=1) 

... R gibt die folgende Fehlermeldung:

Error in eval(expr, envir, enclos) : object 'ymin' not found 

All Ratschläge, wie ich diese Linien hinzufügen könnte, um die Ästhetik des Graphen zu verbessern, wären sehr willkommen.

Vielen Dank im Voraus für Ihre Zeit.

+0

Um die y-Achse zu ändern, sollten Sie 'coord_cartesian (ylim = c (0, 1))' anstelle von 'ylim()' verwenden: Dies ist ein gewöhnliches ggplot-Verwechseln, 'ylim() 'fällt tatsächlich Datenpunkte außerhalb dieses Bereichs, während 'coord_cartesian' die Ansicht wie gewünscht ändert. – Marius

+0

Hallo Marius, danke für deine schnelle Antwort. Ich habe gerade versucht, die 'coord_cartesian (ylim = c (0, 1))' zu verwenden, und es wird in der Zukunft nützlich sein! Aber leider hat es nicht ganz so funktioniert, wie ich es jetzt brauche, weil es die y-Achse nicht von% (mit Obergrenze um 175%) neu skaliert hat, sondern stattdessen von 0 bis 1, was 'ylim() 'tut , obwohl es die Verteilungen zerstört. – confusedpsych

Antwort

0

Klingt so, als ob Sie die y-Achsenbeschriftungen in den Bereich (0, 1) ändern möchten, ohne die zugrunde liegende Verteilung zu ändern. Hier ist ein Ansatz:

# after obtaining p3 from the two ggdistribution() functions 

# get the upper limit for p3's current y-axis range, rounded up 
y.orig <- layer_scales(p3)$y$range$range[2] # = 1.662259 in my case, yours may 
              # differ based on the distribution 
y.orig <- ceiling(y.orig * 10)/10   # = 1.7 

p3 + 
    xlim(-2, 6) + 
    scale_y_continuous(breaks = seq(0, y.orig, length.out = 5), 
        labels = scales::percent(seq(0, 1, length.out = 5))) + 
    annotate("segment", x = 0, y = 0, xend = 0, yend = y.orig, 
      size = 1, arrow = arrow(length = unit(0.4, "cm"))) + 
    annotate("segment", x = -2, y = 0, xend = 6, yend = 0, 
      size = 1) 

plot1

Oder wenn Sie Etiketten nahe der gefälschten Achse von Liniensegmenten geschaffen zu halten, umfassen expand = c(0, 0) für x/y:

p3 + 
    scale_x_continuous(limits = c(-2, 6), expand = c(0, 0)) + 
    scale_y_continuous(breaks = seq(0, y.orig, length.out = 5), 
        labels = scales::percent(seq(0, 1, length.out = 5)), 
        expand = c(0, 0)) + 
    annotate("segment", x = 0, y = 0, xend = 0, yend = y.orig, 
      size = 1, arrow = arrow(length = unit(0.4, "cm"))) + 
    annotate("segment", x = -2, y = 0, xend = 6, yend = 0, 
      size = 1) 

plot2

+0

Vielen Dank, beide Grafiken werden gut! Ich bin froh, dass die y-Achse jetzt in Prozenten bleibt, da alles andere gut aussieht. Danke noch einmal! – confusedpsych

Verwandte Themen