2012-05-15 18 views
6

Ich möchte das folgende gestapelte Balkenplot zusammen mit Linienkurve machen.Stacked Barplot zusammen mit Line in R

enter image description here

Aber warum dies folgende Code funktioniert nicht? Was ist der richtige Weg?

x<-c(0,1,2,3,4,5,6,7,8,9,10,11,12); 

    # To plot line 
    emp_dens <- c(0.107,0.184,0.205,0.185,0.138,0.091,0.049,0.023,0.01,0.0028,0.0012,0.00023,0.00013); 
    dat_dens <- as.matrix(cbind(x,emp_dens)); 


    # To plot stack bar 
    dens_all_k <- c(1.15e-01, 1.89e-01, 2.05e-01, 1.82e-01,1.36e-01,8.68e-02,4.71e-02,2.21e-02,9.17e-03,3.37e-03,1.11e-03,3.37e-04,9.31e-05) 

    # Each k0..5 compose the stack 
    # For example 
    # dens_k0[1] + .... dens_k5[1] ~= dens_all_k[1] 

    dens_k0 <-c(2.52e-02,8.38e-02,1.38e-01, 1.53e-01,1.27e-01,8.44e-02, 4.66e-02, 2.21e-02, 9.16e-03, 3.37e-03,1.11e-03, 3.37e-04, 9.31e-05) 
    dens_k1 <- c(6.75e-02, 8.91e-02, 5.86e-02, 2.51e-02, 8.59e-03,2.25e-03, 4.90e-04,9.35e-05, 1.55e-05,2.21e-06,2.99e-07, 3.55e-08,3.92e-09) 
    dens_k2 <- c(1.70e-02,1.64e-02,7.95e-03, 2.56e-03,6.20e-04,1.20e-04, 1.93e-05, 2.67e-06, 3.23e-07,3.47e-08,3.36e-09, 2.95e-10,2.38e-11) 
    dens_k3 <- c(0.005124596,0,0,0,0,0,0, 0, 0, 0, 0,0,0) 
    dens_k4 <- c(0.0004270497, 0, 0,0,0, 0, 0, 0, 0,0,0, 0, 0) 
    dens_k5 <- c(2.760725e-05, 0, 0, 0,0,0, 0, 0, 0, 0,0, 0,0) 


    barplot(cbind(0:max(x),dens_all_k),xlim=c(0,max(x)),ylim=c(0,max(emp_dens)),,space=0.1,lwd=5,xlab="Value of X",ylab="Densities",font.main=1); 
    lines(dat_dens,lty=1,col="red"); 
+0

Sie es in gglot2 versuchen könnte: http://had.co.nz/ggplot2/geom_histogram.html –

+6

+1 anschaulichen Charakter. –

Antwort

2

dens_all_k enthalten nur die Gesamtübersicht. Wenn Sie nach dem Barplot auf dem Bild suchen, müssen Sie alle k Informationen angeben. Probieren Sie den folgenden Code aus.

dens_kall<-rbind(dens_k0,dens_k1,dens_k2,dens_k3,dens_k4,dens_k5) 
ltext<-c("K0","K1","K2","K3","K4","K5") 
colnames(dens_kall)<-0:12 
barplot(height=dens_kall,xlim=c(0,max(x)),ylim=c(0,max(emp_dens)),,space=0.1,lwd=5,xlab="Value of X",ylab="Densities",font.main=1 
     ,legend.text =ltext, 
     args.legend = list(x = "topright") 
     ); 
lines(dat_dens,lty=1,col="red"); 

Der Ausgang ist enter image description here

+1

Bitte lassen Sie mich wissen, wenn jemand von mir möchte, dass ich meine Antwort lösche. – vinux

+0

danke. Deine Lösung ist großartig. BTW wie können wir eine Legende für die 'Linie' hinzufügen. Hilfe wirklich benötigt. – neversaint

+1

Zwei-Wege können wir dies tun. Eine davon ist das Hinzufügen einer separaten Legende und eine andere Möglichkeit ist das Entfernen des Legendenanteils aus dem Barplot und das Erstellen einer neuen Legende durch Hinzufügen der Linie. – vinux

1

Im Barplot übergeben Sie keine Matrix mit Ihren x- und y-Werten, sondern nur Ihre Höhen. Es macht keinen Sinn, dass Sie alle Dens_k0 etc. Elemente erstellen und niemals verwenden. Versuchen Sie ...

barplot(rbind(dens_k0, dens_k1, dens_k2, dens_k3, dens_k4, dens_k5), xlim=c(0,max(x)), ylim=c(0,max(emp_dens)), space=0.1, lwd=5, xlab="Value of X", ylab="Densities", font.main=1) 
lines(emp_dens,lty=1,col="red") 

Überprüfen Sie sorgfältig, was ich dort für zukünftige Referenz übergeben. Wahrscheinlich müssen Sie das Legendenargument von barplot so einstellen, dass es remote lesbar ist. Auch wenn diese letzten Densititen sehr klein sind.

Eine einfache Möglichkeit, die Legende hinzuzufügen, besteht darin, ein paar kleine Änderungen an dem vorzunehmen, was Sie haben.

barplot(rbind(dens_k0, dens_k1, dens_k2, dens_k3, dens_k4, dens_k5, 0), 
     col = c(grey(exp((0:5)/5)/exp(1)), 'red'), xlim=c(0,max(x)), ylim=c(0,max(emp_dens)), space=0.1, lwd=5, xlab="Value of X", ylab="Densities", font.main=1, 
     legend.text = c('k0', 'k1', 'k2', 'k3', 'k4', 'k5', 'dens curve'))