ggplot2 stat_binhex():在更改绘图大小时保持bin半径

时间:2012-10-31 03:30:18

标签: r plot ggplot2 data-visualization hexagonal-tiles

我想找到一种方法来保持正常的六边形(所有边都有相同的长度)在ggplot2中调整hexbin图的大小而不需要手动调整binwidth参数。

举例说明:

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

2 个答案:

答案 0 :(得分:4)

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

在这种情况下,5/17000似乎是合理的

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

另一种选择是创建双倍宽度和坐标尺寸比率,并考虑设备尺寸比率。

除非坐标比率是固定的(根据我的第一个例子),否则你不能指望将相同的绘图拉伸到1.5倍宽的窗口,而不会使绘图看起来很拉伸。

因此,如果您将宽度拉伸1.5倍,则将x维度中的binwidth减少1.5倍

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

答案 1 :(得分: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))

收率: 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