在ggplot2中排列堆叠的geom_bar的顺序

lok*_*art 2 r ggplot2

我使用绘图一些饼图facet_wrapcoord_polar,让说我有因素与序列A,B,C.D,对于x轴,并使用facet_wrap(对于3个图表,让我们说)和coord_polar.我将有3个馅饼(馅饼X,Y,Z),以安排为A,B,C.D顺时针方向.

当我想level为每个方面单独重新排列因子时出现问题,例如:

   A  B  C  D
X 10 20 30 40
Y 20 30 40 10
Z 30 40 10 20
Run Code Online (Sandbox Code Playgroud)

我想要:

馅饼X到被布置为:A,B,C.D顺时针

馅饼Y中排列为:D,A,B.C顺时针

馅饼Z到被布置为:C,D,A.B顺时针

我可以在ggplot2中这样做吗?谢谢.

Rei*_*son 7

网格/视口方法可以像这样工作.首先,我们安排一些数据以匹配您显示的内容.我们轮换每个因子的级别X,YZ在问题中指定

## Your data
dat <- data.frame(X = factor(rep(LETTERS[1:4], times = c(10,20,30,40)), 
                             levels = LETTERS[1:4]),
                  Y = factor(rep(LETTERS[1:4], times = c(20,30,40,10)),
                             levels = LETTERS[c(4,1:3)]),
                  Z = factor(rep(LETTERS[1:4], times = c(30,40,10,20)),
                             levels = LETTERS[c(3:4,1:2)]))
Run Code Online (Sandbox Code Playgroud)

接下来我们制作单独的饼图,scale_fill_manual()以相同的顺序旋转相同的颜色,我们旋转数据中的水平,dat(对于令人讨厌的颜色道歉 - 如何获得nggplot正常使用的第一种颜色?):

p1 <- ggplot(dat, aes(x = factor(1), fill = factor(X))) + 
          geom_bar(width = 1) + coord_polar(theta = "y") +
          scale_fill_manual(value = c("red","green","yellow","blue"))
p2 <- ggplot(dat, aes(x = factor(1), fill = factor(Y))) + 
          geom_bar(width = 1) + coord_polar(theta = "y") +
          scale_fill_manual(value = c("red","green","yellow","blue")[c(4,1:3)])
p3 <- ggplot(dat, aes(x = factor(1), fill = factor(Z))) + 
          geom_bar(width = 1) + coord_polar(theta = "y") +
          scale_fill_manual(value = c("red","green","yellow","blue")[c(3:4,1:2)])
Run Code Online (Sandbox Code Playgroud)

现在我们需要一个新的绘图页面并将其推向2x2布局:

grid.newpage()
pushViewport(viewport(layout = grid.layout(2,2)))
Run Code Online (Sandbox Code Playgroud)

自定义函数允许我们简化为每个后续绘图设置行/列:

vplayout <- function(x, y) {
    viewport(layout.pos.row = x, layout.pos.col = y)
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们只需在正确的视口上绘制每个save ggplot对象,如参数所指定vp:

print(p1, vp = vplayout(1,1))
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
Run Code Online (Sandbox Code Playgroud)

上面的网格代码取自Hadley关于ggplot的优秀书中的第94页.

这会产生:

饼图和视口布局