是否可以在刻面图上切换y轴断点和标签的一侧?

时间:2011-07-08 14:12:00

标签: r ggplot2

默认情况下,在分面ggplot(facet_grid)上,y轴构面标签位于右侧,y轴断开,标签位于左侧。

可以切换它们吗?

3 个答案:

答案 0 :(得分:8)

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轴放在左边。

答案 1 :(得分: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)
}

注意:这个hack允许我切换各自轴标签旁边的两个条带。只有在使用条带没有背景的主题时才有意义。我认为这是显示构面标签的正确方法,因为它允许像多路表一样读取图形。此外,小平面标签紧邻轴断裂,这使得轴代表的更加明显。其他人认为这有道理吗?我希望它是ggplot中的一个选项。

The right way to display facet grids

答案 2 :(得分:0)

由于ggplot2基于网格图形,使用gridExtra包,您可以在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