5

ラスター グラフ (ホブモラー図など) を作成しようとしていますが、誰かが助けてくれることを望んでいました。私はrasterVisと他のいくつかのヘルプを見てきましたが、私のデータに合うようにそれらの例を得ることができないようです。プロットを作成できましたが、セルの塗りつぶし値が元のデータに対応していません。データ フレームの例の dput() ファイルをコピーしました (これが正しい方法であることを願っています)。私が欲しいのは、x 軸に沿った年間通算日 (DOY) で、各 DOY の上に 48 個の長方形 (DF の時間列) の y 軸があります。これらの長方形は、各 DOY の 30 分ごとの間隔を表し、対応する値 (DF の qc 列) に従って色付けされます。値は 0、1、または 2 です。

これまでのところ、次のコードを思いつきましたが、z 値 (qc 列) の色への割り当てに問題があるようです。何らかの理由で値が適切に並んでいないと思います...

mcol <- c("green","blue","red")
x=unique(DF[,"DOY"])
y=unique(DF[,"hour"])
z=matrix(DF[,"qc"],nrow=length(unique(DF[,"DOY"])),
                     ncol=length(unique(DF[,"hour"])))
image(x,y,z, col=mcol,
  xlab="Day of Year 2012", 
  ylab="Hour of day",
  main="Hovmoller plot of 2012 qc flags",
useRaster=TRUE)

起こっているように見えるのは、最初に x 軸の下部に沿って (左から右に) 塗りつぶし値マトリックス (z) が適用され、次に上部にループするのに対し、左下隅から開始して上に行く必要があることです。次に、左から右にループします (何らかの意味があることを願っています!) ここでのサンプル データは 3 日間しかカバーしていませんが、完全なデータセットは 1 年 (2012 年には 366) になります。助けてくれてありがとう、

ジョン

structure(list(DOY = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L), hour = c(0.5, 1, 1.5, 2, 2.5, 3, 3.5, 
4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 
11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 
18, 18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24, 
0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 
8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 
15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5, 21, 
21.5, 22, 22.5, 23, 23.5, 24, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 
4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 
12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 
18.5, 19, 19.5, 20, 20.5, 21, 21.5, 22, 22.5, 23, 23.5, 24), 
    qc = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 1L, 2L, 1L, 1L, 2L, 2L, 0L, 0L, 1L, 0L, 2L, 2L, 2L, 2L, 
    2L, 2L, 0L, 2L, 2L, 0L, 0L, 1L, 2L, 0L, 2L, 0L, 1L, 2L, 1L, 
    2L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 0L, 0L, 
    2L, 0L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L)), .Names = c("DOY", 
"hour", "qc"), class = "data.frame", row.names = c(NA, -144L))
4

3 に答える 3

4

近い!次のようなことを試してください (x と y は上記のコードによって生成されます)。

library( sp )
r <- raster(nrows=length(y), ncols=length(x), xmn=min(x), xmx=max(x), ymn=min(y), ymx=max(y))
values(r) <- t(DF$qc)
spplot( r , cuts = 2 )

spplotパッケージからsp格子グラフィックを使用し、ニーズに応じて非常にカスタマイズ可能です

ここに画像の説明を入力

geom_tile異なるセルを識別できるようにしたい場合は、(ラスター セルの数が大きくなるまで) より良い選択かもしれません。

p <-    ggplot( DF , aes(factor(DOY), hour ) ) + 
    geom_tile( aes(fill = factor(qc) ) , color = "#D9D9D9" ) + 
    scale_fill_brewer(name="QC", type = "div" , palette = "RdBu" )+
    scale_x_discrete( name = "Day" , expand = c(0,0) ) +
    scale_y_continuous( name = "Hour" , limits = c(0.5,24) , expand = c(0,0) , breaks = seq(0,24,2) )+
    coord_equal()
print(p)

ここに画像の説明を入力

于 2013-03-03T10:25:17.167 に答える
3

OK、これでうまくいきました。むしろ単純すぎます...

library(ggplot2)
ggplot(DF,aes(DOY,hour,fill=qc))+geom_raster()

すみません、想像以上に簡単でした。凡例の色は連続的ではなく離散的であることをお勧めしますが、それは些細なことです。ご意見ありがとうございます。ジョン

于 2013-03-03T11:30:41.303 に答える
0

パッケージのhovmoller関数は、rasterVis4D データ (座標、数値変数、時間インデックス) 用に設計されています。ただし、私が間違っていなければ、レベル プロットを使用して単変量時系列をプロットする必要があります。

ここでは、 を使用した例を示しlattice::levelplotます。

まず、時間インデックスを使用してデータを定義します。

tt <- seq(as.POSIXct('2013-01-01'), by='hour', length=8760)
vals <- 1:24 - 12.5
myDF <- data.frame(vals, tt)

次に、時間インデックスから時と日を抽出する 2 つの補助関数を定義します。

hour <- function(x)as.numeric(format(x, '%H'))
DoY <- function(x)as.numeric(format(x, '%j'))

次に、パッケージをロードし、パッケージから順次パレットを使用してテーマを定義しRColorBrewerます。

library(lattice)
library(latticeExtra)
myTheme <- custom.theme(region=brewer.pal(n=10, 'RdBu'))

最後に、データを表示する準備が整いました。

levelplot(vals ~ DoY(tt)*hour(tt),
          data=myDF,
          xlab='Day', ylab='Hour',
          par.settings=myTheme)

レベルプロットの結果

より完全なソリューションについては、 パッケージのstrip機能に興味があるかもしれません 。metvurst

于 2013-03-07T18:39:09.617 に答える