Подтвердить что ты не робот

Ggplot2 - установить нижнюю границу больше нижней точки

По какой-то причине функция I, соответствующая ggplot2, выходит за ось y, хотя минимальное значение, которое может быть получено, равно нулю. Поэтому, пытаясь ограничить нижнюю границу нулю, я заметил, что, по-видимому, невозможно установить только нижнюю границу, чтобы точки данных были опущены (или, по-видимому, предсказанные точки). Это правда?

Например, можно использовать expand_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 и т.д., чтобы установить как верхнюю, так и нижнюю границу, но в этом случае я передаю список ggplot с помощью lapply, а верхняя граница изменения, основанные на том, какой объект в списке отображается. Поэтому я возвращаюсь к построению каждого объекта по отдельности, что очень утомительно. Любые идеи?

EDIT: Хэдли подтверждает, что это невозможно, поэтому обходной путь от @Arun должен будет сделать!

4b9b3361

Ответ 1

Это зависит от того, как вы хотите построить график, но если вы можете создать вектор верхнего предела для каждого графика, вы можете сделать что-то вроде этого...

# 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 ) )
        }
    }

enter image description here