通过构面分隔y轴标签或删除图例但保留空间

时间:2014-05-19 20:31:54

标签: r ggplot2

好的,我在家酿啤酒杯上难以接受。

我想要做的是为每个方面创建一个三行,一列刻面图,并使用不同的y轴标签。 y轴的单位都是相同的。这将是最方便的,但谷歌搜索告诉我,这可能是不可能的。

或者,我使用grid.arrange找到了this解决方案,看起来它会起作用。但是,我想仅为一个绘图保留一个图例并将其从其他两个中移除,但保持间距就像它仍然存在一样,以便所有内容都很好。几年前有人有same problem,但建议的解决方案已经过折旧,我无法理解如何在现代ggplot中使用它。

任何帮助表示赞赏!使用facet是最简单的!

在下面使用user20560的gridArrange解决方案后编辑添加绘图副本。非常接近那里,只想在顶部和底部面板周围取回盒子!

enter image description here

4 个答案:

答案 0 :(得分:5)

我假设(可能错误地)你想要添加单独的y轴标题而不是轴标签。 [如果您想要的标签不同,可以使用scales]中的facet_grid参数

将会有一种 ggplot 方式来执行此操作,但您可以通过以下几种方法自行调整凹凸。

因此使用 mtcars 数据集作为示例

library(ggplot2)
library(grid)
library(gridExtra)

单程

p <- ggplot(mtcars, aes(mpg, wt, col=factor(vs))) +   geom_point() + 
                                 facet_grid(gear ~ .)

# change the y axis labels manually
g <- ggplotGrob(p)
yax <- which(g$layout$name=="ylab")

# define y-axis labels
g[["grobs"]][[yax]]$label <- c("aa","bb", "cc")

# position of labels (ive just manually specified)
g[["grobs"]][[yax]]$y <- grid::unit(seq(0.15, 0.85, length=3),"npc")

grid::grid.draw(g)


    enter image description here
或使用grid.arrange

# Create a plot for each level of grouping variable and y-axis label
p1 <- ggplot(mtcars[mtcars$gear==3, ], aes(mpg, wt, col=factor(vs))) + 
                                 geom_point() + labs(y="aa") + theme_bw()
p2 <- ggplot(mtcars[mtcars$gear==4, ], aes(mpg, wt, col=factor(vs))) +  
                                 geom_point() + labs(y="bb") + theme_bw()
p3 <- ggplot(mtcars[mtcars$gear==5, ], aes(mpg, wt, col=factor(vs))) +  
                                 geom_point() + labs(y="cc") + theme_bw()

# remove legends from two of the plots
g1 <- ggplotGrob(p1)
g1[["grobs"]][[which(g1$layout$name=="guide-box")]][["grobs"]] <- NULL

g3 <- ggplotGrob(p3)
g3[["grobs"]][[which(g3$layout$name=="guide-box")]][["grobs"]] <- NULL

gridExtra::grid.arrange(g1,p2,g3)

如果是你想要添加的轴标题,我应该问为什么你想要一个不同的标题 - 小平面条文本不能吗?

答案 1 :(得分:4)

根据Axeman和aosmith的评论(谢谢),这里有一种方法可以使用ggplot2版本2.2.0的facet标签来做到这一点

library(ggplot2) # From sessionInfo(): ggplot2_2.2.0

ggplot(mtcars, aes(mpg, wt, col=factor(vs))) + geom_point() + 
  facet_grid(gear ~ ., switch = 'y') +
  theme( axis.title.y = element_blank(), # remove the default y-axis title, "wt"
         strip.background = element_rect(fill = 'transparent'), # replace the strip backgrounds with transparent
         strip.placement = 'outside', # put the facet strips on the outside
         strip.text.y = element_text(angle=180)) # rotate the y-axis text (optional)
# (see ?ggplot2::theme for a list of theme elements (args to theme()))

答案 2 :(得分:1)

我知道这是一篇旧帖子,但在找到之后,我无法得到@ user20560对工作的回应。

我已经按照以下方式修改了@ user20560的grid.extra方法:

library(ggplot2)
library(gridExtra)
library(grid)

# Create a plot for each level of grouping variable and y-axis label
p1 <- ggplot(mtcars[mtcars$gear==3, ], aes(mpg, wt, col=factor(vs))) + 
  geom_point() + labs(y="aa") + theme_bw()
p2 <- ggplot(mtcars[mtcars$gear==4, ], aes(mpg, wt, col=factor(vs))) +  
  geom_point() + labs(y="bb") + theme_bw()
p3 <- ggplot(mtcars[mtcars$gear==5, ], aes(mpg, wt, col=factor(vs))) +  
  geom_point() + labs(y="cc") + theme_bw()

# get the legend as a grob
legend <- ggplotGrob(p1)
legend <- legend$grobs[[which(legend$layout$name=="guide-box")]]
lheight <- sum(legend$height)
lwidth <- sum(legend$width)

# remove the legend from all the plots
p1 <- p1 + theme(legend.position = 'none')
p2 <- p2 + theme(legend.position = 'none')
p3 <- p3 + theme(legend.position = 'none')

# force the layout to the right side
layoutMat <- matrix(c(1,2,3,4,4,4),ncol = 2)

grid.arrange(p1,p2,p3,legend, layout_matrix = layoutMat, ncol = 2, 
             widths = grid::unit.c(unit(1,'npc') - lwidth, lwidth))

此示例有点特定于此特定布局。 ggplot2 wiki上有一种更通用的方法。

答案 3 :(得分:0)

我也无法在the answer of user20560(上图)中使用第一种方法。这可能是因为ggplot2的内部已经发展,并且不能保证这些内部结构应该保持不变。无论如何,这是一个当前有效的版本:

library(ggplot2) # From sessionInfo(): ggplot2_2.1.0
library(grid)

p <- ggplot(mtcars, aes(mpg, wt, col=factor(vs))) + geom_point() + facet_grid(gear ~ .)
g <- ggplotGrob(p)
yax <- which(g$layout$name == "ylab")
g[["grobs"]][[yax]]$children[[1]]$label <- c('fo','bar','foobar')
g[["grobs"]][[yax]]$children[[1]]$y <- grid::unit(seq(0.15, 0.85, length=3), "npc")
grid.draw(g)

请注意,这是保持构面并且不重复x轴的方法。