2016-02-23 63 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