1

私の完全なデータ (の結果dput()) は、質問の最後にあります。タイル プロットを作成しようとしていますが、ggplot()間隔が不均一であるためxyタイルが領域全体を埋めません。次に例を示します。

library(ggplot2)
ggplot(data, aes(x = x, y = -y, z = d)) + geom_tile(aes(fill = d))

不等間隔タイル

確かなことはわかりませんが、ggplotデフォルトで のようなサイズのタイルになる可能性があると思いますunique(data$x)[2] - unique(data$x)[1]。したがって、データの行は、実際には連続xまたはy測定間の距離ですが、残りはそうではありません。andを使用してデータのheightandwidth列を作成すると考えましたが、奇妙な結果が発生しています。plyrddply()

完全なデータをロードしない人のために、構造は次のとおりです。

head(data, 5)

     x y       d
1  2.0 0 0.28125
2  5.5 0 0.81250
3 11.5 0 0.56250
4 17.5 0 0.46875
5 23.5 0 0.40625

tail(data, 5)

       x    y     d
191 47.5 80.5 0.000
192 53.5 80.5 0.125
193 59.5 80.5 0.000
194 65.5 80.5 0.000
195 71.0 80.5 0.000

xそのため、 の一意の値ごとに のすべての値を循環していますy。高さ/幅の列を設定しようとした方法は次のとおりです。

# for each unique value of y, calculate diff for the x's and then add on 1
data$width <- ddply(data, .(y), summarize, width = c(diff(x), 1))$width

# for each unique value of x, calculate diff for the y's and then add on 1
data$height <- ddply(data, .(x), summarize, height = c(diff(y), 1))$height

for値1の長さが であるため、最後に a を投げただけで、後で連結するために正しい値で遊ぶと思いました。しかし、ここに私が得ているものがあります:diff()nn-1

ggplot(data, aes(x = x, y = -y, z = d)) + 
  geom_tile(aes(fill = d, height = height, width = width))

間違った高さ

幅は正しいですが、高さは正しくありません。調べたところ:

head(data, 5)

      x y       d height width
1   2.0 0 0.28125    5.5   3.5
2   5.5 0 0.81250    6.5   6.0
3  11.5 0 0.56250    6.0   6.0
4  17.5 0 0.46875    6.0   6.0
5  23.5 0 0.40625    6.0   6.0

したがって、幅が正しいことがわかります: 2 -> 5.5 = 3.5、5.5 -> 11.5 = 6 など。

xしかし、高さはそうではありません。これは、定数値の出力を見るだけでわかります。

head(data[data$x == 2, ], 5)

    x    y       d height width
1   2  0.0 0.28125    5.5   3.5
14  2  5.5 0.37500    4.5   3.5
27  2 12.0 0.37500    4.5   3.5
40  2 18.0 0.56250    6.0   3.5
53  2 24.0 0.25000    6.0   3.5

1 つ目は 5.5 (正しい) である必要がありますが、2 つ目は 6.5、次に 6 のようになります。

ddply自分自身をサブセット化して手動で関数を実行すると、うまくいくようです:

c(diff(data[data$x == 2, "y"]), 1)
 [1] 5.5 6.5 6.0 6.0 6.0 6.0 6.0 6.0 6.0 6.0 6.0 4.5 5.5 4.5 1.0

height値を再検討すると、それらは同じように見えましたが、再配置されました。その観察に続いて、私は、その逆ではなく、定数xを保持しながら一意ごとにデータを収集したかのようにデータを再ソートし、 myとcolumnyを再定義しました。heightwidth

data_sort <- data[order(data$y, data$x), c("x", "y", "d")]
data_sort$width <- ddply(data_sort, .(y), summarize, width = c(diff(x), 1))$width
data_sort$height <- ddply(data_sort, .(x), summarize, height = c(diff(y), 1))$height

高さは正しくなりましたが、幅がごちゃごちゃになっています。

head(data_sort, 5)
   x    y       d width height
1  2  0.0 0.28125   3.5    5.5
14 2  5.5 0.37500   6.0    6.5
27 2 12.0 0.37500   6.0    6.0
40 2 18.0 0.56250   6.0    6.0
53 2 24.0 0.25000   6.0    6.0
66 2 30.0 0.31250   6.0    6.0

ddply一意ではあるが連続していないレベル/値を検索するときに、物事を整理していない何が欠けていますか?


データ:

