当我使用facet_wrap()
并带有两个变量且均为无刻度的分面时,我想消除带状标签的冗余性。
例如,下图的facet_wrap
版
library(ggplot2)
dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]
ggplot(dt, aes(median, sales)) +
geom_point() +
facet_wrap(c("year", "month"),
labeller = "label_both",
scales = "free")
应具有此facet_grid
版本的外观,其中带状标签位于图形的顶部和右侧(也可以是底部和左侧)。
ggplot(dt, aes(median, sales)) +
geom_point() +
facet_grid(c("year", "month"),
labeller = "label_both",
scales = "free")
不幸的是,不能使用facet_grid
,因为据我所知,它不允许秤完全“免费” -请参见here或here
我考虑过的一种尝试是制作单独的图,然后将它们组合起来:
library(cowplot)
theme_set(theme_gray())
p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
labs(y = "2000") +
theme(axis.title.x = element_blank())
p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
labs(y = "2001") +
theme(strip.background = element_blank(),
strip.text.x = element_blank(),
axis.title.x = element_blank())
p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
labs(y = "2002") +
theme(strip.background = element_blank(),
strip.text.x = element_blank())
plot_grid(p1, p2, p3, nrow = 3)
我可以接受上述黑客尝试,但是我想知道facet_wrap
中是否有某些东西可以允许期望的输出。我觉得我很想念它,也许我的答案搜索未包含正确的关键字(我觉得这个问题之前已经解决过)。
答案 0 :(得分:3)
我不确定您是否可以仅使用facet_wrap
来完成此操作,因此您的尝试可能就是方法。但海事组织需要改进。目前,您缺少实际的y-lab
(销售),这有点误导了y- axis
中绘制的内容
您可以通过使用gtable
和grid
添加另一个打印标题行来改善您的工作。
p1 <- ggplot(dt[dt$year == 2000,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
theme(axis.title.x = element_blank())
p2 <- ggplot(dt[dt$year == 2001,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free") +
theme(axis.title.x = element_blank())
p3 <- ggplot(dt[dt$year == 2002,], aes(median, sales)) +
geom_point() +
facet_wrap("month", scales = "free")
请注意,labs
已从上述图表中删除。
if ( !require(grid) ) { install.packages("grid"); library(grid) }
if ( !require(gtable ) ) { install.packages("gtable"); library(gtable) }
z1 <- ggplotGrob(p1) # Generate a ggplot2 plot grob
z1 <- gtable_add_rows(z1, unit(0.6, 'cm'), 2) # add new rows in specified position
z1 <- gtable_add_grob(z1,
list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
textGrob("2000", gp = gpar(col = "black",cex=0.9))),
t=2, l=4, b=3, r=13, name = paste(runif(2))) #add grobs into the table
请注意,在第3步中,获取t (top extent)
,l(left extent)
,b (bottom extent)
和r(right extent)
的确切值可能需要反复试验的方法
现在对p2和p3重复上述步骤
z2 <- ggplotGrob(p2)
z2 <- gtable_add_rows(z2, unit(0.6, 'cm'), 2)
z2 <- gtable_add_grob(z2,
list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
textGrob("2001", gp = gpar(col = "black",cex=0.9))),
t=2, l=4, b=3, r=13, name = paste(runif(2)))
z3 <- ggplotGrob(p3)
z3 <- gtable_add_rows(z3, unit(0.6, 'cm'), 2)
z3 <- gtable_add_grob(z3,
list(rectGrob(gp = gpar(col = NA, fill = gray(0.7))),
textGrob("2002", gp = gpar(col = "black",cex=0.9))),
t=2, l=4, b=3, r=13, name = paste(runif(2)))
最后是密谋
plot_grid(z1, z2, z3, nrow = 3)
您还可以在facet_grid
之类的列中指定年份,而不要在行中指定年份。在这种情况下,您必须使用gtable_add_cols
添加一列。但是请确保(a)在步骤2中将列添加到正确的位置,并(b)获取t
,l
,b
和{{1}的正确值},进入步骤3。
答案 1 :(得分:1)
这似乎并不容易,但是一种方法是使用网格图形将facet_grid图中的面板条插入作为facet_wrap创建的面板中。像这样:
首先让我们使用facet_grid和facet_wrap创建两个图。
dt <- txhousing[txhousing$year %in% 2000:2002 & txhousing$month %in% 1:3,]
g1 = ggplot(dt, aes(median, sales)) +
geom_point() +
facet_wrap(c("year", "month"), scales = "free") +
theme(strip.background = element_blank(),
strip.text = element_blank())
g2 = ggplot(dt, aes(median, sales)) +
geom_point() +
facet_grid(c("year", "month"), scales = "free")
现在我们可以很容易地用g1
的顶面条替换g2
的顶面条了
library(grid)
library(gtable)
gt1 = ggplot_gtable(ggplot_build(g1))
gt2 = ggplot_gtable(ggplot_build(g2))
gt1$grobs[grep('strip-t.+1$', gt1$layout$name)] = gt2$grobs[grep('strip-t', gt2$layout$name)]
grid.draw(gt1)
添加右侧面板条需要我们首先在网格布局中添加一个新列,然后将相关的条杂物粘贴到其中:
gt1 = gtable_add_cols(gt1, widths=gt.side1$widths[1], pos = -1)
panel_id <- gt1$layout[grep('panel-.+1$', gt1$layout$name),]
gt.side1 = gtable_filter(gt2, 'strip-r-1')
gt.side2 = gtable_filter(gt2, 'strip-r-2')
gt.side3 = gtable_filter(gt2, 'strip-r-3')
gt1 = gtable_add_grob(gt1, zeroGrob(), t = 1, l = ncol(gt1), b=nrow(gt1))
gt1 = gtable_add_grob(gt1, gt.side1, t = panel_id$t[1], l = ncol(gt1))
gt1 = gtable_add_grob(gt1, gt.side2, t = panel_id$t[2], l = ncol(gt1))
gt1 = gtable_add_grob(gt1, gt.side3, t = panel_id$t[3], l = ncol(gt1))
grid.newpage()
grid.draw(gt1)