Julius が言うように、問題はhexGrob
bin サイズに関する情報を取得せず、 facet 内で見つかった違いから推測することです。
六角形の幅と高さdx
を持たないことは、半径を指定せずに中心で円を指定するようなものです。dy
hexGrob
回避策:
resolution
ファセットに x と y の両方が異なる 2 つの隣接する六角形が含まれている場合、この戦略は機能します。したがって、回避策として、セルの x と y の中心座標、およびファセットとカウントの係数を含む data.frame を手動で作成します。
質問で指定されたライブラリに加えて、必要になります
library (reshape2)
また、bindata$factor
実際には要因である必要があります。
bindata$factor <- as.factor (bindata$factor)
次に、基本的な六角形グリッドを計算します
h <- hexbin (bindata, xbins = 5, IDs = TRUE,
xbnds = range (bindata$x),
ybnds = range (bindata$y))
次に、に応じてカウントを計算する必要があります。bindata$factor
counts <- hexTapply (h, bindata$factor, table)
counts <- t (simplify2array (counts))
counts <- melt (counts)
colnames (counts) <- c ("ID", "factor", "counts")
セル ID があるので、この data.frame を適切な座標とマージできます。
hexdf <- data.frame (hcell2xy (h), ID = h@cell)
hexdf <- merge (counts, hexdf)
data.frame は次のようになります。
> head (hexdf)
ID factor counts x y
1 3 e 0 -0.3681728 -1.914359
2 3 s 0 -0.3681728 -1.914359
3 3 y 0 -0.3681728 -1.914359
4 3 r 0 -0.3681728 -1.914359
5 3 p 0 -0.3681728 -1.914359
6 3 o 0 -0.3681728 -1.914359
ggplot
ting (以下のコマンドを使用) これにより正しいビン サイズが得られますが、図の外観は少し奇妙です。描画を抑制するには、そこにカウントを設定しNA
て、na.value
完全に透明にします (デフォルトは gray50 です)。
hexdf$counts [hexdf$counts == 0] <- NA
ggplot(hexdf, aes(x=x, y=y, fill = counts)) +
geom_hex(stat="identity") +
facet_wrap(~factor) +
coord_equal () +
scale_fill_continuous (low = "grey80", high = "#000040", na.value = "#00000000")
投稿の上部に図が表示されます。
この戦略は、ビン幅がファセットなしで正しい限り機能します。ビン幅が非常に小さく設定されているresolution
場合でも、 は大きすぎdx
てdy
. その場合、hexGrob
2 つの隣接するビン (ただし、x と y の両方が異なる)NA
に各ファセットのカウントを指定できます。
dummy <- hgridcent (xbins = 5,
xbnds = range (bindata$x),
ybnds = range (bindata$y),
shape = 1)
dummy <- data.frame (ID = 0,
factor = rep (levels (bindata$factor), each = 2),
counts = NA,
x = rep (dummy$x [1] + c (0, dummy$dx/2),
nlevels (bindata$factor)),
y = rep (dummy$y [1] + c (0, dummy$dy ),
nlevels (bindata$factor)))
このアプローチのもう 1 つの利点は、既に 0 カウントのすべての行を削除できることです。この場合、 のサイズを約 3/4 (520 行ではなく 122 行)counts
減らします。hexdf
counts <- counts [counts$counts > 0 ,]
hexdf <- data.frame (hcell2xy (h), ID = h@cell)
hexdf <- merge (counts, hexdf)
hexdf <- rbind (hexdf, dummy)
プロットは上記とまったく同じように見えますが、na.value
完全に透明でなくても違いを視覚化できます。
問題の詳細
この問題はファセットに固有のものではありませんが、占有されているビンが少なすぎて、「斜めに」隣接するビンが取り込まれない場合に常に発生します。
問題を示す一連の最小限のデータを次に示します。
最初にhexBin
、同じ六角形グリッドのすべての中心座標とggplot2:::hexBin
によって返されるオブジェクトを取得するようにトレースしhexbin
ます。
trace (ggplot2:::hexBin, exit = quote ({trace.grid <<- as.data.frame (hgridcent (xbins = xbins, xbnds = xbnds, ybnds = ybnds, shape = ybins/xbins) [1:2]); trace.h <<- hb}))
非常に小さなデータ セットを設定します。
df <- data.frame (x = 3 : 1, y = 1 : 3)
そしてプロット:
p <- ggplot(df, aes(x=x, y=y)) + geom_hex(binwidth=c(1, 1)) +
coord_fixed (xlim = c (0, 4), ylim = c (0,4))
p # needed for the tracing to occur
p + geom_point (data = trace.grid, size = 4) +
geom_point (data = df, col = "red") # data pts
str (trace.h)
Formal class 'hexbin' [package "hexbin"] with 16 slots
..@ cell : int [1:3] 3 5 7
..@ count : int [1:3] 1 1 1
..@ xcm : num [1:3] 3 2 1
..@ ycm : num [1:3] 1 2 3
..@ xbins : num 2
..@ shape : num 1
..@ xbnds : num [1:2] 1 3
..@ ybnds : num [1:2] 1 3
..@ dimen : num [1:2] 4 3
..@ n : int 3
..@ ncells: int 3
..@ call : language hexbin(x = x, y = y, xbins = xbins, shape = ybins/xbins, xbnds = xbnds, ybnds = ybnds)
..@ xlab : chr "x"
..@ ylab : chr "y"
..@ cID : NULL
..@ cAtt : int(0)
データ ポイント 2 を除外して、プロットを繰り返します。
p <- ggplot(df [-2,], aes(x=x, y=y)) + geom_hex(binwidth=c(1, 1)) + coord_fixed (xlim = c (0, 4), ylim = c (0,4))
p
p + geom_point (data = trace.grid, size = 4) + geom_point (data = df, col = "red")
str (trace.h)
Formal class 'hexbin' [package "hexbin"] with 16 slots
..@ cell : int [1:2] 3 7
..@ count : int [1:2] 1 1
..@ xcm : num [1:2] 3 1
..@ ycm : num [1:2] 1 3
..@ xbins : num 2
..@ shape : num 1
..@ xbnds : num [1:2] 1 3
..@ ybnds : num [1:2] 1 3
..@ dimen : num [1:2] 4 3
..@ n : int 2
..@ ncells: int 2
..@ call : language hexbin(x = x, y = y, xbins = xbins, shape = ybins/xbins, xbnds = xbnds, ybnds = ybnds)
..@ xlab : chr "x"
..@ ylab : chr "y"
..@ cID : NULL
..@ cAtt : int(0)
移入されますが:
df <- data.frame (x = 1 : 3, y = 1 : 3)
p <- ggplot(df, aes(x=x, y=y)) + geom_hex(binwidth=c(0.5, 0.8)) +
coord_fixed (xlim = c (0, 4), ylim = c (0,4))
p # needed for the tracing to occur
p + geom_point (data = trace.grid, size = 4) +
geom_point (data = df, col = "red") + # data pts
geom_point (data = as.data.frame (hcell2xy (trace.h)), shape = 1, size = 6)
ここで、六角形のレンダリングが正しくない可能性があります。それらは 1 つの六角形グリッドに属していません。