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

Ggplot2 bar plot, пробел между дном геометрии и осью x не держит пространство выше

Когда я рисую гистограмму в ggplot2, я хотел бы уменьшить пространство между нижней частью баров и осью x до 0, но сохраним пространство над столбцами и поле графика. У меня есть взлом, чтобы сделать это ниже. Это грязно, и я хочу снова быть чистым. Есть ли способ достичь такого поведения без грязного маленького взлома?

По умолчанию (желаемое пространство выше, но не нужно места ниже баров):

ggplot(mtcars, aes(x=as.factor(carb))) + 
    geom_bar()

enter image description here

Используйте расширение (нежелательное 0 пробел выше, но получилось 0 пробел ниже баров):

ggplot(mtcars, aes(x=as.factor(carb))) + 
    geom_bar() + 
    scale_y_continuous(expand = c(0,0)) 

enter image description here

Dirty Hack (мне нравится, но его.. ну, грязный):

ggplot(mtcars, aes(x=as.factor(carb))) + 
    geom_bar() + 
    scale_y_continuous(expand = c(0,0)) +
    geom_text(aes(x=1, y=10.3, label="Stretch it"), vjust=-1)

enter image description here

4b9b3361

Ответ 1

Мне может не хватать то, что вы действительно хотите, но без использования geom_text hack вы все равно можете установить пределы

ggplot(mtcars, aes(x = as.factor(carb))) + 
    geom_bar() + 
    scale_y_continuous(expand = c(0, 0), limits = c(0, 10.3)) 

# marginally cleaner

Ответ 2

Вы можете развернуть лимиты вручную, например. с помощью expand_limits(y=10.1) или используйте этот трюк, чтобы добавить невидимый уровень с расширенными данными,

ggplot(mtcars, aes(x=as.factor(carb))) + 
    geom_bar() + 
    scale_y_continuous(expand = c(0,0)) +
    geom_blank(aes(y=1.1*..count..), stat="bin")

Ответ 3

Потому что вам кажется, что с жесткой кодировкой вам удобнее...

ggplot(mtcars, aes(x = as.factor(carb))) + 
  geom_bar() +
  coord_cartesian(ylim = c(0, 10.3))

Ответ 4

Начиная с ggplot2 3.0.0, существует expand_scale() которую можно использовать с аргументом expand чтобы сделать именно это. Вы определяете верхнее и нижнее расширение отдельно.

ggplot(mtcars, aes(x=factor(carb))) + 
     geom_bar() +
     scale_y_continuous(expand = expand_scale(mult = c(0, .1)))

Ответ 5

Это автоматический способ создания промежутка вверху, но при этом удалить нижний интервал. Я использую 3% заполнения, так как вы жестко запрограммированы.

plot1 <- ggplot(mtcars, aes(x=as.factor(carb))) +
    geom_bar()

plotInfo <- print(plot1)
yMax <- max(plotInfo$data[[1]]$ymax)
yLimitMax <- 1.03 * yMax

plot2 <- plot1 +
    scale_y_continuous(expand = c(0,0),
                       limits = c(0,yLimitMax))

Если вы хотите удалить три линии между plot2, просто напишите это в plot2:

limits = c(0, 1.03 * max(print(plot1)$data[[1]]$ymax))