![](/img/trans.png)
[英]Bars in geom_bar have unwanted different widths when using facet_wrap
[英]reordering geom_bar when using facet_wrap
我试图实现的是按每个面板的给定变量对条进行排序。
一个简单的例子:
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的视口。 有没有简单的方法来操纵适当的网格对象?
有任何想法吗?
我认为, grid.arrange
对于尝试将免费尺度扩展到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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.