2016-02-23 61 views
2

我使用stat_function來繪製一些函數。我想在y軸上添加一個限制,但曲線會在實際限制之前停止。我懷疑ggplot會計算曲線上的一些點並插入其餘點,但如果下一個點高於極限,則它將被忽略。是否有可能強制ggplot實際繪製曲線達到極限? 這種曲線的問題是,它看起來像曲線故意在那裏結束。繼續運行到軸的極限

下面是一個例子:

library(ggplot2) 

radius <- function(h, s){ 
    return((4 * h^2 + s^2)/8 * h) 
} 

p <-ggplot(data.frame(x = c(0.0, 20)), aes(x)) 

plot(
p + stat_function(fun=radius, aes(color="10"), args=list(s=10)) 
    + stat_function(fun=radius, aes(color="20"), args=list(s=20)) 
    + stat_function(fun=radius, aes(color="30"), args=list(s=30)) 
    + stat_function(fun=radius, aes(color="40"), args=list(s=40)) 
    + scale_y_continuous(limits = c(0,1000)) 
) 

the cut of curve

回答

2

遇到的問題是,根本stat_y_continuous()忽略位於規定的範圍以外的值。由於最後一個位於y = 1000以下的點對於每條曲線的y值不同,因此它們不會以相同的y值結束。

有幾種方法可以解決這個問題,這取決於你真正想要的東西。一種可能性是使用coord_cartesian()而不是scale_y_continuous()。這使所有的值,並簡單地切斷座標軸:

p + stat_function(fun=radius, aes(color="10"), args=list(s=10)) + 
    stat_function(fun=radius, aes(color="20"), args=list(s=20)) + 
    stat_function(fun=radius, aes(color="30"), args=list(s=30)) + 
    stat_function(fun=radius, aes(color="40"), args=list(s=40)) + 
    coord_cartesian(ylim = c(0, 1000)) 

enter image description here

正如你可以看到,這個直到他們到達繪圖區域的上限即將曲線。

如果您確實希望曲線在y = 1000處結束,您可以在stat_function中繪製更多點。這還意味着,曲線不正好y = 1000結束,但他們最終將如此接近極限的區別是不再可見:

p + stat_function(fun=radius, aes(color="10"), args=list(s=10), n = 2000) + 
    stat_function(fun=radius, aes(color="20"), args=list(s=20), n = 2000) + 
    stat_function(fun=radius, aes(color="30"), args=list(s=30), n = 2000) + 
    stat_function(fun=radius, aes(color="40"), args=list(s=40), n = 2000) + 
    scale_y_continuous(limits = c(0, 1000)) 

enter image description here

+0

這正是我需要的!謝謝! – reox