gpt4 book ai didi

使用 facet_wrap 时重新排序 geom_bar

转载 作者:行者123 更新时间:2023-12-04 04:26:17 26 4
gpt4 key购买 nike

我试图实现的是让条形按每个面板的给定变量排序。

一个简单的例子:

    library(ggplot2)
library(plyr)

df <- data.frame(fac = c("a", "b", "c", "e", "b", "c", "d"),
val = c(1, 2, 7, 4, 5, 3, 1),
group = c(1, 1, 1, 1, 2, 2, 2))

p1 <- ggplot(df, aes(x = fac, y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip()
p1

p2 <- ggplot(df, aes(x = reorder(fac, val), y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip()
p2

p2 没有产生我想要的,因为并非每个“因子级别”都出现在所有面板中。这个问题是否已经有一个简单的解决方案?

我找到的一个解决方案如下(计算每组每个因素水平的排名)。
df2 <- ddply(df, .(group), transform, fac2 = rank(val))
df2$fac2 <- factor(df2$fac2)
p3 <- ggplot(df2, aes(x = fac2, y = val)) + facet_wrap(~ group, scales = "free") + geom_bar(stat = "identity") + coord_flip() +
opts(panel.margin = unit(2, "lines"))
p3

我必须在这里自己设置标签。一种可能的解决方案如下(本示例硬编码):
grid.newpage()
grob <- ggplotGrob(p3)
object.path <- grid.ls(getGrob(grob, "axis.text.y", grep = TRUE, global = TRUE), print = FALSE)$name
grob <- grid::editGrob(grob, object.path[1], label = c("ABDQ", "M", "A", "B"))
grob <- grid::editGrob(grob, object.path[2], label = c("A", "B", "EEEEX"))
grid.draw(grob)

但是还有另一个问题。我现在必须自己设置 panel.margin 似乎不可能这样做,因为我只能设置一个“全局” panel.margin 而我需要的是一个用于所有 4 个方面(或至少 2)。

问题 1:是否有使用重新排序的简单解决方案?

问题 2:有没有使用 scale_x_discrete 获得所需轴的解决方案?

问题 3:我无法找到所需的网格对象来操作 panel.margins 的视口(viewport)。有没有一种简单的方法来操作适当的网格对象?

有任何想法吗?

最佳答案

我认为 grid.arrange比尝试将自由鳞片塞入刻面框架中是一个更好的工具:

library(gridExtra)
q1 <- ggplot(subset(df,group == 1),aes(x = reorder(fac,val),y = val)) +
geom_bar() +
facet_wrap(~group) +
coord_flip()

q2 <- q1 %+% subset(df,group == 2)

grid.arrange(q1,q2,nrow = 1)

enter image description here

关于使用 facet_wrap 时重新排序 geom_bar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13865133/

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