2013-06-12 9 views
11

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

あなたが求めているのは、私にサンバーストプロットを思い出させるものです。しばらく前に、私は誰かの質問に答えました。再現可能な例もあります:http://stackoverflow.com/questions/12926779/how-to-make-a-sunburst-plot –

+4

チーズについてのグラフィックを含める場合+1。これの高解像度を得ることはできますか? –

+2

@ SimonO101:このグラフィックは次の場所にあります:http://www.fastcodesign.com/1672767/infographic-how-to-tell-the-difference-between-66-varieties-of-cheese#1 – majom

答えて

2

例えば、データセットを使用して質問に答えるために容易になるだろう。しかし、ggplot()とgeom_bar()を追加して+ coord_polar()を追加するとスタックされたbarchartを描画することをお勧めします。

2

確かに可能ですが、あなたのために準備が整っている機能はありません。

plotxパッケージのfloating.pie関数から開始し、最も詳細な(外側のリング)円グラフを作成し、その小さな円グラフの上に、より小さな直径のハード情報とソフト情報をプロットします外リングはまだ表示されますが、新しいリングは中心をカバーします。最後に、動物の情報を中心に別の小さな円グラフを中央で行います。

実際に外側の周りの画像が必要な場合は、rasterImageの機能を見てください。

また、各セクションのポリゴン座標を計算してプロットし、適切なループと関数でラップすることで、合理的になります。

また、スタックバーと極座標でggplot2を使用すると、コメントに記載されているように、うまくいく可能性があります。

4

このグラフはawesomeです。
まあ、私はこれまでに、少しナッツに行くようになった。要するに、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) 

これはあなたの偉大な小さなインタラクティブ画像(ここでは、対話型ではない、ただのスナップショット)を与える:

enter image description here

ggplot2方法面倒であり、画像に正しく注釈を付ける方法を理解していないが、誰かがこのコードを作成してそれを行うことができるかもしれない。

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

3つの層があります。

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

これは私たちに与えます:

enter image description here

をまあ、それは私が得たほど近いです。 Rでそのグラフを作り直すことができる誰にも重大な帽子を放つ!

+0

Good job!ラベルを追加する可能性はありますか? – majom

+0

ありがとう!私はいくつかのラベルを使いこなしましたが、問題は正しい場所に並べています。いくつかのガイド[ここ](http://stackoverflow.com/questions/8468472/adjusting-position-of-text-labels-in-coord-polar-histogram-in-ggplot2)、[here](http: /stackoverflow.com/questions/7830022/rotate-x-axis-text-in-ggplot2-when-using-coord-polar)、[ここ](https://medium.com/optima-blog/create-basic) -sunburst-graphs-with-ggplot2-7d7484d92c61#.979ss3fdy)、私はそれをうまく動作させることができませんでした。 – RobertMc