好的,我在家酿啤酒杯上难以接受。
我想要做的是为每个方面创建一个三行,一列刻面图,并使用不同的y轴标签。 y轴的单位都是相同的。这将是最方便的,但谷歌搜索告诉我,这可能是不可能的。
或者,我使用grid.arrange找到了this解决方案,看起来它会起作用。但是,我想仅为一个绘图保留一个图例并将其从其他两个中移除,但保持间距就像它仍然存在一样,以便所有内容都很好。几年前有人有same problem,但建议的解决方案已经过折旧,我无法理解如何在现代ggplot中使用它。
任何帮助表示赞赏!使用facet是最简单的!
在下面使用user20560的gridArrange解决方案后编辑添加绘图副本。非常接近那里,只想在顶部和底部面板周围取回盒子!
答案 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)
或使用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轴的方法。