gpt4 book ai didi

r - 如何使用 facet_grid 或 facet_wrap 保持条的厚度均匀并切换 strip 位置?

转载 作者:行者123 更新时间:2023-12-02 00:59:10 25 4
gpt4 key购买 nike

我想用水平条形图显示数据并按分组变量对其进行分面。因为我想要一个带有分面的水平图,所以我将使用 ggstance 包中的 geom_barh。我有一个数据集,其中我的观察结果分为几种不同的类型和计数。像这样:

library(tidyverse)

data <- tibble(observations = c(1:17),
type = c("a", "a", "a", "a",
"b", "b", "b", "b", "b", "b",
"c", "c", "c", "c", "c", "c", "c"),
n = c(30:46))

这是我的问题。当我使用 facet_wrap 时,我的条具有不同的宽度:

library(ggstance)    

ggplot(data, aes(x = n, y = reorder(observations, n))) +
geom_barh(stat = "identity") +
facet_wrap(~ type, ncol = 1, scales = "free_y")

enter image description here

但是当我使用 facet_grid 时,我无法将 strip 移动到顶部,因为没有 strip.position 参数:

ggplot(data, aes(x = n, y = reorder(observations, n))) +
geom_barh(stat = "identity") +
facet_grid(type ~ . , scales = "free_y", space = "free_y")

enter image description here

这只是 ggplot 的怪癖之一还是有办法操纵它?

最佳答案

我不认为 ggplot2 是为这个目的而设计的,但像许多其他情况一样,如果您愿意接受 grob(而不是 ggplot2 对象)作为最终结果,破解解决方案是可能的。

这里的基本思想是 facet_wrap() 允许 strip 处于任何位置(顶部/左侧/右侧/底部),而 fact_grid() 允许面板的高度/宽度不同。如果我们将每个选项的 ggplot2 结果转换为 grob 对象,我们可以将选项 2 的面板高度应用到选项 1。方法如下:

第 1 步。基于 facet_wrap()facet_grid() 创建 ggplot2 对象。将它们转换为 grob 对象。 (注意:我没有安装 ggstance 包,但通常的 geom_col() + coord_flip() 应该是相似的,为了说明这里的概念。 .)

p1 <- ggplot(data, aes(y = n, x = reorder(observations, n))) +
geom_col() +
facet_wrap(~ type, ncol = 1, scales = "free_y") +
coord_flip()
g1 <- ggplotGrob(p1)

p2 <- ggplot(data,
aes(y = n, x = reorder(observations, n))) +
geom_col() +
facet_grid(type ~ . , scales = "free_y", space = "free_y") +
coord_flip()
g2 <- ggplotGrob(p2)

第 2 步。获取面板行在 g1 和 g2 布局中的位置:

g1.panel.rows <- g1$layout$t[grep("panel", g1$layout$name)] #7 / 12 / 17 in this case
g2.panel.rows <- g2$layout$t[grep("panel", g2$layout$name)] #6 / 8 / 10 in this case

# optional: view the layout & visually check that the above are correct
gtable::gtable_show_layout(g1)
gtable::gtable_show_layout(g2)

# also optional (but recommended): check the current height associated with each panel;
# note that g1 has equal height for each panel, while g2 does not
> g1$heights[g1.panel.rows]
[1] 1null 1null 1null
> g2$heights[g2.panel.rows]
[1] 4.2null 6.2null 7.2null

第 3 步。将 g2 的面板高度应用于 g1 的面板并查看结果。

g1$heights[g1.panel.rows] <- g2$heights[g2.panel.rows]
grid::grid.draw(g1)

plot

关于r - 如何使用 facet_grid 或 facet_wrap 保持条的厚度均匀并切换 strip 位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51897991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com