2012-10-31 36 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))