2016-06-20 3 views
0

私は注意してこれに取り組んでいるが、円グラフは存在なしデータを表示するうえで良い方法だと思う。グループごとに等しい面積とラベルの円グラフを作成する

以下に、4つの異なる病原体(AAA:DDD)について10人が2値データ(0または1)を有する代表的なデータを作成する。私は、ggplotを使用する前に、データを幅広く長くしています。

set.seed(123) 
dat <- data.frame(ID = as.factor(seq(1,10,1)), 
      AAA = as.factor(sample(c(0,1), 10, replace = T)), 
      BBB = as.factor(sample(c(0,1), 10, replace = T)), 
      CCC = as.factor(sample(c(0,1), 10, replace = T)), 
      DDD = as.factor(sample(c(0,1), 10, replace = T))) 
head(dat) 

library(tidyr) 
datLong <- gather(dat, Disease, YesNo, -ID) 
head(datLong) 

各個人(たとえば、各レベルのID)について、私は円グラフを作成したいと思います。すべての人にとって、円グラフは同じ形と形状を持ちます。私は円グラフを4つの病原体(AAA:DDD)を表す4つのセクションに等しく分割したい。動物に病原体がある場合(YesNo == 1)、パイのスライスが塗りつぶされます。個々のドースに病原体がない場合(YesNo == 0など)、パイスライスは存在しますが、塗りつぶされません。

この目的のために、私は病原体が見つからなければNAである新しい列(New)を作った。

datLong$New <- ifelse(datLong$YesNo == 0, NA , as.character(datLong$Disease)) 

私はまた、各円スライスにラベルを付ける位置(POS)のカラムを作成しました。以下のコードを使用して

datLong$Pos <- ifelse(datLong$Disease == "AAA", 0.5, 
         ifelse(datLong$Disease == "BBB", 1.5, 
         ifelse(datLong$Disease == "CCC", 2.5, 
         ifelse(datLong$Disease == "DDD", 3.5, NA)))) 

、私は、ほとんどが正しいプロットを行うことができます。しかしながら、病原体がNAである場合、それは包含されるのではなくスキップされるが、充填されないので、ラベルとの不一致が生じる。

library(ggplot2) 

ggplot(datLong, aes(x = "", color = New, fill = New)) + 
geom_bar(width = 1, color = "black")+ 
geom_text(aes(x= factor(1), y=Pos, label = New), size= 8) + 
facet_wrap(~ID) + 
    scale_fill_brewer(palette="Dark2") + 
    scale_color_brewer(palette="Dark2") + 
    theme(axis.text.x=element_blank(), 
     panel.grid=element_blank()) + 
guides(colour=FALSE) + guides(fill=FALSE) + 
coord_polar(theta = "y") 

時計回りに、それぞれの病原体(存在するか否かにかかわらず)の位置をアルファベット順に修正したい。

ありがとうございます、ご提案や修正があります!

+0

@aosmithプロットする前にデータセットを要約すると、病気とIDのレベルごとに1つの値しか持たないことがわかります。少しのコードを追加したり、答えとして投稿してもらえますか?前もって感謝します! –

答えて

1

は、私はあなたが今、美的group = disease

プロット機能を追加することによって、非常に簡単にこの問題を解決本当にない、むしろ、ネストされたifelseを使用するよりも、この

ggplot(datLong, aes(x = "", color = New, fill = New, group = Disease)) + 
    geom_bar(width = 1, color = "black")+ 
    geom_text(aes(x= factor(1), y = Pos, label = New), size = 8) + 
    facet_wrap(~ID) + 
    scale_fill_brewer(palette = "Dark2") + 
    scale_color_brewer(palette = "Dark2") + 
    theme(axis.text.x = element_blank(), 
     panel.grid = element_blank()) + 
    guides(colour = FALSE) + guides(fill = FALSE) + 
    coord_polar(theta = "y") 

もうひとつのように見えることができると思いますサブセットを使用して同じ結果を得ることができます。

seq(0.5, 3.5, 1)[as.factor(datLong$Disease)] 

また、plyr::mapvalues

+0

パーフェクト。追加と提案をありがとう! –

関連する問題