2013-06-12 11 views
11

क्या आर में इस तरह का एक चार्ट बनाने का कोई तरीका है?पदानुक्रमित/बहुस्तरीय पाई चार्ट

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

जो आप पूछ रहे हैं वह मुझे सनबर्स्ट प्लॉट की याद दिलाता है। कुछ समय पहले मैंने किसी प्रश्न का उत्तर दिया, जिसमें एक पुन: उत्पन्न उदाहरण शामिल है: http://stackoverflow.com/questions/12926779/how-to-make-a-sunburst-plot। पनीर के बारे में ग्राफिक समेत –

+4

+1। क्या मुझे इसका उच्च-रेज मिल सकता है? –

+2

@ साइमन ओ 101: आप ग्राफिक को यहां देख सकते हैं: http://www.fastcodesign.com/1672767/infographic-how-to-tell-the-difference-between-66-varieties-of-cheese#1 – majom

उत्तर

2

यह एक उदाहरण डाटासेट के साथ अपने सवाल का जवाब आसान होगा। हालांकि, मैं आपको सुझाव देता हूं कि आप ggplot() और geom_bar() के साथ एक स्टैक्ड बरचार्ट खींचें और + coord_polar() जोड़ें।

2

यह निश्चित रूप से संभव होगा, हालांकि कोई भी डिब्बाबंद कार्य आपके लिए ऐसा करने के लिए तैयार नहीं है।

मैं शायद प्लॉट्रिक्स पैकेज से floating.pie फ़ंक्शन के साथ शुरू करूंगा, अधिकतर विवरण (बाहरी अंगूठी) के साथ एक पाई चार्ट बनाएं, फिर उस छोटे पाई चार्ट के शीर्ष पर प्लॉट करें जो छोटे व्यास के साथ हार्ड बनाम मुलायम जानकारी के साथ हो ताकि बाहरी अंगूठी अभी भी दिखाती है लेकिन नया एक केंद्र को कवर करता है। फिर अंत में जानवरों की जानकारी के साथ केंद्र में एक और छोटा पाई चार्ट करें।

यदि आपको वास्तव में बाहरी किनारे के आसपास की छवियों की आवश्यकता है तो rasterImage फ़ंक्शन देखें।

आप प्रत्येक अनुभाग के लिए बहुभुज निर्देशांक की गणना भी कर सकते हैं और उनको साजिश कर सकते हैं, उचित लूप और फ़ंक्शन में लपेटना उचित होगा।

टिप्पणियों में उल्लिखित अनुसार, एक स्टैक्ड बार और ध्रुवीय निर्देशांक के साथ ggplot2 का भी उपयोग करना, आपके लिए काम कर सकता है।

4

वह ग्राफ भयानक है।
ठीक है, मुझे थोड़ा सा पागल जाने से पहले यह बहुत दूर मिला। संक्षेप में, एक त्वरित, गैर-ggplot2 तरीका है (जो आपको लगभग वही देता है जो आप चाहते हैं) और एक लंबा, ggplot2 तरीका (जो लगभग आपको वही देता है जो आप चाहते हैं)।

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) 

यह आपको एक महान छोटी इंटरैक्टिव छवि (इंटरैक्टिव यहाँ नहीं है, बस एक स्नैपशॉट) देता है::

enter image description here

ggplot2 रास्ता त्वरित तरीका (df ऊपर के उदाहरण डेटा के रूप में दिया का प्रयोग करके) मुश्किल है, और मुझे पता नहीं लगा है कि छवि पर सही तरीके से टिप्पणी कैसे करें, लेकिन शायद कोई इस कोड पर निर्माण कर सकता है और ऐसा कर सकता है।

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

यह हमें देता है::

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

तीन परतों हैं

enter image description here

ठीक है, कि के रूप में पास के रूप में मुझे मिल गया है। किसी भी व्यक्ति के लिए गंभीर टोपी जो आर में उस ग्राफ को फिर से बना सकता है !!

+0

अच्छी नौकरी! लेबल जोड़ने के लिए कोई possiblity? – majom

+0

धन्यवाद! मैं कुछ लेबल के साथ गड़बड़ कर रहा था, लेकिन समस्या उन्हें सही जगहों पर अस्तर कर रही है। कुछ मार्गदर्शिकाएं हैं [यहां] (http://stackoverflow.com/questions/8468472/adjusting-position-of-text-labels-in-coord-olar- हिस्टोग्राम-in-ggplot2), [यहां] (http://stackoverflow.com/questions/7830022/rotate-x-axis-text-in-ggplot2-when-using-coord-polar), और [यहां] (https://medium.com/optima-blog/create-basic -सुनबर्स्ट-ग्राफ-साथ-ggplot2-7d7484d92c61 # .979ss3fdy), लेकिन मैं इसे अच्छी तरह से काम करने के लिए काफी नहीं मिल सका। – RobertMc

संबंधित मुद्दे