2013-06-12 26 views
11

Bu şekilde bir grafik oluşturma yolu var mı? İşte Hiyerarşik/Çok düzeyli pasta grafiği

enter image description here

grafikte gösterilen verilerin bir alıntı bulunmaktadır:

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)) 
+4

Ne soruyorsun bana bir güneş patlaması arsa hatırlatıyor. Bir süre önce tekrarlanabilir bir örnek dahil olmak üzere bir soruya cevap verdim: http://stackoverflow.com/questions/12926779/how-to-make-a-sunburst-plot. Peynir hakkında bir grafik eklemek için –

+4

+1. Bunun yüksek çözünürlüğünü alabilir miyim? –

+2

@ SimonO101: Grafiği şu adresten bulabilirsiniz: http://www.fastcodesign.com/1672767/infographic-how-to-tell-the-difference-between-66-varieties-of-cheese#1 – majom

cevap

2

Bir örnek veri kümesi soruyla cevap daha kolay olurdu. Bununla birlikte, ggplot() ve geom_bar() ile yığılmış bir barchart çizmenizi ve + coord_polar() öğesini eklemenizi öneririm.

2

Sizin için hazır bir konserve işlevi olmasa da, kesinlikle mümkün olabilir.

Plotrix paketinden floating.pie işlevini kullanarak başlayacağım, en ayrıntılı (dış halka) bir pasta grafiği oluşturup daha küçük çaplı sert ve yumuşak bilgilerle başka bir pasta grafiğinin üstüne çizim yapın dış halka hala görünecek, ancak yeni olan merkezini kaplayacak. Daha sonra merkezde hayvan bilgileri ile başka bir küçük pasta grafik yapın.

gerçekten dış kenar etrafında görüntüleri gerekiyorsa

sonra rasterImage fonksiyonu bakmak.

Ayrıca sadece poligon her bölüm için koordinatları hesaplamak ve uygun döngüler ve fonksiyonunda makul olacağını sarma, o çizmek olabilir.

Ayrıca yorumlarda bahsedildiği üzere, sizin için işe yarayabilecek bir yığılmış çubuk ve kutupsal koordinatları ile ggplot2 kullanarak.

4

Bu grafik müthiş olup.
Biraz kurumaya başlamadan önce bunu daha önce anladım. Kısacası, hızlı, ggplot2 olmayan bir yol (neredeyse istediğiniz şeyi verir) ve uzun, ggplot2 yolu vardır (neredeyse size ne istediğinizi verir).

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) 

Bu size büyük küçük etkileşimli resmi (burada etkileşimli değildir, sadece bir anlık) verir: ggplot2 yol

enter image description here

Hızlı yolu (Yukarıdaki örnek veri olarak verilen df kullanarak) zor ve görüntünün üzerine düzgün bir şekilde nasıl açıklama yapılacağını çözemedim, ama belki bu kod üzerinde birileri oluşturabilir ve bunu yapabilir.

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

Bu bize verir:

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

üç katmanları vardır

enter image description here

Eh, bu aldığım kadar yakındır. R'de bu grafiği yeniden oluşturabilecek herkese ciddi şapkalar!

+0

İyi iş! Etiket eklemek için herhangi bir olasılık? – majom

+0

Teşekkürler! Birkaç etiketle uğraştım ama sorun onları doğru yerlere yerleştiriyor. Bazı rehberler var [burada] (http://stackoverflow.com/questions/8468472/adjusting-position-of-text-labels-in-coord-polar-histogram-in-ggplot2), [burada] (http:/http://medium.com/optima-blog/create-basic -Sunburst-grafs-with-ggplot2-7d7484d92c61 # .979ss3fdy), ama oldukça iyi işe yaramazdım. – RobertMc

İlgili konular