2017-08-03 6 views
2

以下のガイドはggplot Donut chartのように表示されています。後で地図上に置くつもりで、小さなゲージ、ラベルのついたドーナツを描こうとしています。ggplot2:ドーナツ、if_elseでコンディショナルカラーフィルを行う方法

値が一定のしきい値に達すると、ドーナツの塗りつぶしが赤に変わります。 if_elseで達成することは可能ですか(それは最も自然だろうが動作しません)。

library(tidyverse) 

df <- tibble(ID=c("A","B"),value=c(0.7,0.5)) %>% gather(key = cat,value = val,-ID) 

ggplot(df, aes(x = val, fill = cat)) + scale_fill_manual(aes,values = c("red", "yellow"))+ 
    geom_bar(position="fill") + coord_polar(start = 0, theta="y") 

ymax <- max(df$val) 
ymin <- min(df$val) 

p2 = ggplot(df, aes(fill=cat, y=0, ymax=1, ymin=val, xmax=4, xmin=3)) + 
    geom_rect(colour="black",stat = "identity") + 
    scale_fill_manual(values = if_else (val > 0.5, "red", "black")) + 
    geom_text(aes(x=0, y=0, label= scales::percent (1-val)), position = position_dodge(0.9))+ 
    coord_polar(theta="y") + 
    xlim(c(0, 4)) + 
    theme_void() + 
    theme(legend.position="none") + 
    scale_y_reverse() + facet_wrap(facets = "ID") 

スケール他にあれば....この部分は動作しません=マニュアル値を記入し、エラーが言う:if_elseでエラーが発生しました(val>は0.5、 "赤"、 "黒"):オブジェクトのヴァル」ではありません見つかりました。それは私のエラーですか、あるいは他の解決策がありますか?

私のコードが最適ではないこともわかっていますが、最初は、より多くの変数がプロットに含まれるのを待っていましたが、他の変数の上に1つの変数をスタックできませんでした。これで1つの変数で完了の割合を示すことができます。私は自分のコードが目的のために冗長であることを実感します。あなたは私を助けることができます?

+1

'ifelse()'を試しましたか? 'if_else'はR関数ではありません。 – BLT

+0

@BLT 'if_else'はdplyr関数です。 'ifelse'に似ていますが、いくつかの問題が修正されています。 –

+0

@NicolasPinto私は古いバージョンを持っているので、私が検索したときにそれは上がっていませんでした。ありがとう! – BLT

答えて

3

色の問題に対する解決策は、最初のデータで変数を作成し、プロットの色をマッピングすることを使用することである。

df <- tibble(ID=c("A","B"),value=c(0.7,0.5)) %>% gather(key = cat,value = val,-ID) %>% 
    mutate(color = if_else(val > 0.5, "red", "black")) 

p2 = ggplot(df, aes(fill=color, y=0, ymax=1, ymin=val, xmax=4, xmin=3)) + 
    geom_rect(colour="black",stat = "identity") + 
    scale_fill_manual(values = c(`red` = "red", `black` = "black")) + 
    geom_text(aes(x=0, y=0, label= scales::percent (1-val)), position = position_dodge(0.9))+ 
    coord_polar(theta="y") + 
    xlim(c(0, 4)) + 
    theme_void() + 
    theme(legend.position="none") + 
    scale_y_reverse() + facet_wrap(facets = "ID") 

結果は次のようになります

enter image description here

関連する問題