2011-11-21 173 views
3

我在ggplot2中創建了一個填充密度的繪圖,其中一些我想截斷。我對缺少圖片表示歉意 - 顯然我不允許發佈它們。的開始碼的一個簡單例子:R - 將填充區域填充到ggplot2中的繪圖頂部

dd = with(density(rnorm(100,0,1)),data.frame(x,y)) 

ylimit = .3 

ggplot(data = dd, mapping = aes(x = x, y = y), geom="line") + 
layer(data = dd, mapping = aes(x = x, y = y), geom = "area", 
     geom_params=list(fill="red",alpha=.3)) + 
     scale_x_continuous(limits = c(-3,3)) + 
     scale_y_continuous(limits = c(0,ylimit)) 

然而,這導致一個空白區域中填充密度的中間其中dd $ Y> ylimit。

如果我補償這種與

dd$y = pmin(dd$y, ylimit) 

的區域被陰影但情節顯示的面積大於ylimit略高,所以填充不延伸到該圖的頂部。

理想情況下,我想知道如何讓ggplot顯示一個精確到ylimit的陰謀,但任何其他的解決方案讓填充延伸到陰謀的頂部將是受歡迎的。

編輯:修復了代碼。

+0

此代碼不會爲我工作。你能檢查它並編輯嗎? –

+0

此鏈接可能對演示'ggplot2'中的「coord」和「scale」之間的差異也有用。 http://had.co.nz/ggplot2/coord_cartesian.html –

回答

3

我想這就是你的意思。請注意使用ifelse來獲取截斷行爲。

dd = with(density(rnorm(100,0,1)), data.frame(x, y)) 

ylimit = .3 

dev.new(width=4, height=4) 
ggplot(data = dd, mapping = aes(x = x, y = y), geom="line") + 
layer(data = dd, mapping = aes(x = x, y = ifelse(y>ylimit, ylimit, y)), geom = "area", 
     geom_params=list(fill="red",alpha=.3)) + 
     scale_x_continuous(limits = c(-3,3)) + 
     coord_cartesian(ylim=c(0, ylimit)) 

enter image description here

+0

謝謝! Coord正是我所需要的,但似乎無法找到。 – chris

+1

@chris這似乎非常複雜。難道你不能這樣做:'ggplot(dd,aes(x = x,y = y))+ geom_area(fill =「red」,alpha = 0.3)+ coord_cartesian(xlim = c(-3,3),ylim = c(0,0.3))'? – joran

+0

是的,絕對。有點新ggplot,所以我敢肯定我正在使用一些相當尷尬的解決方法。感謝您的簡單版本! – chris