Иерархическая/многоуровневая круговая диаграмма

Есть ли способ создать такую ​​диаграмму в R?

enter image description here

Вот выдержка из данных, показанных на диаграмме:

df <- structure(list(Animal = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Buffalo", 
"Goat", "Sheep"), class = "factor"), Texture = structure(c(4L, 
4L, 4L, 4L, 4L, 3L, 3L, 3L, 2L, 1L, 1L, 4L, 3L, 4L, 2L, 2L, 2L, 
2L, 1L, 1L, 1L, 1L), .Label = c("Hard", "Semi-Hard", "Semi-Soft", 
"Soft"), class = "factor"), Name = structure(c(16L, 9L, 3L, 21L, 
5L, 4L, 10L, 2L, 12L, 11L, 8L, 14L, 1L, 7L, 22L, 15L, 6L, 20L, 
18L, 17L, 19L, 13L), .Label = c("Buffalo Blue", "Charolais", 
"Chevre Bucheron", "Clochette", "Crottin de Chavignol", "Feta", 
"Fleur du Maquis", "Garrotxa", "Golden Cross", "Humboldt Fog", 
"Idaho Goatster", "Majorero", "Manchego", "Mozzarella di Bufala Campana", 
"Ossau-Iraty", "Pantysgawn", "Pecorino Romano", "Pecorino Sardo", 
"Roncal", "Roquefort", "Sainte-Maure de Touraine", "Yorkshire Blue"
), class = "factor")), .Names = c("Animal", "Texture", "Name"
), class = "data.frame", row.names = c(NA, -22L))

Ответ 1

Этот график огромен. Ну, я добрался так далеко, пока не начал немного опускаться. Короче говоря, есть быстрый, не-ggplot2 способ (который почти дает вам то, что вы хотите) и длинный путь ggplot2 (который почти дает вам то, что вы хотите). Быстрый способ (используя df, приведенный в качестве примера выше):

devtools::install_github("timelyportfolio/sunburstR")
library(sunburstR)
df1 <- df %>% 
  group_by(Animal) %>% 
  unite(col=Type, Animal:Name, sep = "-", remove=T)

df1$Type <- gsub(" ", "", df1$Type)
df1$Index <- 1
sunburst(df1)

Это дает вам небольшое интерактивное изображение (не интерактивное, просто снимок):

введите описание изображения здесь

Путь ggplot2 сложный, и я не понял, как правильно помечать изображение на изображении, но, возможно, кто-то может построить этот код и сделать это.

df1 <- df %>% 
  mutate(Colour = ifelse(.$Animal == "Goat", "#CD9B1D", ifelse(.$Animal == "Sheep", "#EEC900", "#FFD700"))) %>% 
  mutate(Index = 1) %>% 
  group_by(Animal)

Существует три уровня:

First <- ggplot(df1) + geom_bar(aes(x=1, y=Animal, fill=Animal, 
         label = Animal), position='stack', stat='identity', size=0.15) 
       + theme(panel.grid = element_blank(), axis.title=element_blank(), 
         legend.position="none", axis.ticks=element_blank(), 
         axis.text = element_blank())

Second <- First 
        + geom_bar(data=df1, aes(x=2, y=Animal, fill=Texture, group=Animal),
          position='stack', stat='identity', size=0.15, colour = "black") 
        + scale_color_brewer(palette = "YlOrBr")
        + scale_fill_brewer(palette = "YlOrBr") 
        + theme(axis.title=element_blank(), legend.position="none",    
          axis.ticks=element_blank(), axis.text = element_blank())

Third <- Second + geom_bar(data=df1, aes(x=3, y=Animal, fill=Name), 
         position='stack', stat='identity', size=0.15, colour = "black") 
       + scale_fill_manual(values = c("#EEC900", "#FFD700", "#CD9B1D",
         "#FFD700", "#DAA520", "#EEB422", "#FFC125", "#8B6914", "#EEC591", 
         "#FFF8DC", "#EEDFCC", "#FFFAF0", "#EEC900", "#FFD700", "#CDAD00", 
         "#FFF68F", "#FFEC8B", "#FAFAD2", "#FFFFE0", "#CD853F", "#EED8AE", 
         "#F5DEB3", "#FFFFFF", "#FFFACD", "#D9D9D9", "#EE7600", "#FF7F00",
         "#FFB90F", "#FFFFFF")) 
        + theme(axis.title=element_blank(), legend.position="none",
          axis.ticks=element_blank(), axis.text.y = element_blank(), 
          panel.background = element_rect(fill = "black"))

Third + coord_polar('y')

Это дает нам:

введите описание изображения здесь

Хорошо, это так близко, как я. Серьезные шляпы у всех, кто может воссоздать этот граф в R!!

Ответ 2

Было бы проще ответить на ваш вопрос примерным набором данных. Тем не менее, я просто предлагаю вам нарисовать сложный бархарт с ggplot() и geom_bar() и добавить + coord_polar().

Ответ 3

Конечно, это возможно, хотя для вас не существует никаких консервированных функций.

Я бы, вероятно, начинал с функции floating.pie из пакета plotrix, создавал круговую диаграмму с самой подробной (внешнее кольцо), а затем сюжет поверх этой другой круговой диаграммы с жесткой и мягкой информацией с меньшим чтобы наружное кольцо все еще показывало, но новый покрывает центр. Затем, наконец, сделайте еще одну меньшую круговую диаграмму в центре с информацией о животных.

Если вам действительно нужны образы вокруг внешнего края, посмотрите на функцию rasterImage.

Вы также можете просто вычислить координаты многоугольника для каждого раздела и нарисуйте их, обертывая, что в правильных циклах и функциях будет разумным.

Также использование ggplot2 со штабелем и полярными координатами, как было отмечено в комментариях, может работать для вас.