使用ggplot2翻转坐标轴和标签

5

我希望将一个由1行5列组成的分面面板上的标签翻转,使得分面标题出现在底部,而x轴出现在分面顶部。

原因是我想重复使用这些标题作为图表下方的表格。

所以在这个例子中...

library(ggplot2)

my.hist<-ggplot(diamonds, aes(clarity)) + geom_bar()

my.hist + facet_wrap( ~ cut, ncol=5) + coord_flip()

我希望“cut”标签能够显示在图表下方。我认为facet_grid可能是关键,但这只是猜测。
有人知道如何实现吗?

1
我不知道自从这个或者这个以来,这个问题的答案有没有改变。 - joran
看起来不太妙...可能有点跑题,但我想知道lattice是否提供这个功能。 - wesmantooth
1个回答

7
在图表下方获取面条带很容易,
library(gtable)
g <- ggplotGrob(p)

strips <- gtable_filter(g, "strip_t", trim=FALSE)
grid.newpage()
grid.draw(rbind(g, strips[3,], size="first"))

然而,轴需要更多的注意,因为必须反转刻度线和标签的位置。您可以从以下内容开始:

tweak_axis <- function(a){
  inner <- a[["children"]]["axis"][[1]]
  inner[["grobs"]] <- rev(inner[["grobs"]])
  inner$grobs[[2]]$y <- inner$grobs[[2]]$y - unit(0.15, "cm")
  a[["children"]]["axis"][[1]] <- inner
  a
}

axes <- gtable_filter(g, "axis_b", trim=FALSE)
axes$grobs <- lapply(axes$grobs, tweak_axis)
grid.newpage()
grid.draw(axes)

编辑:基于上述内容,“完整”的解决方案可能是

grid.newpage()
g2 <- g
new_axes <- lapply(g2$grobs[grepl("axis_b", g2$layout$name)], tweak_axis)
g$grobs[grepl("strip_t", g$layout$name)] <- new_axes 
g$grobs[grepl("axis_b", g$layout$name)] <- g2$grobs[grepl("strip_t", g2$layout$name)] 
# heights should be changed too, but it's kind of ok here
xlab <- 7; title <- 1:2
grid.draw(rbind(g[xlab,], g[-c(title, xlab), ], size="last"))

输入图像描述

(当然有明显的限制)


1
kohske发布了一些有关坐标轴的技巧:http://rpubs.com/kohske/dual_axis_in_ggplot2 - baptiste
如果我使用 "strip_t" 然后运行 strips,我会得到输出 TableGrob (6 x 5) "layout": 0 grobs。这是预期的效果吗?我问这个问题是因为在最终输出中我也遇到了一个错误,Error in mmm < each : comparison of these types is not implemented。然而,我正在用我的代码中的 my.plot 替换你的代码中的 p。这是正确的用法吗? - wesmantooth
1
你的gtable中应该有5个grobs,请确保p是你更新后的图形,包括第二行(facet_wrap)。我已经更新了代码以处理其他错误。 - baptiste
好的,谢谢你指出这个问题。我不得不重新分配到更新的图形上,这提供了预期的输出。现在我已经得到了面板标签的预期输出,并且我将尝试追踪反转刻度线。很高兴能够得到gridExtra作者的回答。非常感谢! - wesmantooth
太棒了!我很感激你将那个功能封装成一个函数。看起来这是一些内部代码。我需要进行实验,以便理解你正在操作的内部结构,然后将该函数参数化。不过有一个问题,当在使用该函数的代码中没有传递参数时,函数如何知道(a)?再次感谢! - wesmantooth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接