R ggplot2-将下限设置为大于最低点

R ggplot2-将下限设置为大于最低点,r,graphics,ggplot2,R,Graphics,Ggplot2,出于某种原因,我使用的函数ggplot2超出了y轴,即使可以获得的最小值为零。因此,在试图将下限限制为零时,我注意到,似乎不能只设置下限,从而忽略数据点(或预测点,显然)。这是真的吗 例如,可以使用expand\u limits缩小,如下所示: require(ggplot2) p = ggplot(mtcars, aes(wt, mpg)) + geom_point() p + expand_limits(y=0) 但我们不能放大: p + expand_limits(y=15) 与设置

出于某种原因,我使用的函数
ggplot2
超出了y轴,即使可以获得的最小值为零。因此,在试图将下限限制为零时,我注意到,似乎不能只设置下限,从而忽略数据点(或预测点,显然)。这是真的吗

例如,可以使用
expand\u limits
缩小,如下所示:

require(ggplot2)
p = ggplot(mtcars, aes(wt, mpg)) + geom_point() 
p + expand_limits(y=0)
但我们不能放大:

p + expand_limits(y=15)
与设置美学相同:

p + aes(ymin=0)
p + aes(ymin=15)
我知道我可以使用
ylim
coord_cartesian
等设置上限和下限,但在这种情况下,我使用
lappy
将列表传递给
ggplot
,上限会根据列表中正在打印的对象进行更改。所以我回到了单独绘制每个对象,这是非常乏味的。有什么想法吗


编辑:Hadley确认这是不可能的,所以@Arun的解决方案将不得不这样做

这取决于您想要如何绘制图形,但是如果您可以为每个图形创建一个上限向量,您可以这样做

# Some vector of upper bounds for each plot which you can determine beforehand
ul <- c(20,25,30,35)
# Layout for printing plots (obviously you can handle this part however you like, this is just an example)
vplayout <- function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)

# Make some sensible number of rows/columns for plot page
x <- floor(sqrt(length(ul)))
y <- ceiling( length(ul) / x )

# Make list to hold plots
plots <- as.list( 1:length(ul) )
dim( plots ) <- c( x , y )


# Store plots with variable upper limit variable each time 
for( i in plots ){
        plots[[i]] <- ggplot(mtcars, aes(wt, mpg)) + geom_point()  + scale_y_continuous( limits = c( 15,ul[i]) , expand = c( 0 , 0 ) )
}


# Print the plots
grid.newpage()
pushViewport(viewport(layout = grid.layout(x, y)))
for( i in 1:x){
    for( j in 1:y){
        print( plots[[ i , j ]] , vp = vplayout( i , j ) )
        }
    }
#每个图的一些上界向量,您可以事先确定

ul我现在似乎找不到,但我确信ggplot2邮件列表中已经讨论过这一点。我模糊地记得,有人提出了允许您将
Inf
-Inf
传递给
xlim
ylim
的想法,但实际的实现比看起来要复杂得多。@jslefche,作为一种解决方法,您不能将其设置为
ylim(您的_val,max(mtcars$mpg))
?(循环时,每次都可以传递该数据的最大值..)?joran,你确定它是为
xlim
而不是为
geom\u rect
?@Arun我知道Inf可以用于geom\u rect,我真的觉得我记得邮件列表上突然出现了这个请求,一些人建议如果你能将Inf和-Inf传递给xlim和ylim就好了,然后哈德利或其他人解释说这很好,但很难实现。@joran这就是你想的:。由于这个问题已经提出一年多了,我想知道在此期间是否实施了一些措施。Arun的解决方案可能是我最好的想法是的,就是这样(连同Brian和Hadley之间最初的讨论,这是
expand_limits
的来源)。我唯一能想到的另一个选择是在将数据传递给ggplot之前对数据进行子集。@jslefche这是您希望做的吗?