2017-02-19 74 views
0

我有一組來自一組月度數據的條形圖,我想以一行的形式覆蓋另一組每月數據的數據。下面是一個簡單的例子(在我的數據的第二組數據是不是第一個簡單的操作):R ggplot2:條形圖上覆蓋的線條(來自單獨的數據框)

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) 

p<-ggplot(test, aes(x=Var2, y=value, fill=Var1, order=-as.numeric(Var2))) + geom_bar(stat="identity")+ 
    theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(), 
    panel.grid.minor = element_blank(), axis.line = element_line(colour = "black")) + 
    ggtitle("Test Graph") + 
    scale_fill_manual(values = c(rgb(1,1,1), rgb(.9,0,0))) + 
    guides(fill=FALSE) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

的偉大工程,以獲得條形圖: enter image description here

,但我已經試過多次迭代獲得線在那裏,不能算出它(像這樣):

p + geom_line(data=otherTest,size=1, color=rgb(0,.5,0) 

另外,如果有人知道我怎樣才能使酒吧在對方面前,讓所有你看到的是一個紅色的條身高500,我會很感激任何suggesti附件。我知道我可以將矩陣的兩行之間的差異保存爲一個堆棧條,但我認爲可能有一種簡單的方法將兩個條放在x軸上,白色放在紅色的前面。謝謝!

回答

1

你有幾個問題需要解決在這裏。

直接回答你的問題,如果你沒有在GEOM調用(如您的geom_line...)通過aes(...)提供mapping,則映射將來自ggplot()。您的ggplot()指定x=Var2, y=value, fill=Var1...。所有這些變量名稱必須存在於您的數據框otherTest中才能使用,並且現在它們不是。

因此,您需要確保這些變量名稱存在於otherTest中,或在geom_line中分別指定mapping。您可能需要了解這些分層選項的工作原理。例如,here's a post of mine進行了一些細節。

如果你去的第一個選項,其他的一些問題去思考:

  • Var2在這兩個數據幀相同水平的因素是什麼?它可能應該是。
  • 要使用geom_line,因爲您可能需要添加group = 1。見here

其他一些國家也一樣,但這裏是你可以做什麼一個簡單的例子:

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 <- 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)) + 
    geom_bar(aes(fill = Var1), stat="identity") + 
    geom_line(data = otherTest) 
+0

這工作,謝謝!爲什麼你需要這個因素Var2?我拿出來,它似乎仍然工作正常。此外,有關如何讓酒吧在另一個前面而不是堆疊的想法? – user3390169

+0

我使用因素來確定訂單。使用字符串將爲您創建訂單(我更喜歡避免)。在每個前面加上「吧」,你可以嘗試添加'position =「identity」' –