r - 複数 - ggplot2 棒グラフ




日付を理解し、Rのggplot2でヒストグラムをプロットする (2)

... + Geom_histogram(binwidth = 30、color = "white")+ ... 30の値をaに変更すると、次のようなエラーグラフが表示されます。 20より小さい値、例えば10、あなたはすべての周波数を得るでしょう。

統計では、プレゼンテーションよりも重要なのはプレゼンテーションよりも重要です。非常にきれいな写真ではありますが、エラーがあります。

主な質問

ggplot2でヒストグラムを作成しようとしたときにRで期待したように、日付、ラベル、ブレークの処理がうまくいかない理由を理解している問題があります。

を探しています:

  • 私の日付の頻度のヒストグラム
  • 一致するバーの中央にティックマーク
  • %Yb形式の日付ラベル
  • 適切な制限。 格子空間のエッジと最外のバーとの間の最小限の空きスペース

私はこのデータを再現可能にするために私のデータをpastebinアップロードしました。 私はこれを行うための最善の方法がわからないので、いくつかの列を作成しました:

> 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))

このグラフが得られます 。 私は%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軸のラベル形式を修正する
  • 度数分布が変化しました(binwidthの問題?)
  • 目盛りが棒の中央に表示されない
  • xlimsも同様に変更されました

私はscale_x_dateセクションのggplot2ドキュメントの例を調べましたscale_x_date geom_line()は、同じx軸データを使用すると、ダニを正しく折って、ラベル付けし、中央に配置するように見えます。 なぜヒストグラムが違うのか分かりません。

edgestersおよび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))

ガウデンの答えに基づいた私の試みはここにあります:

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))

エッジターのアプローチに基づくプロット:

ガウデンのアプローチに基づくプロット:

次の点に注意してください。

  • 2009年12月と2010年3月のGaudenのプロットのギャップ。 table(dates$Date)は、 2009-12-01 19のインスタンスと2010-03-01 26のインスタンスがデータに含まれていることを示しています
  • エッジターのプロットは2008年から4月に始まり、2012年から5月に終了します。 これは、2008年4月1日のデータの最小値と2012-05-01の最大日付に基づいて正しいです。 何らかの理由で、ガーデンの計画は2008年から3月に始まり、何とか2012年から5月に終わることがあります。 ビンを数えて月ラベルに沿って読んだら、私の人生の中で、どのプロットに余分があるのか​​、ヒストグラムのビンがないのか分かりません!

ここの相違についての考えは? edgesterの別個のカウントを作成する方法

関連する参考文献

さて、ここでは日付についての情報と通行人のためのggplot2という別の場所がヘルプを探しています:

  • 人気のRブログ、learnr.wordpressでここから始まりました。 私は自分のデータをPOSIXct形式にする必要があると述べました。私は今は間違っていると思って自分の時間を無駄にしています。
  • 別の学習者の投稿はggplot2で時系列を再現しますが、私の状況には実際には適用できませんでした。
  • r-bloggersにはこれに関する投稿がありますが、古くなっています。 シンプルなformat=オプションは私のためには機能しませんでした。
  • このSOの質問は、休憩やラベルで遊んでいます。 私はDateベクトルを連続的に扱うことを試みたが、うまく働いたとは思わない。 同じラベルのテキストを重ねて重ねて表示するように見えたので、文字は奇妙に見えました。 分布は正しかったですが、奇妙な休憩があります。 受け入れられた答えに基づく私の試みはそうだった( ここの結果 )。

更新

バージョン2:Dateクラスの使用

ラベルを整列させ、プロットの限界を設定する例を更新します。 私はまた、 as.Dateが一貫して使用されると実際に動作することを実証しています(実際には私の前の例よりも実際にはデータに適しているでしょう)。

ターゲットプロットv2

コードv2

そして、(やや過度に)コメントされたコードはここにあります:

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

dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
dates$Date <- as.Date(dates$Date)

# convert the Date to its numeric equivalent
# Note that Dates are stored as number of days internally,
# hence it is easy to convert back and forth mentally
dates$num <- as.numeric(dates$Date)

bin <- 60 # used for aggregating the data and aligning the labels

p <- ggplot(dates, aes(num, ..count..))
p <- p + geom_histogram(binwidth = bin, colour="white")

# The numeric data is treated as a date,
# breaks are set to an interval equal to the binwidth,
# and a set of labels is generated and adjusted in order to align with bars
p <- p + scale_x_date(breaks = seq(min(dates$num)-20, # change -20 term to taste
                                   max(dates$num), 
                                   bin),
                      labels = date_format("%Y-%b"),
                      limits = c(as.Date("2009-01-01"), 
                                 as.Date("2011-12-01")))

# from here, format at ease
p <- p + theme_bw() + xlab(NULL) + opts(axis.text.x  = theme_text(angle=45,
                                                                  hjust = 1,
                                                                  vjust = 1))
p

バージョン1:POSIXctの使用

私は、 ggplot2すべてを行うソリューションを試してみましょう。集計なしで描画し、2009年の初めから2011年末までのx軸の制限を設定します。

ターゲットプロットv1

コードv1

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

dates <- read.csv("http://pastebin.com/raw.php?i=sDzXKFxJ", sep=",", header=T)
dates$Date <- as.POSIXct(dates$Date)

p <- ggplot(dates, aes(Date, ..count..)) + 
    geom_histogram() +
    theme_bw() + xlab(NULL) +
    scale_x_datetime(breaks = date_breaks("3 months"),
                     labels = date_format("%Y-%b"),
                     limits = c(as.POSIXct("2009-01-01"), 
                                as.POSIXct("2011-12-01")) )

p

もちろん、軸上のラベルオプションを使って演奏することもできますが、これはプロットパッケージ内のきれいな短いルーチンでプロットを四捨五入することです。





histogram