2017-06-17 30 views
1

ggplot2でグラフのこのキングを作成する必要があります.Geom_bar、geom_histogramで多くのことを成功させました。 アドバイスはありますか?ggplot2の時系列クラスタリング

よろしく

enter image description here

dataset <- data.frame(
     day=seq(from=as.Date("2010-01-01"), to=as.Date("2010-03-01"), by = 1), 
     cluster=factor(sample(x=1:3,size = 60,replace = TRUE)) 
    ) 

答えて

1

あなたはgeom_rectを探している、とggplot2問題でいつものように、それは変装し データ操作の問題です。あなたはgeom_rectに供給することができ、データフレームを作りたいので、あなたが必要とするxminxmax ...

私はあなたが、あなたが実際のデータに適合させる必要があるかもしれません使用したサンプルデータに基づいて、ここにいくつかの仮定を作ってるんですあなたが持っている。

dataset %>% 
    mutate(step = cumsum(lag(cluster, 1, default = TRUE) != cluster)) %>% 
    head 
     day cluster step 
1 2010-01-01  1 0 
2 2010-01-02  3 1 
3 2010-01-03  3 1 
4 2010-01-04  2 2 
5 2010-01-05  3 3 
6 2010-01-06  2 4 

その後group_byこのstep変数:

dataset %>% 
    mutate(step = cumsum(lag(cluster, 1, default = TRUE) != cluster)) %>% 
    group_by(step) %>% 
    summarise(cluster = first(cluster), date_min = min(day)) %>% 
    mutate(date_max = lag(date_min, 1)) %>% 
    select(-step) %>% 
    ggplot() + geom_rect(aes(xmin=date_min, xmax = date_max, ymin=0, ymax=1, fill = cluster, col = cluster)) 

キーを使用すると、cluster列を変更するたびにインクリメントstep変数です。残りは古典的なdplyrであり、次にggplot2です。

私はあなたが望むことを理解しています。残りは化粧品だけです。

enter image description here

2

あなたはまた、geom_tileを使用して、データセットを変換することができませんでした:

ggplot(dataset) + geom_tile(aes(x=day, y = 1,fill=cluster)) + expand_limits(y=c(-2,4)) + 
    theme(axis.title.y=element_blank(), 
    axis.text.y=element_blank()) 

enter image description here

がバーの太さを変更するには、expand_limits()を変えることができます。

+0

素晴らしい。私はいつもgeom_tileについて忘れています:-) –

+0

@RomainFrancois、ありがとう!大量のデータがある場合は、 'geom_tile'のように毎日の値をプロットするのではなく、連続したグループを結合するので、あなたのソリューションがより望ましいと感じます。 おそらく少ないものからpdfのようなものでレンダリングを改善するでしょうプロットに追加されます。 –

関連する問題