Подход к сетке / окну просмотра будет работать примерно так. Сначала мы приводим некоторые данные в соответствие с тем, что вы показываете. Мы поворачиваем уровни фактора для каждого из 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
(с извинениями за неприятные цвета - как получить первый n
цвета, которые ggplot будет использовать нормально?):
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))
Приведенный выше код сетки был взят со страницы 94 в превосходной книге Хэдли о ggplot.
Это производит: