По умолчанию на гранжевом ggplot (facet_grid) метки граней y-оси расположены справа, а по оси Y - метки и метки расположены слева.
Можно ли их переключать?
По умолчанию на гранжевом ggplot (facet_grid) метки граней y-оси расположены справа, а по оси Y - метки и метки расположены слева.
Можно ли их переключать?
Koshke написал это некоторое время назад, наполовину как шутка в списке рассылки ggplot2: http://groups.google.com/group/ggplot2/browse_thread/thread/5c4658aceea9daf1
d <- data.frame(expand.grid(a=1:2,b=1:2,c=1:2),x=rnorm(8), y=rnorm(8))
p <- ggplot(d, aes(x, y)) + facet_grid(a~b) + geom_point() +
coord_trans(x="reverse", y="reverse") +
opts(strip.text.x=theme_text(angle=180),
strip.text.y=theme_text(angle=90),
axis.text.x=theme_text(angle=180),
axis.text.y=theme_text(angle=180),
axis.title.x=theme_text(angle=180),
axis.title.y=theme_text(angle=180))
print(p, vp=viewport(angle=180))
Вам, очевидно, придется отразить это или "перевернуть по вертикали" для желаемого эффекта, но я не уверен, как или если вы можете сделать это с помощью современного программного обеспечения для изображений.
Там также ... + coord_flip()
, который ставит ось y внизу, а ось x слева.
Я написал это для своих нужд. Если вы используете его с switch = "y", вы на полпути.
Вам все равно нужно изменить его, чтобы переключить ось, что может занять больше работы, потому что ось и разрывы образуют один столбец в gtable, поэтому вам придется разложить его дальше.
switch_facet_strip <- function(p, switch = c("x", "y")) {
require(gtable)
rbind_gtable <- gtable:::rbind_gtable
cbind_gtable <- gtable:::cbind_gtable
if ("y" %in% switch)
p <- p + theme(strip.text.y = element_text(vjust = 0.5, angle = 90))
g <- ggplotGrob(p)
gdim <- as.numeric(g$layout[g$layout$name == "background", c("b", "r")])
tpos <- g$layout[g$layout$name == "strip-top", "b"][1]
rpos <- g$layout[g$layout$name == "strip-right", "r"][1]
new_tpos <- g$layout[g$layout$name == "axis-b", "b"][1] + 1
new_rpos <- g$layout[g$layout$name == "axis-l", "r"][1] - 1
if ("x" %in% switch) {
g <- rbind_gtable(
rbind_gtable(
gtable_add_rows(
rbind_gtable(g[1:tpos-1, ] , g[(tpos+1):(new_tpos-1), ], "first"),
unit(5, units = "mm")),
g[tpos, ], "first"),
g[new_tpos:gdim[1], ], "first")
}
if ("y" %in% switch) {
g <- cbind_gtable(
cbind_gtable(
gtable_add_cols(
cbind_gtable(g[, 1:new_rpos], g[, rpos], "first"),
unit(5, units = "mm")),
g[, (new_rpos+2):rpos-1], "first"),
g[, (rpos+1):gdim[2]], "first")
}
grid.newpage()
grid.draw(g)
}
Примечание: Этот хак позволяет мне переключаться между полосами рядом с их соответствующей меткой оси. Это имеет смысл, если вы используете тему, в которой у полосы нет фона. Я думаю, что это правильный способ отображения меток граней, поскольку он позволяет читать сюжет, как многострочный стол. Кроме того, метки фасеток расположены рядом с осевыми разрывами, что делает его более очевидным, что представляют собой оси. Кто-нибудь еще думает, что это имеет смысл? Мне жаль, что это не вариант ggplot.
Поскольку ggplot2 основан на сетке, используя пакет gridExtra, вы можете "swich" для фасетных полос в ggplot. Единственное мучительное в этом подходе - определение координат вручную. для текста.
# Some data
d <- data.frame(expand.grid(a=1:2,b=1:2,c=1:2),x=rnorm(8), y=rnorm(8))
# ggplot
p <- ggplot(d, aes(x, y)) +
geom_point() +
facet_grid(a~b) +
xlab("") +
ylab("") +
theme(strip.background = element_blank(),
strip.text = element_blank())
# Add x and y labels
p <- arrangeGrob(p, sub = textGrob(label = c("1", "2"), x = c(0.29, 0.73),
hjust = -0.1, vjust = -0.8, gp = gpar(fontsize = 10)), left = textGrob(label =
c("1", "2"), y = c(0.27, 0.70), hjust = 0, vjust = 1.8,
gp = gpar(fontsize = 10, lineheight = 0.5), rot = 90))
# View
p