繁体   English   中英

ggplot2中堆叠的geom_bar的排列顺序

[英]arranging order of stacked geom_bar in ggplot2

我正在使用facet_wrapcoord_polar绘制一些饼图,可以说我有序列ABC因子。 D ,用于x轴,并使用facet_wrap (对于3个图表,假设)和coord_polar 我将有3个饼(饼XYZ )排列为ABC D沿顺时针方向。

当我想为每个方面分别重新排列因子level ,会出现问题,例如:

   A  B  C  D
X 10 20 30 40
Y 20 30 40 10
Z 30 40 10 20

我想要:

派X安排为: ABC D顺时针

派Y的顺序为: DAB 顺时针C

Z派排列为: CDA B顺时针

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

网格/视口方法将像这样工作。 首先,我们安排一些数据以匹配您显示的内容。 如您在问题中指定的那样,我们旋转XYZ每个因子的水平

## 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)]))

接下来,我们生成各个饼图,以与旋转数据中水平的顺序相同的顺序旋转相同的scale_fill_manual()颜色dat (对令人讨厌的颜色表示歉意-如何获得ggplot通常使用的前n种颜色? ):

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)])

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

grid.newpage()
pushViewport(viewport(layout = grid.layout(2,2)))

自定义函数使我们能够简化每个后续图的行/列的设置:

vplayout <- function(x, y) {
    viewport(layout.pos.row = x, layout.pos.col = y)
}

接下来,我们简单地将每个保存的ggplot对象绘制在正确的视口上,如参数vp

print(p1, vp = vplayout(1,1))
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))

上面的网格代码摘自Hadley关于ggplot的出色著作中的第94页。

这会产生:

饼图和视口布局

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM