2011-08-30 186 views
5

這與我昨天的question部分相關。向GGPLOT2中的Barplot添加唯一趨勢線

因此,這裏是數據和在ggplot2中創建的圖。

df = data.frame(date=c(rep(2008:2013, by=1)), 
       value=c(303,407,538,696,881,1094)) 


ggplot(df, aes(date, value, width=0.64)) + 
     geom_bar(stat = "identity", fill="#336699", colour="black") + 
     ylim(c(0,1400)) + opts(title="U.S. Smartphone Users") + 
     opts(axis.text.y=theme_text(family="sans", face="bold")) + 
     opts(axis.text.x=theme_text(family="sans", face="bold")) + 
     opts(plot.title = theme_text(size=14, face="bold")) + 
     xlab("Year") + ylab("Users (in millions)") +   
     opts(axis.title.x=theme_text(family="sans")) + 
     opts(axis.title.y=theme_text(family="sans", angle=90)) + 
     geom_segment(aes(x=2007.6, xend=2013, y=550, yend=1350), arrow=arrow(length=unit(0.4,"cm"))) 

是否有可能產生squigly趨勢線在下面的圖表與GGPLOT2

我已經建立了R中的情節,然後在Adobe Photoshop造prettied起來,如果可能,我想知道已經在R中產生了那條曲線趨勢線。

如果ggplot2中無法完成這個任務,那麼是否有任何特定的R軟件包可用於此任務?

我不問關於再現圖表。這不是問題。只是產生趨勢線似乎是一個問題。

enter image description here

+0

在某種程度上,這條線的曲率是否由數值的數值決定?我懷疑ggplot可能會得到陰影,但最後應該是一個帶有箭頭的數學定義曲線。 –

+0

@布萊恩不,它不是數學確定的。陰影不是太重要,只是線條不是直線。 – ATMathew

+3

如果@Hadley在這裏,我敢打賭他會說他希望ggplot2不可能這樣做。 – joran

回答

8

按照所有評論:的波浪線在科學上是值得懷疑的,因爲它不是建立在數據的統計模型爲主。 (當數據顯示沒有這種情況時,它似乎顯示了智能手機用戶數量的平穩性。)所以最好的建議是「不要這樣做」。

既然你看起來真的很熱衷這個想法,但是,這是可能的。

你可以用geom_line添加你喜歡的任何一行。要複製信息圖表中的無用線,可以做一條直線和一條正弦曲線,以便讓它擺動。假設你的陰謀被評爲p

p + geom_line(
    aes(date, value), 
    data = data.frame(
    date = seq(2008, 2013, length.out = n), 
    value = seq(600, 1300, length.out = n) + 100 * sin(seq(0, 4 * pi, length.out = n)) 
), 
    arrow = arrow(length = unit(0.4, "cm")) 
) 

一個更好的方法是使用一個黃土平滑的曲線。

p + geom_smooth(method = "loess", se = FALSE) #maybe also span = 0.5, for extra wigglyness. 
+0

對於有效的答案+1 –

3

您的問題清楚的答案是:不要這樣做R. R沒有爲此優化。如果你使用一些矢量圖形程序,你會更快,更接近你想要的。使用Illustrator,Inkscape(免費)或任何你喜歡的圖形工具。也許你還想在R中創建圖形,並稍後在其中一個程序中對其進行修改。

我可以理解評論,也同意這張圖不會通過一些測試。不僅僅是學術考試,還有外觀和感覺沒有停留在九十年代的測試。對Edward Tufte的提及也是出於美學原因。然而,我認爲這是一個合理的問題,不值得投票只是導致圖形看起來很醜。有時候學術界也需要將他們的作品發佈在學術期刊以外,最終由大衆編輯編輯。所以事先知道 - 更好的是不要試圖用R來做這樣的事情可能是值得注意的。