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

Можно ли переключить сторону разломов и меток оси Y на граненый участок?

По умолчанию на гранжевом ggplot (facet_grid) метки граней y-оси расположены справа, а по оси Y - метки и метки расположены слева.

Можно ли их переключать?

4b9b3361

Ответ 1

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 слева.

Ответ 2

Я написал это для своих нужд. Если вы используете его с 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.

The right way to display facet grids

Ответ 3

Поскольку 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