16

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

4 に答える 4

5

そのグラフは素晴らしいです。
さて、私は少し気が狂い始める前にここまで来ました。要するに、迅速で非 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)

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

これにより、次のことがわかります。

ここに画像の説明を入力

まあ、それは私が得た限りです。Rでそのグラフを再現できる人には本当に脱帽です!!

于 2016-08-14T19:33:01.200 に答える
3

ggsunburst パッケージを使用するとかなり近づくことができます

# using your data
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))

# add special attribute "dist" using "->" as sep, this will increase the size of the terminal nodes to make space for the cheese names
df$Name <- paste(df$Name, "dist:3", sep="->")

# save data.frame into csv without row and col names
write.table(df, file = 'df.csv', sep = ",", col.names = F, row.names = F)

# install ggsunburst package
if (!require("ggplot2")) install.packages("ggplot2")
if (!require("rPython")) install.packages("rPython")
install.packages("http://genome.crg.es/~didac/ggsunburst/ggsunburst_0.0.9.tar.gz", repos=NULL, type="source")
library(ggsunburst)

# generate data structure from csv and plot
sb <- sunburst_data('df.csv', type = "lineage", sep=",")
sunburst(sb, node_labels = T, node_labels.min = 15, rects.fill.aes = "name") + 
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"), guide = F) +
theme(panel.background = element_rect(fill = "black"))

ここに画像の説明を入力

于 2018-05-05T09:31:34.973 に答える
2

それは確かに可能ですが、それを実行する準備ができている既製の機能はありません。

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

外側のエッジの周りの画像が本当に必要な場合は、rasterImage関数を見てください。

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

また、コメントで言及されているように、積み上げ棒グラフと極座標で ggplot2 を使用すると、うまくいくかもしれません。

于 2013-06-12T18:11:00.167 に答える
2

データセットの例を使用すると、質問に簡単に答えることができます。ただし、ggplot() と geom_bar() を使用して積み上げ棒グラフを描画し、+ coord_polar() を追加することをお勧めします。

于 2013-06-12T17:09:42.317 に答える