我正在使用facet_wrap
和coord_polar
绘制一些饼图,假设我有序列为A
,B
,C
的因子。{{1对于x轴,使用D
(对于3个图表,让我们说)和facet_wrap
。我将有3个馅饼(馅饼coord_polar
,X
,Y
),排列为Z
,A
,B
。{{1}顺时针方向。
当我想为每个方面单独重新安排因子C
时出现问题,例如:
D
我想:
饼图X排列为:level
, A B C D
X 10 20 30 40
Y 20 30 40 10
Z 30 40 10 20
,A
。B
顺时针
馅饼Y排列为:C
,D
,D
。A
顺时针
馅饼Z安排为:B
,C
,C
。D
顺时针
我可以在ggplot2中这样做吗?感谢。
答案 0 :(得分:7)
网格/视口方法可以像这样工作。首先,我们安排一些数据以匹配您显示的内容。我们根据您在问题中指定的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)
}
接下来,我们只是在正确的视口上绘制每个save ggplot对象,由参数vp
指定:
print(p1, vp = vplayout(1,1))
print(p2, vp = vplayout(1,2))
print(p3, vp = vplayout(2,1))
以上网格代码取自Hadley关于ggplot的优秀书籍第94页。
这会产生: