67

主な質問

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_dategeom_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-012010-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ましたが、あまりうまく機能していないと思います。同じラベルのテキストを何度も重ねているように見えたので、文字が奇妙に見えました。分布はある程度正しいですが、奇妙なブレークがあります。受け入れられた回答に基づく私の試みはそうでした(結果はこちら)。
4

4 に答える 4

36

アップデート

バージョン 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

ggplot2 で制限を設定してプロットする

コード 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

もちろん、軸のラベル オプションをいじることもできますが、これは、プロット パッケージのクリーンで短いルーチンでプロットを締めくくるためです。

于 2012-05-27T20:18:50.937 に答える
5

重要なことは、ggplot の外で周波数計算を行う必要があることだと思います。geom_bar(stat="identity") で aggregate() を使用して、並べ替えられた要素を含まないヒストグラムを取得します。コード例を次に示します。

require(ggplot2)

# scales goes with ggplot and adds the needed scale* functions
require(scales)

# need the month() function for the extra plot
require(lubridate)

# original data
#df<-read.csv("http://pastebin.com/download.php?i=sDzXKFxJ", header=TRUE)

# simulated data
years=sample(seq(2008,2012),681,replace=TRUE,prob=c(0.0176211453744493,0.302496328928047,0.323054331864905,0.237885462555066,0.118942731277533))
months=sample(seq(1,12),681,replace=TRUE)
my.dates=as.Date(paste(years,months,01,sep="-"))
df=data.frame(YM=strftime(my.dates, format="%Y-%b"),Date=my.dates,Year=years,Month=months)
# end simulated data creation

# sort the list just to make it pretty. It makes no difference in the final results
df=df[do.call(order, df[c("Date")]), ]

# add a dummy column for clarity in processing
df$Count=1

# compute the frequencies ourselves
freqs=aggregate(Count ~ Year + Month, data=df, FUN=length)

# rebuild the Date column so that ggplot works
freqs$Date=as.Date(paste(freqs$Year,freqs$Month,"01",sep="-"))

# I set the breaks for 2 months to reduce clutter
g<-ggplot(data=freqs,aes(x=Date,y=Count))+ geom_bar(stat="identity") + scale_x_date(labels=date_format("%Y-%b"),breaks="2 months") + theme_bw() + opts(axis.text.x = theme_text(angle=90))
print(g)

# don't overwrite the previous graph
dev.new()

# just for grins, here is a faceted view by year
# Add the Month.name factor to have things work. month() keeps the factor levels in order
freqs$Month.name=month(freqs$Date,label=TRUE, abbr=TRUE)
g2<-ggplot(data=freqs,aes(x=Month.name,y=Count))+ geom_bar(stat="identity") + facet_grid(Year~.) + theme_bw()
print(g2)
于 2012-05-27T15:57:14.270 に答える
0

「Gauden のアプローチに基づくプロット」というタイトルの下にあるエラー グラフは、binwidth パラメータによるものです: ... + Geom_histogram (binwidth = 30, color = "white") + ... 30 の値を10 などの 20 未満の値を指定すると、すべての周波数が得られます。

統計では、プレゼンテーションよりも値が重要です。非常にきれいな画像ではなく、エラーが含まれています。

于 2015-08-18T22:38:17.277 に答える