2017-12-07 4 views
2

Ich habe eine R Funktion, die einige übereinander gestapelte Kurven aufzeichnet (siehe Bild unter dem Code). nicht so flach aussehenMinimierung des Abstandes zwischen den übereinander gestapelten Kurven im R-Diagramm

Ich frage mich aber, wie ich konnte den Abstand zwischen den Kurven (ee blaue Pfeile s) einzustellen, so dass die Kurven?

Ist es auch möglich, polygon statt lines zu verwenden, um diese Kurven zu plotten?

stacked = function(a, b, lo, hi, d, Bi = 55, n = 1e2){ 

h = list() 

for(i in 1:length(d)){ 
     p = function(x) get(d[i])(x, a, b) 
    prior = function(x) p(x)/integrate(p, lo, hi)[[1]] 
likelihood = function(x) dbinom(Bi, n, x) 
posterior = function(x) prior(x)*likelihood(x) 
     h[i] = list(curve(posterior, ty = "n", ann = FALSE, yaxt = "n", xaxt = "n", add = i!= 1, bty = "n", n = 1e3)) 
} 
plot(matrix(c(rep(c(.4, .8), each = length(d))), length(d), 2), rep(1:length(d), 2), ty = "n", xlim = 0:1, ann = FALSE, xaxt = "n", ylim = c(1, length(d)+.4)) 

for(i in 1:length(d)){ 
lines(h[[i]]$x, h[[i]]$y+i, ty = "l", xpd = NA, col = i) 
    } 
} 
# Example of use: 
stacked(lo = 0, hi = 1, a = 2, b = 3, d = c("dgamma", "dnorm", "dcauchy", "dbeta", "dlogis", "dweibull")) 

enter image description here

Antwort

3

Sie können die y-Werte nur skalieren, bevor die Linien zeichnen. Ich habe einen scale Parameter zu Ihrer Funktion hinzugefügt. Versuchen scale = 2 oder 3

stacked = function(a, b, lo, hi, d, Bi = 55, n = 1e2, scale=1){ 

    h = list() 
    for(i in 1:length(d)) { 
      p = function(x) get(d[i])(x, a, b) 
     prior = function(x) p(x)/integrate(p, lo, hi)[[1]] 
    likelihood = function(x) dbinom(Bi, n, x) 
    posterior = function(x) prior(x)*likelihood(x) 
      h[i] = list(curve(posterior, ty = "n", ann = FALSE, yaxt = "n", xaxt = "n", add = i!= 1, bty = "n", n = 1e3)) 
    } 
    plot(matrix(c(rep(c(.4, .8), each = length(d))), length(d), 2), rep(1:length(d), 2), ty = "n", xlim = 0:1, ann = FALSE, xaxt = "n", ylim = c(1, length(d)+.4)) 

    for(i in 1:length(d)){ 
     lines(h[[i]]$x, scale*h[[i]]$y+i, ty = "l", xpd = NA, col = i) 
     } 
} 

stacked(lo = 0, hi = 1, a = 2, b = 3, scale=2, 
    d = c("dgamma", "dnorm", "dcauchy", "dbeta", "dlogis", "dweibull")) 

Wenn Sie im Bereich unter den Kurven zu füllen, können Sie polygon verwenden. Ändern Sie die Zeilen:

for(i in 1:length(d)){ 
     lines(h[[i]]$x, scale*h[[i]]$y+i, ty = "l", xpd = NA, col = i) 
     } 

TO

for(i in 1:length(d)){ 
    polygon(x=h[[i]]$x, y=scale*h[[i]]$y+i, col = i) 
    } 
+0

Ich entschuldige mich, ich habe jetzt vollständig bearbeitet und aktualisiert meine Frage in [hier] (https://stackoverflow.com/questions/47734006/plotting-line -Segmente-über-einem-Plot-von-einem-vorherigen-Lauf einer-r-Funktion). --Danke nochmal. – rnorouzian

Verwandte Themen