Использование 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]()
Эти грани имеют переменные горизонтальные оси, но повторяют метки метки вертикальной оси вместо повторяющихся галочек. Я не думаю, что трюк Пола будет работать здесь, потому что в отличие от разброса графики, штриховые графики не являются вращательно-симметричными.
Мне было бы очень интересно услышать какие-либо частичные или полные решения.
Ответы
Ответ 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)
, который вращает метки и текст оси.