将 x 和 y 轴添加到所有 facet_wrap
Posted
技术标签:
【中文标题】将 x 和 y 轴添加到所有 facet_wrap【英文标题】:Add x and y axis to all facet_wrap 【发布时间】:2014-04-02 17:10:50 【问题描述】:通常需要尽量减少绘图中的墨水。我有一个多面图 (facet_wrap
),并希望尽可能多地去除墨水但保持可读性。我已经按照我的意愿进行了设置,除了小平面(子图)不存在 x 和 y 轴,除非在最左侧或底部。去除了这么多墨水,我相信眼睛需要这些提示,并询问如何将 x 和 y 轴放在facet_wrap
内的所有图中。以下是我目前的代码,当前输出和期望的输出(红线是所需的插件):
library(ggplot); library(grid)
ggplot(mtcars, aes(mpg, hp)) +
geom_point() +
facet_wrap(~carb) +
theme(panel.grid = element_blank(),
panel.background = element_rect(fill = "white", colour = "black"),
panel.border = element_rect(fill = NA, colour = "white"),
axis.line = element_line(),
strip.background = element_blank(),
panel.margin = unit(2, "lines"))
当前剧情
想要的情节
【问题讨论】:
您的示例中出现could not find function "unit"
错误。
@Thomas 我很抱歉。让我添加使用的库。
你不能轻易做到这一点,因为axis.line
主题元素不会显示在每个面板上,除非scales = "free"
,而panel.border
主题元素是一个矩形,你可以' t 为矩形元素的不同边指定不同的值。你可以用geom_vline
和geom_hline
来伪装它,但很难让它看起来正确。
您可能会从@baptiste 的回答here 和here 中得到一些想法。
gridExtra::borderGrob(type=9)
可以帮忙,if ggplot2 had allowed some flexibility in theme elements。
【参考方案1】:
这应该会大大简化事情:
library('ggthemes')
ggplot(mtcars, aes(mpg, hp)) + geom_point() + facet_wrap(~carb, scales='free') +
theme_tufte() + theme(axis.line=element_line()) +
scale_x_continuous(limits=c(10,35)) + scale_y_continuous(limits=c(0,400))
【讨论】:
不幸的是,最简单的答案scales = "free"
对我来说并不好。 +1
@TylerRinker 查看编辑。没有注意到您将所有内容都限制在相同的范围内。
这个答案不适用于最新的ggplot2 2.2.1版
@wikiselev 使用 ggplot2_2.2.1 和 ggthemes_3.4.0 为我工作
@Thomas 好吧,但我想这是因为 ggthemes? ggplot 本身不起作用?【参考方案2】:
这是一个很长的解决方法。
首先,将原始图存储为对象,然后创建另一个没有轴刻度和轴文本的图。
p1<-ggplot(mtcars, aes(mpg, hp)) +
geom_point() +
facet_wrap(~carb) +
theme(panel.grid = element_blank(),
panel.background = element_blank(),
panel.border = element_blank(),
axis.line = element_line(),
strip.background = element_blank(),
panel.margin = unit(2, "lines"))
p2<-ggplot(mtcars, aes(mpg, hp)) +
geom_point() +
facet_wrap(~carb) +
theme(panel.grid = element_blank(),
panel.background = element_blank(),
panel.border = element_blank(),
axis.line = element_line(),
strip.background = element_blank(),
panel.margin = unit(2, "lines"),
axis.ticks=element_blank(),
axis.text=element_blank())
现在使用函数 ggplotGrob()
将两个图都转换为 grobs。如果我们查看这些 grobs 的结构,您会看到可见的 y 轴是 grob 14 和 17(其他是 0 grobs),而 x 轴是 grobs 23 到 25。
g1<-ggplotGrob(p1)
g2<-ggplotGrob(p2)
g2
TableGrob (12 x 12) "layout": 28 grobs
z cells name grob
1 0 ( 1-12, 1-12) background rect[plot.background.rect.3481]
2 1 ( 4- 4, 4- 4) panel-1 gTree[panel-1.gTree.3356]
3 2 ( 4- 4, 7- 7) panel-2 gTree[panel-2.gTree.3366]
4 3 ( 4- 4,10-10) panel-3 gTree[panel-3.gTree.3376]
5 4 ( 8- 8, 4- 4) panel-4 gTree[panel-4.gTree.3386]
6 5 ( 8- 8, 7- 7) panel-5 gTree[panel-5.gTree.3396]
7 6 ( 8- 8,10-10) panel-6 gTree[panel-6.gTree.3406]
8 7 ( 3- 3, 4- 4) strip_t-1 absoluteGrob[strip.absoluteGrob.3448]
9 8 ( 3- 3, 7- 7) strip_t-2 absoluteGrob[strip.absoluteGrob.3453]
10 9 ( 3- 3,10-10) strip_t-3 absoluteGrob[strip.absoluteGrob.3458]
11 10 ( 7- 7, 4- 4) strip_t-4 absoluteGrob[strip.absoluteGrob.3463]
12 11 ( 7- 7, 7- 7) strip_t-5 absoluteGrob[strip.absoluteGrob.3468]
13 12 ( 7- 7,10-10) strip_t-6 absoluteGrob[strip.absoluteGrob.3473]
14 13 ( 4- 4, 3- 3) axis_l-1 absoluteGrob[axis-l-1.absoluteGrob.3433]
15 14 ( 4- 4, 6- 6) axis_l-2 zeroGrob[axis-l-2.zeroGrob.3434]
16 15 ( 4- 4, 9- 9) axis_l-3 zeroGrob[axis-l-3.zeroGrob.3435]
17 16 ( 8- 8, 3- 3) axis_l-4 absoluteGrob[axis-l-4.absoluteGrob.3441]
18 17 ( 8- 8, 6- 6) axis_l-5 zeroGrob[axis-l-5.zeroGrob.3442]
19 18 ( 8- 8, 9- 9) axis_l-6 zeroGrob[axis-l-6.zeroGrob.3443]
20 19 ( 5- 5, 4- 4) axis_b-1 zeroGrob[axis-b-1.zeroGrob.3407]
21 20 ( 5- 5, 7- 7) axis_b-2 zeroGrob[axis-b-2.zeroGrob.3408]
22 21 ( 5- 5,10-10) axis_b-3 zeroGrob[axis-b-3.zeroGrob.3409]
23 22 ( 9- 9, 4- 4) axis_b-4 absoluteGrob[axis-b-4.absoluteGrob.3415]
24 23 ( 9- 9, 7- 7) axis_b-5 absoluteGrob[axis-b-5.absoluteGrob.3421]
25 24 ( 9- 9,10-10) axis_b-6 absoluteGrob[axis-b-6.absoluteGrob.3427]
26 25 (11-11, 4-10) xlab text[axis.title.x.text.3475]
27 26 ( 4- 8, 2- 2) ylab text[axis.title.y.text.3477]
28 27 ( 2- 2, 4-10) title text[plot.title.text.3479]
因此,使用情节 2 的相应 grobs 替换情节 1 中的零 grobs,您将获得轴线。
g1[[1]][[15]]<-g2[[1]][[14]]
g1[[1]][[16]]<-g2[[1]][[14]]
g1[[1]][[18]]<-g2[[1]][[14]]
g1[[1]][[19]]<-g2[[1]][[14]]
g1[[1]][[20]]<-g2[[1]][[23]]
g1[[1]][[21]]<-g2[[1]][[23]]
g1[[1]][[22]]<-g2[[1]][[23]]
grid.draw(g1)
【讨论】:
为什么不向 gtable 的每个面板添加分段? @baptiste 因为我不知道该怎么做。欢迎您展示这一点。 效果很好,但我看到 baptise 提供了一个他删除的更普遍的答案。 +1 @TylerRinker 是的,巴蒂斯特的回答要好得多。【参考方案3】:最简单的方法是在每个绘图面板中添加段,
ggplot(mtcars, aes(mpg, hp)) +
geom_point() +
facet_wrap(~carb) +
theme_minimal() +
annotate("segment", x=-Inf, xend=Inf, y=-Inf, yend=-Inf)+
annotate("segment", x=-Inf, xend=-Inf, y=-Inf, yend=Inf)
【讨论】:
对我来说,它以不同宽度的附加线结束,这很烦人...... 我希望对我的图表也使用这个简单的答案,但是我的 x 轴使用日期,这会给出错误:“错误:无效输入:date_trans 仅适用于 Date 类的对象”。有什么想法吗? @JelenaČuklina 尝试添加size
参数,例如annotate("segment", x=-Inf, xend=Inf, y=-Inf, yend=-Inf, size = 1) +
。它对我有用。【参考方案4】:
按照上面的托马斯回答 -
您只需在facet_wrap
中设置scales='free'
并确保在scale_x_continuous
和scale_y_continuous
中设置限制
ggplot(mtcars, aes(mpg, hp)) + geom_point() + facet_wrap(~carb, scales='free') +
scale_x_continuous(limits=c(10,35)) + scale_y_continuous(limits=c(0,400))
【讨论】:
【参考方案5】:lemon 包添加了此功能;看 this vignette。 (示例代码并从那里绘制。)
library(lemon)
p + facet_rep_grid(drv ~ cyl) + coord_capped_cart(bottom='both', left='both') +
theme_bw() + theme(panel.border=element_blank(), axis.line=element_line())
【讨论】:
以上是关于将 x 和 y 轴添加到所有 facet_wrap的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中使用带有 facet_wrap 的 ggplot2 显示多个轴标签
在 ggplot/ggplotly 中使用 facet_wrap 时如何防止 y 轴挤压标签?
如何在 Highcharts 中将注释文本添加到 x 和 y 轴?