2016-05-21 17 views
1

私はggplot2で時系列をプロットしようとしています。私は次のようなデータ構造を使用していますと仮定(2500×20のマトリックス):私が見つけた何変数を経時的にプロットする方法

ggplot(aa, aes(x=time,y=value,colour=id,group=id)) + 
    geom_line() 

がある:今すぐ

set.seed(21) 

n <- 2500 
x <- matrix(replicate(20,cumsum(sample(c(-1, 1), n, TRUE))),nrow = 2500,ncol=20) 

aa <- x 

rnames <- seq(as.Date("2010-01-01"), length=dim(aa)[1], by="1 month") - 1 
rownames(aa) <- format(as.POSIXlt(rnames, format = "%Y-%m-%d"), format = "%d.%m.%Y") 
colnames(aa) <- paste0("aa",1:k) 

library("ggplot2") 
library("reshape2") 
library("scales") 

aa <- melt(aa, id.vars = rownames(aa)) 
names(aa) <- c("time","id","value") 

次のコマンドの時系列をプロットするには、奇妙な探してx軸を生成します今までのフォーマットを変更することができます:

aa$time <- as.Date(aa$time, "%d.%m.%Y") 
ggplot(aa, aes(x=time,y=value,colour=id,group=id)) + 
    geom_line() 

これは良く見えますが、まだ良いグラフではありません。私の質問は、特にx軸の書式を制御する方法です。 Date形式である必要がありますか?どちらの場合に表示される休憩(年)の量を制御するにはどうすればよいですか? Dateを使用しない場合は必須と思われます。さもなければ、ggplot2は私が信じている休憩に何か有益なデフォルトを使います。 たとえば、次のコマンドが動作しない:あなたが得た場合

aa$time <- as.Date(aa$time, "%d.%m.%Y") 
ggplot(aa, aes(x=time,y=value,colour=id,group=id)) + 
    geom_line() + 
    scale_x_continuous(breaks=pretty_breaks(n=10)) 

をまた、グラフの全体的な外観を向上させるためにどのように任意のヒントが(例えば、行は私見inpreciseビットを見て)を追加して自由に感じます。

+0

あなたはおそらく、サンプルの入力データと出力期待して、最小限の例を投稿することができますか? '?scale_date'を試してみて、おそらく' scale_x_date'の中に? – Gopala

+0

@Gopalaどういう意味ですか?私は上記のMWEを提供しましたか?まあ、私が 'ggplot(aa、aes(x = time、y = value、color = id、group = id))+ geom_line()'を使用した場合、軸の開始点は全く表示されません。日付形式なし。私は、x軸を適切に制御する方法、またそこに時間がない代わりに別の変数を使用する方法についても不思議に思っていました。しかし、私はこの特定のケースでは、日付形式で作業するのが最も簡単だと思います。 – user3032689

+0

申し訳ありませんが、あなたが提供していないというわけではありませんでした。あなたの問題/質問があなたが提供したコードよりずっと簡単なようです。私はさらに小さな例で十分であると思っていた。うん、日付を使って作業し、 'scale_date'を使うのは良いことです。詳細な説明はありがとうございます。 – Gopala

答えて

1

@Gopalaのように、scale_x_dateで日付を書式設定できます。次に、説明のためにデータの短縮版を使用する例を示します。以下のコードで

library(dplyr) 

# Dates need to be in date format 
aa$time <- as.Date(aa$time, "%d.%m.%Y") 

# Shorten data to speed rendering 
aa = aa %>% group_by(id) %>% slice(1:200) 

、我々はdate_breaks="6 months"で半年ごとの日付の区切りを得ます。これはおそらくあなたがこの場合に望むより多くの休憩であり、説明のためだけです。 1月/ 7月、2月/ 8月などの休憩を決定する場合は、coord_cartesianを使用し、開始日をxlimexpand=FALSEに設定して、ggplotが開始日を埋め込まないようにする必要があります。しかし、expand=FALSEを設定すると、y軸に余白がないので、手動で埋め込みをscale_y_continuousで追加する必要があります(x軸とy軸に別々にexpandを設定することができますが、AFAIK不可能です)。改行はしっかりとパックされているので、themeステートメントを使用して、ラベルを90度回転させます。

ggplot(aa, aes(x=time,y=value,colour=id,group=id)) + 
    geom_line(show.legend=FALSE) + 
    scale_y_continuous(limits=c(min(aa$value) - 2, max(aa$value) + 1)) + 
    scale_x_date(date_breaks="6 months", 
       labels=function(d) format(d, "%b %Y")) + 
    coord_cartesian(xlim=c(as.Date("2009-07-01"), max(aa$time) + 182), 
        expand=FALSE) + 
    theme_bw() + 
    theme(axis.text.x=element_text(angle=-90, vjust=0.5)) 

enter image description here

+0

非常に役立ちます! – user3032689

関連する問題