自动防止ggplot hexbin从轴上切割geoms的方法

时间:2017-03-01 16:13:22

标签: r ggplot2

这与之前的帖子(ggplot hexbin shows different number of hexagons in plot versus data frame)略有不同。

我使用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 = h@cell, counts = h@count)
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的值也是任意的。我正在尝试自动化此过程,以获得各种数据和各种可用的箱尺寸和六边形尺寸。有没有一种解决方案可以保持所有六边形在绘图中完全可见,而不必硬编码任何可能对某些实例来说太大或太小的任意值?

1 个答案:

答案 0 :(得分:0)

考虑一下你可以跳过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()
这样,六边形永远不应该被截断(尽管你最终会得到一些&#34;空的#34;空间。

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