2017-03-01 41 views
2

這是與以前的帖子(ggplot hexbin shows different number of hexagons in plot versus data frame)稍有不同的問題。自動防止ggplot hexbin從軸切割幾何的方法

我正在使用hexbin()將數據存入六邊形對象,並使用ggplot()來繪製結果。我注意到,有時候,情節邊緣上的六角形被削減了一半。下面是一個例子。

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]) 
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

另一種方法,我可以嘗試是硬編碼值(這裏是1.5)加到x和y軸的極限上。這樣做似乎解決了這個問題,因爲沒有六邊形被切斷了。

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

然而,即使該第二種方法在這種情況下解決問題,1.5的值是任意的。我正在嘗試將這個過程自動化爲各種數據,並且可以使用各種容器大小和六邊形尺寸。是否有解決方案讓所有六邊形在劇情中完全可見,而不必硬編碼任何可能對某些實例來說太大或太小的值?

+0

剛纔編輯的答案包括手動設置垃圾桶數量而不是垃圾桶寬度的可能性 – lbusett

回答

1

考慮到你可以跳過hexbin的計算,並讓ggplot完成這項工作。

然後,如果你喜歡手動設置可以設置binwidth倉的寬度和修改限制:

bwd = 1 
    ggplot(data, aes(x = x, y = y)) + 
    geom_hex(binwidth = bwd)  + 
    coord_cartesian(xlim = c(min(x) - bwd, max(x) + bwd), 
        ylim = c(min(y) - bwd, max(y) + bwd), 
        expand = T) + 
    geom_point(color = "red")  + 
    theme_bw() 

這樣,六邊形絕不應截斷(雖然你可能最終與一些 「空」 的空間

結果與bwd = 1

enter image description here

結果與bwd = 3

enter image description here

相反,如果您喜歡以編程方式設置垃圾箱的數量,你可以使用:

nbins_x <- 4 
    nbins_y <- 6 

    range_x <- range(data$A, na.rm = T) 
    range_y <- range(data$E, na.rm = T) 
    bwd_x <- (range_x[2] - range_x[1])/nbins_x 
    bwd_y <- (range_y[2] - range_y[1])/nbins_y 

    ggplot(data, aes(x = A, y = E)) + 
    geom_hex(bins = c(nbins_x,nbins_y)) + 
    coord_cartesian(xlim = c(range_x[1] - bwd_x, range_x[2] + bwd_x), 
        ylim = c(range_y[1] - bwd_y, range_y[2] + bwd_y), 
        expand = T) + 
    geom_point(color = "red")+ 
    theme_bw() 

enter image description here