4

我想找到一种方法来在不手动调整 binwidth 参数的情况下在 ggplot2 中调整 hexbin 图的大小时保持正六边形(所有边的长度相等)。

为了显示:

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

文档binwidth = c(1, 1000)描述了指定 bin 宽度的 binwidth 参数(例如)。我想要一个函数,当给定任何绘图大小时,它会返回正确的 binwidth 设置以创建正六边形。

4

2 回答 2

4

您的选择是设置coord_fixed适当的比例,以便绘图不会超出图形设备的大小

在这种情况下5/17000会显得合理

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

另一种选择是在考虑设备尺寸比率的情况下创建坐标尺寸的 binwidth 和比率。

除非坐标比是固定的(根据我的第一个示例),否则您不能期望将相同的绘图拉伸到宽 1.5 倍的窗口中,而绘图看起来不会被拉伸。

x因此,如果您将宽度拉伸 1.5 倍,则将尺寸 中的 binwidth 减小1.5 倍

d <- ggplot(diamonds, aes(carat, price))+ 
   stat_binhex(colour="white",bin.widths = c((5/45),17000/30 ))
于 2012-10-31T03:53:45.820 回答
4

这是动态调整 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))

产量: 格雷厄姆·杰弗里斯 - hexbin 情节 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))

格雷厄姆·杰弗里斯 - hexbin 情节 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))

格雷厄姆·杰弗里斯 - hexbin 情节 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))

格雷厄姆·杰弗里斯 - hexbin 情节 4

于 2012-10-31T15:02:20.933 回答