2016-06-11 5 views
2

を破るcoord_equalん私は、次のデータのうち、ヒートマップを作成しようとしています:はなぜヒートマップ

> head(myData.aggregated) 
      datetime value  date    time 
1 2016-03-31 14:19:00  3 2016-03-31 2016-06-11 14:19:00 
2 2016-03-31 14:49:00 69 2016-03-31 2016-06-11 14:49:00 
3 2016-03-31 15:49:00  5 2016-03-31 2016-06-11 15:49:00 
4 2016-03-31 16:19:00  7 2016-03-31 2016-06-11 16:19:00 
5 2016-03-31 17:49:00  2 2016-03-31 2016-06-11 17:49:00 
6 2016-03-31 18:19:00  7 2016-03-31 2016-06-11 18:19:00 

> tail(myData.aggregated) 
       datetime value  date    time 
90 2016-04-06 13:19:00  1 2016-04-06 2016-06-11 13:19:00 
91 2016-04-06 13:49:00 25 2016-04-06 2016-06-11 13:49:00 
92 2016-04-06 14:19:00  7 2016-04-06 2016-06-11 14:19:00 
93 2016-04-06 14:49:00  1 2016-04-06 2016-06-11 14:49:00 
94 2016-04-06 22:19:00  3 2016-04-06 2016-06-11 22:19:00 
95 2016-04-06 22:49:00 14 2016-04-06 2016-06-11 22:49:00 

そして、次のコマンドggplot2。

ggplot(myData.aggregated, aes(x = time, y = date, fill = scale(value))) + geom_tile() + coord_equal() 

はできるだけ早く私は()coord_equal追加すると、結果は空白のグラフです。誰かが私になぜこれが起こっているのか、どうやって解決できるのか説明することはできますか?私の目標は、各30分の間隔の正方形のタイルでヒートマップを取得することです。

アップデート1:

> dput(head(myData.aggregated)) 
structure(list(datetime = structure(c(1459426740, 1459428540, 
1459432140, 1459433940, 1459439340, 1459441140), class = c("POSIXct", 
"POSIXt"), tzone = ""), value = c(3L, 69L, 5L, 7L, 2L, 7L), date = structure(c(16891, 
16891, 16891, 16891, 16891, 16891), class = "Date"), time = structure(c(1465647540, 
1465649340, 1465652940, 1465654740, 1465660140, 1465661940), class = c("POSIXct", 
"POSIXt"), tzone = "")), .Names = c("datetime", "value", "date", 
"time"), row.names = c(NA, 6L), class = "data.frame") 
+0

'dput(myDataSample)'の出力にしてください。myDataSampleはコードで実行したときに同じ問題を示すデータフレームのサンプルです。 – eipi10

+0

'scale(x)'の 'x'とは何ですか? 'scale(value)'を意味しましたか? – eipi10

+0

正確には、私は 'scale(value)' – Oliver

答えて

6

TL; DRは: y軸は、6つのユニットにまたがるx軸は数十オブ数千単位に及びます。 coord_equalを追加すると、y軸がx軸の物理的な長さのおよそ1/10,000に縮小され、効果的にプロット領域が消えます。 date列(y軸)は日数で、time列(x軸)は秒単位ですが、両方ともggplotによって無単位数として扱われます。あなたは秒単位でy軸を指定することもできますが、それでも少なくとも6:1の望ましくない縦横比のプロットが得られます。コードと追加の詳細については、以下を参照してください。


はここで何が起こっているのかです:dateDate形式であるため、6日間の範囲で、日中に建てています。 timePOSIXctフォーマットで、秒単位で指定されます(日付に関係なく時間に関係しているため)。数十万秒(最大86,400秒まで、または1日の長さ)。

Dateとの形式の値は、それぞれDatePOSIXctのクラスが添付された数値です。結果として、coord_equalを追加すると、y軸上の1つの単位はx軸上で1単位と同じ物理的距離を占めます.ggplot(明らかに)は数値の大きさに基づいてcoord_equalを計算します。日時クラス。しかし、y軸全体は6ユニットにわたっており、x軸は数万ユニットに及んでいます。したがって、coord_equalが必要な場合は、y:xのアスペクト比が1:10,000程度に押し縮まり、実用的な目的でプロットが消えるようになります。

x軸とy軸の両方を秒単位で指定できますが、その場合でもy軸は範囲(6日)のx軸(最大1日)の6倍になります。 :xアスペクト比が少なくとも6:1であり、coord_equalであり、これは1:10,000よりも良好であるが、依然としてあまり実用的ではない。ここ

は偽データとの例を示します。上記のコードで

# Fake data 
set.seed(4959) 
dat = data.frame(datetime=seq(as.POSIXct("2016-03-31"), as.POSIXct("2016-04-06"), by="hour")) 
dat$value = sample(1:50, nrow(dat), replace=TRUE) 

ggplot(dat, 
     aes(x = as.POSIXct(as.numeric(datetime) %% 86400, 
          tz="UTC", origin=as.Date("2016-01-01")), 
      y = as.POSIXct(as.Date(datetime)), 
      fill = scale(value))) + 
    geom_tile() + 
    labs(y="Date", x="Time") + 
    scale_x_datetime(date_labels="%H:%m") + 
    coord_equal() 

、我々は最初の日の時間を排除Date形式に変換し、変換しPOSIXctに戻す変換のy値を作成します単位は秒ですが、指定された日付のすべてのdatetime値に対して、その日の真夜中に等しい時間があります。 xの値を作成するには

、私たちは真夜中の後秒で一日の時間が欲しいので、我々は86400で除算した後datetimeの数値の残りの部分(1日の秒数)を計算します。tz=UTCは時間を正しく取るために必要であり、エラーなしで機能を実行させるにはorigin(任意の日付にすることができますが、時間帯が必要です)が必要です。

以下は、coord_equalの有無を示すプロットです。 coord_equalでは、1日(深夜から深夜まで)にまたがるx軸は、y軸上で1日と同じ長さになります。これは、秒単位でyとxの両方の値を指定したためです。しかし、y軸が数日にわたり、x軸が1日に及ぶ限り、coord_equalは望ましくないアスペクト比になります。以下

enter image description here

は、Y値は秒ではなく、日に建てられ、 coord_equalが指定されている場合、y軸は、x軸に対して押しつぶさ取得する方法のデモンストレーションである:

ggplot(dat, 
     aes(x = as.POSIXct(as.numeric(datetime) %% 86400, 
          tz="UTC", origin=as.Date("2016-01-01")), 
      y = as.Date(datetime), 
      fill = scale(value))) + 
    geom_tile() + 
    labs(y="Date", x="Time") + 
    scale_x_datetime(date_labels="%H:%m") + 
    coord_equal() 

enter image description here

関連する問題