主な質問
ggplot2 でヒストグラムを作成しようとしたときに、日付、ラベル、ブレークの処理が R で期待どおりに機能しない理由を理解するのに問題があります。
を探しています:
- デートの頻度のヒストグラム
- 一致するバーの下の中央に目盛り
%Y-b
形式の日付ラベル- 適切な制限; グリッド スペースの端と最も外側のバーの間の最小化された空きスペース
これを再現できるように、データをペーストビンにアップロードしました。これを行う最善の方法がわからないため、いくつかの列を作成しました。
> dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
> head(dates)
YM Date Year Month
1 2008-Apr 2008-04-01 2008 4
2 2009-Apr 2009-04-01 2009 4
3 2009-Apr 2009-04-01 2009 4
4 2009-Apr 2009-04-01 2009 4
5 2009-Apr 2009-04-01 2009 4
6 2009-Apr 2009-04-01 2009 4
これが私が試したことです:
library(ggplot2)
library(scales)
dates$converted <- as.Date(dates$Date, format="%Y-%m-%d")
ggplot(dates, aes(x=converted)) + geom_histogram()
+ opts(axis.text.x = theme_text(angle=90))
これにより、このグラフが得られます。ただし、フォーマットが必要だったので、この SO%Y-%b
に基づいて、探し回って次のことを試しました。
ggplot(dates, aes(x=converted)) + geom_histogram()
+ scale_x_date(labels=date_format("%Y-%b"),
+ breaks = "1 month")
+ opts(axis.text.x = theme_text(angle=90))
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
それは私にこのグラフを与える
- x 軸のラベル形式を修正する
- 度数分布の形が変わった (ビン幅の問題?)
- バーの下の中央に目盛りが表示されない
- xlimsも変更されました
セクションのggplot2 ドキュメントの例を実行したところ、同じ x 軸データで使用すると、目盛りを正しく分割、ラベル付け、および中央に表示するように見えます。ヒストグラムが違う理由がわかりません。scale_x_date
geom_line()
edgester と gauden からの回答に基づく更新
私は当初、gaudenの答えが私の問題を解決するのに役立つと思っていましたが、今ではもっと詳しく見て困惑しています. コードの後の 2 つの回答の結果のグラフの違いに注意してください。
両方について次のように仮定します。
library(ggplot2)
library(scales)
dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
以下の@edgesterの回答に基づいて、次のことができました:
freqs <- aggregate(dates$Date, by=list(dates$Date), FUN=length)
freqs$names <- as.Date(freqs$Group.1, format="%Y-%m-%d")
ggplot(freqs, aes(x=names, y=x)) + geom_bar(stat="identity") +
scale_x_date(breaks="1 month", labels=date_format("%Y-%b"),
limits=c(as.Date("2008-04-30"),as.Date("2012-04-01"))) +
ylab("Frequency") + xlab("Year and Month") +
theme_bw() + opts(axis.text.x = theme_text(angle=90))
gaudenの答えに基づく私の試みは次のとおりです。
dates$Date <- as.Date(dates$Date)
ggplot(dates, aes(x=Date)) + geom_histogram(binwidth=30, colour="white") +
scale_x_date(labels = date_format("%Y-%b"),
breaks = seq(min(dates$Date)-5, max(dates$Date)+5, 30),
limits = c(as.Date("2008-05-01"), as.Date("2012-04-01"))) +
ylab("Frequency") + xlab("Year and Month") +
theme_bw() + opts(axis.text.x = theme_text(angle=90))
edgester のアプローチに基づくプロット:
gauden のアプローチに基づくプロット:
次の点に注意してください。
- 2009 年 12 月と 2010 年 3 月の gauden のプロットのギャップ。データ内に の19 個のインスタンスと の 26個のインスタンス
table(dates$Date)
があることがわかります2009-12-01
2010-03-01
- edgester の陰謀は 2008 年 4 月に始まり、2012 年 5 月に終わります。これは、2008 年 4 月 1 日のデータの最小値と 2012 年 5 月 1 日の最大日付に基づいて正しいです。何らかの理由で、gauden のプロットは 2008 年 3 月に始まり、2012 年 5 月になんとか終了します。ビンを数えて月のラベルに沿って読んだ後、私の人生では、どのプロットに余分なビンがあるか、ヒストグラムのビンが欠けているかわかりません!
ここでの違いについて何か考えはありますか?別のカウントを作成する edgester の方法
関連資料
余談ですが、通行人が助けを求めるために、日付と ggplot2 に関する情報が掲載されている他の場所を次に示します。
- 人気の R ブログである Learnr.wordpress から始めました。データを POSIXct 形式にする必要があると記載されていましたが、これは誤りであり、時間を無駄にしていると思います。
- 別の学習者の投稿では、ggplot2 で時系列を再作成していますが、私の状況には実際には当てはまりませんでした。
- r-bloggers にはこの に関する投稿がありますが、時代遅れのようです。シンプルな
format=
オプションは私にとってはうまくいきませんでした。 - この SO の質問は、休憩とラベルで遊んでいます。ベクトルを連続として扱ってみ
Date
ましたが、あまりうまく機能していないと思います。同じラベルのテキストを何度も重ねているように見えたので、文字が奇妙に見えました。分布はある程度正しいですが、奇妙なブレークがあります。受け入れられた回答に基づく私の試みはそうでした(結果はこちら)。