2012-06-19 20 views
7

我有一些ggplot代碼,在0.8.9工作正常,但不是在0.9.1。geom_vline與字符xintercept

我打算將數據繪製在theDF中,並且想繪製一條垂直線xintercept="2010 Q1."theGrid僅用於創建theDF

theGrid <- expand.grid(2009:2011, 1:4) 
theDF <- data.frame(YrQtr=sprintf("%s Q%s", theGrid$Var1, theGrid$Var2), 
        Minutes=c(1000, 2200, 1450, 1825, 1970, 1770, 1640, 1920, 1790, 1800, 1750, 1600)) 

使用的代碼是:

g <- ggplot(theDF, aes(x=YrQtr, y=Minutes)) + 
     geom_point() + 
     opts(axis.text.x=theme_text(angle=90)) 

g + geom_vline(data=data.frame(Vert="2010 Q2"), aes(xintercept=Vert)) 

再次,這工作得很好中的R與2.13.2 0.8.9 GGPLOT2,但與GGPLOT2 0.9.1不中的R 2.14+。

一種解決方法是:

g + geom_vline(data=data.frame(Vert=4), aes(xintercept=Vert)) 

但是,這不是我的問題一個很好的解決方案。

也許搞亂scale_x_discrete可能有幫助嗎?

+0

沒有'theVerts'(我認爲這是一個數據框?),這是不可重現的。 – joran

+0

@joran我偶然在'aes'中有'data ='。現在它已經被修復了,這個Vertices已經被data.frame(Vert =「2010 Q2」)所取代。 – Jared

+0

這看起來像一個錯誤。你可以在以下網址提交問題:https://github.com/hadley/ggplot2/issues – wch

回答

0

當您在一個繪圖中爲x軸使用一個字符向量或一個因子時,賦予每個唯一項目的默認值只是從1開始的整數。所以,如果您的級別是c(「A 「B」,「C」),那麼x軸位置是c(1,2,3)。沒有像角色位置這樣的東西,只是一個字符標籤。如果你想在A處有一條垂直線,那麼把它放在1.如果你想在A和B之間的一半,然後把它放在1.5。再次,這些是默認值。如果一個特定的情節做了別的事情,你可以通過在幾個地點放行並看到會發生什麼來輕鬆解決問題。

+0

是的,情況就是如此。但在舊版本的'ggplot2'中,如果你餵它「A」,它會將它翻譯爲1並正確放置該行。這種行爲是可取的,因爲用戶會知道原始尺度,而不一定是它翻譯的。我希望重新創建用於展示的'ggplot2'行爲。 – Jared

12

你可以試試這個:

g + geom_vline(aes(xintercept = which(levels(YrQtr) %in% '2010 Q1'))) 

這避免了需要建立選定因子水平的虛擬數據幀。 which()命令返回與vlines關聯的因子級別[s]的索引(或者索引,如果%運算符的%右側是向量)。

這樣做的一個注意事項是,如果某些類別沒有出現在您的數據中,並且您在比例中使用drop = TRUE,則線條將不會顯示在正確的位置。

+0

有趣的方法。我會檢查以確保它可以推廣到其他數據類型。 – Jared