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

Использование ord_flip() с facet_wrap (scale = "free_y" ) в ggplot2, кажется, дает неожиданные отметки оси фасет и метки меток

Я пытаюсь создать граненый график с перевернутыми координатами, где одна и только одна из осей может меняться для каждой грани:

require(ggplot2)
p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "free_y") + coord_flip()

enter image description here

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

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

p <- qplot(displ, hwy, data = mpg)
p + facet_wrap(~ cyl, scales = "fixed") + coord_flip()

Итак, мой вопрос: есть ли способ удалить отметки по вертикальной оси для правильных граней и добавить метки и метки горизонтальной оси к верхним граням?

Как поясняет Павел, пример, который я дал, может быть рассмотрен путем замены x и y в qplot() и избежания ord_flip(), однако это не работает для всех геометров, например, если я хочу горизонтальную грань график со свободными горизонтальными осями, которые я мог бы запустить:

c <- ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()
c + facet_wrap(~cut, scales = "free_y") + coord_flip()

image

Эти грани имеют переменные горизонтальные оси, но повторяют метки метки вертикальной оси вместо повторяющихся галочек. Я не думаю, что трюк Пола будет работать здесь, потому что в отличие от разброса графики, штриховые графики не являются вращательно-симметричными.

Мне было бы очень интересно услышать какие-либо частичные или полные решения.

4b9b3361

Ответ 1

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

geom_bar_horz <- function (mapping = NULL, data = NULL, stat = "bin", position = "stack", ...) {
  GeomBar_horz$new(mapping = mapping, data = data, stat = stat, position = position, ...)
}

GeomBar_horz <- proto(ggplot2:::Geom, {
  objname <- "bar_horz"

  default_stat <- function(.) StatBin
  default_pos <- function(.) PositionStack
  default_aes <- function(.) aes(colour=NA, fill="grey20", size=0.5, linetype=1, weight = 1, alpha = NA)

  required_aes <- c("y")

  reparameterise <- function(., df, params) {
    df$width <- df$width %||%
      params$width %||% (resolution(df$x, FALSE) * 0.9)
    OUT <- transform(df,
              xmin = pmin(x, 0), xmax = pmax(x, 0),
              ymin = y - .45, ymax = y + .45, width = NULL
    )
    return(OUT)
  }

  draw_groups <- function(., data, scales, coordinates, ...) {
    GeomRect$draw_groups(data, scales, coordinates, ...)
  }
  guide_geom <- function(.) "polygon"
})

Это просто копирование кода geom_bar из gigplot2 github, а затем переключение ссылок x и y для создания горизонтального штрихового кода в стандартных декартовых координаторах.

Обратите внимание, что вы должны использовать position='identity' и, возможно, также stat='identity' для этого. Если вам нужно использовать позицию, отличную от идентификационной, тогда вам нужно будет отредактировать функцию collide для ее правильной работы.

Ответ 2

Использование coord_flip в сочетании с facet_wrap является проблемой. Сначала вы определяете определенную ось свободной (ось x), а затем вы меняете ось, делая ось y свободной. Прямо сейчас это не воспроизводится хорошо в ggplot2.

В первом примере я бы рекомендовал не использовать coord_flip, а просто поменять переменные вокруг вашего вызова на qplot и использовать free_x:

p <- qplot(hwy, displ, data = mpg)
p + facet_wrap(~ cyl, scales = "free_x")

enter image description here

Ответ 3

Я только пытался сделать горизонтальный штрих-код и столкнулся с этой проблемой, где хотел scales = "free_x". В конце концов, было проще создать обычный (вертикальный) барплот), повернуть текст так, чтобы, если вы наклоните голову влево, это выглядит как сюжет, который вы хотите. И затем, как только ваш график будет завершен, поверните вывод PDF/изображения (!)

ggplot(data, aes(x, y)) +
  geom_bar(stat = "identity") +
  facet_grid(var ~ group, scale = "free", space = "free_x", switch = "both") +
  theme(axis.text.y  = element_text(angle=90), axis.text.x = element_text(angle = 90),
                     strip.text.x = element_text(angle = 180))

Основные клавиши для этого - switch = "both", который перемещает метки фасет на другую ось и element_text(angle=90), который вращает метки и текст оси.