2013-06-12 44 views
11

Có cách nào để tạo biểu đồ như thế này trong R không?Biểu đồ hình tròn/Đa cấp

enter image description here

Dưới đây là một trích dữ liệu thể hiện trong biểu đồ:

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

Những gì bạn đang yêu cầu nhắc tôi về âm mưu sunburst. Trong khi tôi trả lời một câu hỏi, bao gồm một ví dụ tái sản xuất: http://stackoverflow.com/questions/12926779/how-to-make-a-sunburst-plot. –

+4

+1 để bao gồm hình ảnh về pho mát. Tôi có thể nhận được độ phân giải cao về điều này không? –

+2

@ SimonO101: Bạn có thể tìm thấy hình ảnh tại: http://www.fastcodesign.com/1672767/infographic-how-to-tell-the-difference-between-66-varieties-of-cheese#1 – majom

Trả lời

2

Nó sẽ được dễ dàng hơn để trả lời câu hỏi của bạn với một ví dụ tập dữ liệu. Tuy nhiên, tôi sẽ đề nghị bạn vẽ một barchart xếp chồng lên nhau với ggplot() và geom_bar() và thêm + coord_polar().

2

Nó chắc chắn sẽ là có thể, mặc dù không có bất kỳ chức năng đóng hộp sẵn sàng để làm điều đó cho bạn.

Tôi có thể bắt đầu với hàm floating.pie từ gói lôgic, tạo biểu đồ hình tròn với chi tiết nhất (vòng ngoài), sau đó vẽ trên biểu đồ hình tròn khác với thông tin cứng và mềm với đường kính nhỏ hơn để vòng ngoài vẫn hiển thị nhưng cái mới bao phủ trung tâm. Sau đó, cuối cùng làm một biểu đồ hình tròn nhỏ ở trung tâm với các thông tin động vật.

Nếu bạn thực sự cần hình ảnh xung quanh cạnh ngoài, hãy xem hàm rasterImage.

Bạn cũng có thể chỉ tính toán tọa độ đa giác cho từng phần và vẽ các tọa độ đó, bao gói trong các vòng và chức năng thích hợp sẽ là hợp lý.

Cũng sử dụng ggplot2 với thanh xếp chồng và tọa độ cực, như đã được đề cập trong các nhận xét, có thể phù hợp với bạn.

4

Biểu đồ đó là tuyệt vời.
Vâng, tôi đã nhận được điều này đến nay trước khi tôi bắt đầu đi một chút hạt. Trong ngắn hạn, có một cách nhanh chóng, không ggplot2 (mà gần như cung cấp cho bạn những gì bạn muốn) và một cách ggplot2 dài (mà gần như cung cấp cho bạn những gì bạn muốn). cách nhanh chóng (sử dụng df cho là ví dụ dữ liệu ở trên):

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) 

này mang đến cho bạn một chút hình ảnh tuyệt vời tương tác (không tương tác ở đây, chỉ là một ảnh chụp):

enter image description here

Cách ggplot2 là khó khăn, và tôi đã không tìm ra làm thế nào để chú thích đúng vào hình ảnh, nhưng có lẽ ai đó có thể xây dựng trên mã này và làm như vậy.

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

Có ba lớp:

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

này cho chúng ta:

enter image description here

Vâng, đó là gần như là tôi có. Mũ nghiêm túc cho bất cứ ai có thể tái tạo đồ thị đó trong R !!

+0

Tốt lắm! Bất kỳ khả năng nào để thêm nhãn? – majom

+0

Cảm ơn! Tôi đã lộn xộn xung quanh với một vài nhãn, nhưng vấn đề là xếp chúng ở đúng nơi. Có một số hướng dẫn [tại đây] (http://stackoverflow.com/questions/8468472/adjusting-position-of-text-labels-in-coord-polar-histogram-in-ggplot2), [tại đây] (http://stackoverflow.com/questions/7830022/rotate-x-axis-text-in-ggplot2-when-using-coord-polar) và [tại đây] (https://medium.com/optima-blog/create-basic -sunburst-graphs-with-ggplot2-7d7484d92c61 # .979ss3fdy), nhưng tôi không thể làm cho nó hoạt động tốt. – RobertMc

Các vấn đề liên quan