dput(data)
structure(list(x = c(2, 5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 41.5, 
47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 
41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 
35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 
29.5, 35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 
23.5, 29.5, 35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 
17.5, 23.5, 29.5, 35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 
5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 
71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 41.5, 47.5, 53.5, 59.5, 
65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 41.5, 47.5, 53.5, 
59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 41.5, 47.5, 
53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 41.5, 
47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 35.5, 
41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 29.5, 
35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 23.5, 
29.5, 35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 71, 2, 5.5, 11.5, 17.5, 
23.5, 29.5, 35.5, 41.5, 47.5, 53.5, 59.5, 65.5, 71), y = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5.5, 5.5, 5.5, 5.5, 5.5, 
5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 12, 12, 12, 12, 12, 12, 
12, 12, 12, 12, 12, 12, 12, 18, 18, 18, 18, 18, 18, 18, 18, 18, 
18, 18, 18, 18, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 
24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 36, 36, 
36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 42, 42, 42, 42, 42, 
42, 42, 42, 42, 42, 42, 42, 42, 48, 48, 48, 48, 48, 48, 48, 48, 
48, 48, 48, 48, 48, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 
54, 54, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 66, 
66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70.5, 70.5, 70.5, 
70.5, 70.5, 70.5, 70.5, 70.5, 70.5, 70.5, 70.5, 70.5, 70.5, 76, 
76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 80.5, 80.5, 80.5, 
80.5, 80.5, 80.5, 80.5, 80.5, 80.5, 80.5, 80.5, 80.5, 80.5), 
    d = c(0.28125, 0.8125, 0.5625, 0.46875, 0.40625, 0.3125, 
    0.25, 0.125, 0.09375, 0.0625, 0.1875, 0.25, 0, 0.375, 0.46875, 
    0.5, 0.4375, 0.4375, 0.3125, 0.28125, 0.1875, 0.125, 0.0625, 
    0.1875, 0.3125, 0.5, 0.375, 0.25, 0.375, 0.4375, 0.375, 0.3125, 
    0.28125, 0.15625, 0.125, 0.0625, 0.1875, 0.3125, 0.5, 0.5625, 
    0.375, 0.4375, 0.40625, 0.375, 0.3125, 0.25, 0.15625, 0.09375, 
    0.0625, 0.125, 0.28125, 0.3125, 0.25, 0.34375, 0.40625, 0.40625, 
    0.375, 0.3125, 0.21875, 0.125, 0.09375, 0.0625, 0.125, 0.25, 
    0.3125, 0.3125, 0.375, 0.40625, 0.40625, 0.375, 0.3125, 0.21875, 
    0.09375, 0.0625, 0, 0.09375, 0.15625, 0.25, 0.28125, 0.34375, 
    0.40625, 0.4375, 0.4375, 0.375, 0.3125, 0.1875, 0.15625, 
    0.0625, 0.125, 0.25, 0.3125, 0.3125, 0.375, 0.4375, 0.46875, 
    0.46875, 0.4375, 0.375, 0.28125, 0.5625, 0.0625, 0.125, 0.25, 
    0.34375, 0.3125, 0.4375, 0.4375, 0.5, 0.5, 0.5, 0.4375, 0.34375, 
    0.21875, 0.0625, 0.125, 0.25, 0.34375, 0.3125, 0.4375, 0.4375, 
    0.46875, 0.5, 0.5, 0.4375, 0.34375, 0.21875, 0.09375, 0.15625, 
    0.3125, 0.34375, 0.25, 0.34375, 0.34375, 0.375, 0.375, 0.6875, 
    0.3125, 0.1875, 0.125, 0.0625, 0.125, 0.25, 0.3125, 0.125, 
    0.21875, 0.28125, 0.28125, 0.25, 0.25, 0.1875, 0.09375, 0.0625, 
    0.0625, 0.1875, 0.3125, 0.4375, 0, 0.125, 0.1875, 0.1875, 
    0.21875, 0.1875, 0.1875, 0.28125, 0.15625, 0.125, 0.125, 
    0.375, 0.625, 0, 0.0625, 0.09375, 0.09375, 0.21875, 0.21875, 
    0.21875, 0.21875, 0.1875, 0.15625, 0.4375, 0.625, 0, 0, 0, 
    0, 0.09375, 0.125, 0.125, 0.09375, 0.0625, 0, 0.125, 0, 0, 
    0)), .Names = c("x", "y", "d"), row.names = c(NA, -195L), class = "data.frame")
4

1 に答える 1

1

ばか、ばか、ばか。

ddplyの出力は、処理する順序に並べ替えられ、height列の出力だけを抽出したときに、その事実を完全に無視しました (忘れていました/無知でした)。したがって、私のデータは最初に 、次に でソートされていyましたが、一意の と /then/に基づいて何かを計算するためxに呼び出したとき、それが出力を提供した方法です。ddplyxy

これを示すだけです:

head(data)
     x y       d
1  2.0 0 0.28125
2  5.5 0 0.40625
3 11.5 0 0.56250
4 17.5 0 0.46875
5 23.5 0 0.40625
6 29.5 0 0.31250

そして、私のddply呼び出しの完全な出力を見ると、yそれが元のデータに表示されるのと同じようにグループ化されていることがわかりcbindますdata$width

widths <- ddply(data, .(y), summarize, width = c(diff(x), 1))
head(widths)
  y width
1 0   3.5
2 0   6.0
3 0   6.0
4 0   6.0
5 0   6.0
6 0   6.0

しかし、高さに対してそれを行ったとき、データは一意xのによってグループ化されました。これは、データの配置方法ではありません:

heights <- ddply(data, .(x), summarize, height = c(diff(y), 1))
head(heights)
  x height
1 2    5.5
2 2    6.5
3 2    6.0
4 2    6.0
5 2    6.0
6 2    6.0

確かに質問の正当性はありませんでした.必要な列だけを抽出することで、ddply自分のデータと比較して出力の形式を完全に見落としていました.

これを回避するには、 と の両方の値と と ( から計算) を含む 2 つのデータ フレームを作成しxyheightwidth一意diff()の組み合わせでそれらをマージする必要がxありyました。

于 2013-08-25T01:48:13.677 に答える