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 должен будет сделать!
Ответы
Ответ 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]()