2012-10-31 76 views
3

我希望找到一種方法來在ggplot2中調整hexbin圖的大小而不用手動調整binwidth參數時保持正六邊形(所有邊都有相同的長度)。ggplot2 stat_binhex():在改變繪圖尺寸時保留箱體半徑

舉例說明:

d <- ggplot(diamonds, aes(carat, price))+ 
    stat_binhex(colour="white") 
try(ggsave(plot=d,filename=<some file>,height=6,width=8)) 

產生六邊形,至少看起來正規的眼睛:ggplot2 stat_binhex plot1

而且

try(ggsave(plot=d,filename=<some other file>,height=6,width=12)) 

產量不規則六邊形:ggplot2 stat_binhex plot2

documentation介紹b寬度參數(例如binwidth = c(1, 1000)),其指定箱寬度。我想要一個函數,當給定任何繪圖大小時,返回右邊的binwidth設置來創建正六邊形。

回答

4

減少在x尺寸binwidth這裏的動態調整binwidth該溶液中。我已經包括處理縱向縱橫比和明確說明的軸限制。

bins <- function(xMin,xMax,yMin,yMax,height,width,minBins) { 
    if(width > height) { 
    hbins = ((width/height)*minBins) 
    vbins = minBins 
    } else if (width < height) { 
    vbins = ((height/width)*minBins) 
    hbins = minBins 
    } else { 
    vbins = hbins = minBins 
    } 
    binwidths <- c(((xMax-xMin)/hbins),((yMax-yMin)/vbins)) 
    return(binwidths) 
} 

例如下面的代碼:

h = 5 
w = 5 
yMin = min(diamonds$price) 
yMax = max(diamonds$price) 
xMin = min(diamonds$carat) 
xMax = max(diamonds$carat) 
minBins = 30 

d <- ggplot(diamonds, aes(x = carat, y = price))+ 
    stat_binhex(colour="white", binwidth = bins(xMin,xMax,yMin,yMax,h,w,minBins))+ 
    ylim(yMin,yMax)+ 
    xlim(xMin,xMax) 
try(ggsave(plot=d,filename=<some file>,height=h,width=w)) 

產量: graham jeffries - hexbin plot 1 當我們改變寬度:

w = 8 
d <- ggplot(diamonds, aes(x = carat, y = price))+ 
    stat_binhex(colour="white", binwidth = bins(xMin,xMax,yMin,yMax,h,w,minBins))+ 
    ylim(yMin,yMax)+ 
    xlim(xMin,xMax) 
try(ggsave(plot=d,filename=<some file>,height=h,width=w)) 

graham jeffries - hexbin plot 2

或改變高度:

h = 8 
w = 5 
d <- ggplot(diamonds, aes(x = carat, y = price))+ 
    stat_binhex(colour="white", binwidth = bins(xMin,xMax,yMin,yMax,h,w,minBins))+ 
    ylim(yMin,yMax)+ 
    xlim(xMin,xMax) 
try(ggsave(plot=d,filename=<some file>,height=h,width=w)) 

graham jeffries - hexbin plot 3

我們也可以改變x和y的限制:

h = 5 
w = 5 
xMin = -2 

d <- ggplot(diamonds, aes(x = carat, y = price))+ 
    stat_binhex(colour="white", binwidth = bins(xMin,xMax,yMin,yMax,h,w,minBins))+ 
    ylim(yMin,yMax)+ 
    xlim(xMin,xMax) 
try(ggsave(plot=d,filename=<some file>,height=h,width=w)) 

graham jeffries - hexbin plot 4

+1

+1在一個一般化的功能很好地加以包裝。 – mnel

4

您的選擇是設置coord_fixed以適當的比例,使情節不會在圖形設備

的大小在這種情況下伸展5/17000似乎合理

d <- ggplot(diamonds, aes(carat, price))+ 
    stat_binhex(colour="white") + coord_fixed(ratio = 5/17000) 

另一種選擇是創建座標尺寸的binwidth和比率與設備尺寸的比率。

除非座標比率是固定的(按照我的第一個示例),否則不能期望將同一個繪圖拉伸到1.5倍寬的窗口,而不會延長繪圖。

所以如果通過1.5倍拉伸寬度,然後以因子1.5

d <- ggplot(diamonds, aes(carat, price))+ 
    stat_binhex(colour="white",bin.widths = c((5/45),17000/30))