2017-02-20 6 views
0

Ich versuche zwei Zeitreihen als Balkendiagramme übereinander zu zeichnen (nicht gestapelt). Ich verwende position="identity" zu erreichen, dass aber die Stäbe kommen in der falschen Reihenfolge aus:R ggplot2: Anzeige der Balken neu anordnen

library(reshape2) 
library(ggplot2) 

test<-abs(rnorm(12)*1000) 
test<-rbind(test, test+500) 
colnames(test)<-month.abb[seq(1:12)] 
rownames(test)<-c("first", "second") 
otherTest<-apply(test, 2, mean) 
test<-melt(test) 
#otherTest<-as.data.frame(otherTest) 


otherTest <- data.frame(
    Var2 = names(otherTest), 
    value = otherTest 
) 

otherTest$Var2 = factor(otherTest$Var2, levels = levels(test$Var2)) 

ggplot(test, aes(x = Var2, y = value, group = 1,order=-as.numeric(Var2))) + 
    geom_bar(aes(fill = Var1), stat="identity", position="identity") + 
    geom_line(data = otherTest) 

Erzeugt das unter dem Diagramm. Wie Sie sehen können, sind die Werte in 'Sekunde' höher als 'Erste', so dass die blauen Balken die rosa Balken verbergen. Wie kann ich "zuerst" auf "zweite" kommen? Ich habe versucht, die mit Var2 von test verbundenen Faktoren umsonst zu ordnen, ohne Erfolg.

enter image description here

+0

versuchen Vielleicht 'Position = dodge' –

+0

@KarthikArumugham ich nicht tun, das ist, was ich suche, wie ich will immer noch die Bars übereinander. Auch wenn ich es versuche, sieht das Diagramm gleich aus. – user3390169

+1

Hinzufügen von 'alpha' zu' geom_bar() '. Etwas wie 'alpha = 0.5' –

Antwort

1

Ich hatte den Code neu zu schreiben, zu vereinfachen.

library(dplyr) 
test1 <- data_frame(month = factor(month.abb, levels=month.abb), 
        value = abs(rnorm(12)*1000), name="first") 
glimpse(test1) 
#Observations: 12 
#Variables: 3 
#$ month <fctr> Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 
#$ value <dbl> 1477.63915, 690.10964, 218.79066, 338.01241, 1952.10102, 354.65286, 340.09479, 1070.... 
#$ name <chr> "first", "first", "first", "first", "first", "first", "first", "first", "first", "fi... 

test2 <- data_frame(month = factor(month.abb, levels=month.abb), 
        name="second") 
test2$value <- test1$value+500 
glimpse(test2) 
#Observations: 12 
#Variables: 3 
#$ month <fctr> Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 
#$ name <chr> "second", "second", "second", "second", "second", "second", "second", "second", "sec... 
#$ value <dbl> 1977.6391, 1190.1096, 718.7907, 838.0124, 2452.1010, 854.6529, 840.0948, 1570.0937, ... 

test <- data_frame(month = factor(month.abb, levels=month.abb)) 
test$value <- (test1$value+test2$value)/2 
glimpse(test) 
#Observations: 12 
#Variables: 2 
#$ month <fctr> Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 
#$ value <dbl> 1727.6391, 940.1096, 468.7907, 588.0124, 2202.1010, 604.6529, 590.0948, 1320.0937, 3... 

# Plot 
library(ggplot2) 
p <- ggplot(NULL, aes(month, value)) + 
    geom_bar(aes(fill = "second"), data = test2, stat="identity") + 
    geom_bar(aes(fill = "first"), data = test1, stat="identity") + 
    geom_line(data = test, aes(as.numeric(month), value)) 
p 

ggplot2

1

Das Problem ist, mit dem position Parameter. Verwenden Sie einfach position = "stack" im Plotbefehl

ggplot(test, aes(x = Var2, y = value, group = 1, order = -as.numeric(Var2))) + 
    geom_bar(aes(fill = Var1), stat = "identity", position = "stack") + 
    geom_line(data = otherTest) 

den Plot zu erstellen:

enter image description here

Änderungen in ggplot2 Version 2.0.0+

Damit kann der Code rationalisiert werden:

ggplot(test, aes(x = Var2, y = value, group = 1)) + 
    geom_col(aes(fill = Var1), position="stack") + 
    geom_line(data = otherTest)