[英]arranging order of stacked geom_bar in ggplot2
我正在使用facet_wrap
和coord_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
我想要:
派X安排为: A
, B
, C
。 D
顺时针
派Y的顺序为: D
, A
, B
。 顺时针C
Z派排列为: C
, D
, A
。 B
顺时针
我可以在ggplot2中这样做吗? 谢谢。
网格/视口方法将像这样工作。 首先,我们安排一些数据以匹配您显示的内容。 如您在问题中指定的那样,我们旋转X
, Y
和Z
每个因子的水平
## 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.