2017-01-27 4 views
1

六角形のオブジェクトにデータを格納するのにhexbin()を使い、結果をプロットするためにggplot()を使っています。私は時々、ビニングデータフレームに、同じビニングデータフレームをプロットした結果のプロットとは異なる数の六角形が含まれることに気付きます。以下は例です。ggplot hexbinはプロットとデータフレームの六角形の数が異なっています

library(hexbin) 
library(ggplot2) 

set.seed(1) 
data <- data.frame(A=rnorm(100), B=rnorm(100), C=rnorm(100), D=rnorm(100), E=rnorm(100)) 
maxVal = max(abs(data)) 
maxRange = c(-1*maxVal, maxVal) 

x = data[,c("A")] 
y = data[,c("E")] 
h <- hexbin(x=x, y=y, xbins=5, shape=1, IDs=TRUE, xbnds=maxRange, ybnds=maxRange) 
hexdf <- data.frame (hcell2xy (h), hexID = [email protected], counts = [email protected]) 

# Both objects below indicate there are 17 hexagons 
# hexdf 
# table([email protected]) 

# However, plotting only shows 16 hexagons 
ggplot(hexdf, aes(x=x, y=y, fill = counts, hexID=hexID)) + geom_hex(stat="identity") + scale_x_continuous(limits = maxRange) + scale_y_continuous(limits = maxRange) 

この例では、hexdfデータフレームには17個の六角形が含まれています。ただし、ggplot(hexdf)プロットの結果は、以下に示すように、16個の六角形しか表示されません。

ggplot(hexdf) shows 16 hexagons

注:上記の例の構文が面倒に思えるかもしれませんが、これは、より複雑な目標のMWEであり、任意の可能な解決策は、に及ぶ可能性があるように、私は意図的にこれらのコンポーネントを保管しておりますので、それのいくつかはあります私のより複雑な目標。たとえば、dataというオリジナルのデータフレーム(追加の列 "B"、 "C"、 "D")からmaxRange変数を計算できるようにする機能を維持したいと考えています。同時に、構文が不必要に煩雑で問題の原因となる部分があるかもしれないので、私はそれらを修正して見て喜んでいます。

この不一致の原因となっている可能性のあることとその修正方法を教えてください。ありがとうございました!

答えて

3

最後の六角形は、設定した範囲外の(部分的に)欠けています。制限を変更した場合は含まれます(例:そのような:

ggplot(hexdf, aes(x = x, y = y, fill = counts, hexID = hexID)) + 
    geom_hex(stat = "identity") + 
    scale_x_continuous(limits = maxRange * 1.5) + 
    scale_y_continuous(limits = maxRange * 1.5) 

enter image description here

またはその代わりにcoord_cartesianを使用して:

ggplot(hexdf, aes(x = x, y = y, fill = counts, hexID = hexID)) + 
    geom_hex(stat = "identity") + 
    coord_cartesian(xlim = c(maxRange[1], maxRange[2]), ylim = c(maxRange[1], maxRange[2])) 

enter image description here

+3

サイドノート:OPの例では、実際にその観察をあなたに警告TELL-物語の警告をスローします「欠損値」が含まれているため削除されました。私はしばしば** ggplot2 **がこの場合もっと有益な警告を出すことを望んでいましたが、それは一般的な意味で検出するのが難しいかもしれません。 – joran

+1

@joran true、私はこの警告に慣れています。私は完全にそれを逃しました;) – beetroot

+1

ありがとう - それは素晴らしいです! 2番目の答えが本当に好きなのは、あなたの例では定数1.5のような制限を広げたくないからです。なぜなら、これらのプロットを自動的に作っているかもしれないからです。私がこのアプローチを試みたとしても、(scale_x/y_continuous()関数の代わりに)構文の残りの部分の前に定数を適用し、結果はさらに悪化しました!だから、ありがとう! – luckButtered

関連する問題