ggplot2: geom_bar с пользовательскими ограничениями по оси y

Я хочу нарисовать гистограмму с ggplot2 вместе с пользовательскими ограничениями по оси y.

Type <- LETTERS[1:5]
Y    <- c(99, 99.5, 99.0, 98.8, 98.5)

df <- data.frame(Type, Y)

Следующий код отлично работает для гистограммы:

library(ggplot2)
ggplot(data = df, mapping = aes(x = Type, y = Y, fill = Type)) +
  geom_bar(stat = "identity") +
  theme_bw()

Однако я не могу установить пределы y. См. код ниже.

ggplot(data = df, mapping = aes(x = Type, y = Y, fill = Type)) +
  geom_bar(stat = "identity") +
  scale_y_continuous(limits = c(90, 100)) + 
  theme_bw()

ggplot(data = df, mapping = aes(x = Type, y = Y, fill = Type)) +
  geom_bar(stat = "identity") +
  ylim(90, 100) + 
  theme_bw()

Отредактировано

Я предполагаю, что такое поведение связано с stat = "identity".


person MYaseen208    schedule 23.12.2017    source источник
comment
Я не знаю, возможно ли это, поскольку geom_bar переходит от 0 к y (это похоже на вставку разрыва по оси Y). Почему бы не построить geom_point?   -  person pogibas    schedule 23.12.2017
comment
Спасибо @PoGibas за ваш комментарий. Да, geom_point может быть другой возможностью. Тем не менее, я хочу показать эти точки броска баров. Любая мысль.   -  person MYaseen208    schedule 23.12.2017


Ответы (2)


Решение с использованием geom_rect() вместо geom_bar():

# Generate data
Type <- LETTERS[1:5]
Y    <- c(99, 99.5, 99.0, 98.8, 98.5)
df   <- data.frame(Type, Y)

# Plot data
library(ggplot2)
ggplot() +
    geom_rect(data = df, 
              aes(xmin = as.numeric(Type) - 0.3, 
                  xmax = as.numeric(Type) + 0.3, 
                  ymin = 90, ymax = Y,
                  fill = Type)) +
    scale_x_continuous(label = df$Type, breaks = 1:nrow(df))

В geom_rect() укажите координаты x как as.numeric(X) -/+ value; ymin координаты в качестве желаемого нижнего предела и ymax в качестве фактических значений Y.

введите здесь описание изображения

person pogibas    schedule 23.12.2017
comment
Спасибо @PoGibas за полезный ответ. Буду очень признателен, если вы поможете мне удалить пустое пространство под прямоугольниками, чтобы y начиналось с 90. Спасибо. - person MYaseen208; 23.12.2017
comment
@ MYaseen208, вы имеете в виду пространство между прямоугольниками и галочками? - person pogibas; 23.12.2017
comment
да дополнительное пространство между прямоугольниками и x тиками. - person MYaseen208; 23.12.2017

Альтернатива, используя coord_cartesian:

ggplot(data = df, mapping = aes(x = Type, y = Y, fill = Type)) +
  geom_bar(stat = "identity") +
  coord_cartesian(ylim = c(90, 100)) + 
  theme_bw()

Дает тебе:

введите описание изображения здесь

person Luke C    schedule 23.12.2017
comment
Это решение более привлекательно. Спасибо @Luke C за хороший ответ. - person MYaseen208; 23.12.2017
comment
Это то, что я искал с coord_cartesian(ylim = range(df$Y)). - person MYaseen208; 23.12.2017
comment
@MYaseen208 - Хороший звонок, это довольно ловко. - person Luke C; 23.12.2017