2016-04-19 3 views
0

ggvisを使用して定期的にレビューするデータのグラフを作成する関数を作成しました。この場合、最終的なグループ「全体」は上書きされ、デフォルトの代わりに幅3の黒線として表示されます。残念ながら、デフォルトを上書きするために取った手順は、凡例には表示されません。私はこの仕事をするために何をすべきか確信しています。私は特にadd_legendを呼び出そうとしましたが、うまくいきませんでした。ggvis凡例をグラフに一致させるにはどうすればよいですか?

S.O. Line Graph

(また、いくつかのランダムなデータで)これが生成するのに使用されるコード:

CAL_DATE = seq(as.Date("10/1/2015", format = "%m/%d/%Y"), 
       as.Date("3/31/2016", format = "%m/%d/%Y"), by = 1) 
CAL_DATE = as.POSIXct(CAL_DATE) 
a = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE), 
             5, 500),0), CT_DS = rep("A",length(CAL_DATE)))) 
b = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE), 
             4, 540),0), CT_DS = rep("B", length(CAL_DATE)))) 
Overall = data.frame(cbind(ma_AHT = round(rweibull(length(CAL_DATE), 
              10, 475),0), CT_DS = rep("Overall", length(CAL_DATE)))) 
a$CAL_DATE = CAL_DATE 
b$CAL_DATE = CAL_DATE 
Overall$CAL_DATE = CAL_DATE 

data = rbind(a, b, Overall) 

plot_ma = function(x){ 
     x %>% 
       group_by(CT_DS) %>% 
       ggvis(~CAL_DATE, ~ma_AHT, stroke = ~CT_DS) %>% 
       layer_lines() %>% 
       filter(CT_DS == "Overall") %>% 
       layer_lines(stroke := "black", strokeWidth := 3) %>% 
       set_options(renderer = "canvas") %>% 
       add_legend("stroke", title = "~ CT") %>% 
       add_axis("x", title = "Date", title_offset = 60, 
         properties = axis_props(
           labels = list(
             angle = -50, 
             align = "right", 
             baseline = "middle" 
           ))) %>% 
       add_axis("y", title = "M.A. AHT (sec)") 
} 
plot_ma(data) 

以下のようなものを生成する必要があります。私の唯一の懸念は、伝説のショーを全体的に黒くする方法です。

enter image description here

+0

あなたは小さな例のデータセットを追加することはできますか? – aosmith

+1

'Overall'が常に最後になる場合は' range_nominal'で 'range'を使って色を定義できると思います。あなたの単純な例では、 'scale_nominal(" stroke "、range = c(" blue "、" orange "、" black "))'のようなものになります。グループを増やすには、色数のベクトルを作成するか、グループの数だけサンプルから色を引いて、最後に「黒」を追加します。 – aosmith

+0

グループの数は、データセットによって大きく異なる場合があります。サンプルから色を引き出す方法について、より多くの洞察を教えてください。私はggvisオブジェクトの中を調べて、どこにあるのかを見つけましたが、成功しませんでした。 –

答えて

1

scale_nominalを使用してrangeを提供するあなたは、グラフィックや伝説の両方に色を設定することができます。

簡単な例では、プロットコードの末尾に scale_nominal("stroke", range = c("blue", "orange", "black")) を追加するのと同じくらい簡単です。

グループの数が異なる可能性があります。しかし、Overallグループのうち、最後のグループは常に最後になります(あるいは最後にfactorに設定されます)。上記と同様のものを使用して、それをあなたの関数に含めることができます。この場合、すべてのグループに十分な色を持つような(そして黒を含まない)カラーパレットを作成する必要があります。

ここでは、Cookbook for Rで与えられたパレットの1つを8色展開します。

cbPalette = c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7") 

我々は、グループ化因子のレベルの数を使用して、特定のデータセットのパレットから必要な色の数を引き出すことができます。最後の1つは常に黒であるため、必要な色数から1を引いた値です。

ここではグループの数を計算するための一つの方法だが、この情報はcbPaletteから「レベルの数マイナス1」色に最初の1を引き出すために使用することができます着色する必要があるマイナス1

ncol = nlevels(data[["CT_DS"]]) - 1 

pal = cbPalette[1:ncol] 

これは、ベクトルの終わりまでに"black"を追加、scale_nominalrange引数に使用することができます。

scale_nominal("stroke", range = c(pal, "black"))

このプロセスは簡単にあなたの機能に追加されます。

plot_ma = function(x){ 
    ncol = nlevels(x[["CT_DS"]]) - 1 
    pal = cbPalette[1:ncol] 
    x %>% 
     group_by(CT_DS) %>% 
     ggvis(~CAL_DATE, ~ma_AHT, stroke = ~CT_DS) %>% 
     layer_lines() %>% 
     filter(CT_DS == "Overall") %>% 
     layer_lines(stroke := "black", strokeWidth := 3) %>% 
     set_options(renderer = "canvas") %>% 
     add_legend("stroke", title = "~ CT") %>% 
     add_axis("x", title = "Date", title_offset = 60, 
       properties = axis_props(
        labels = list(
         angle = -50, 
         align = "right", 
         baseline = "middle" 
        ))) %>% 
     add_axis("y", title = "M.A. AHT (sec)") %>% 
     scale_nominal("stroke", range = c(pal, "black")) 
} 
plot_ma(data) 

enter image description here

+0

@aosmithと同じように動作します。ありがとうございました。 –