【问题标题】:Automated way to prevent ggplot hexbin from cutting geoms off axes防止ggplot hexbin从轴上切割几何图形的自动化方法
【发布时间】:2020-10-01 04:28:33
【问题描述】:

这与之前的帖子(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]))

这将创建一个图形,其中一个六边形在顶部被切断,一个六边形在底部被切断:

我可以尝试的另一种方法是硬编码一个值(此处为 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)

但是,即使第二种方法解决了这种情况下的问题,1.5 的值也是任意的。我正在尝试针对各种数据以及可以使用的各种箱尺寸和六边形尺寸自动化此过程。有没有一种解决方案可以让所有六边形在图中完全可见,而无需硬编码对于某些情况可能太大或太小的任意值?

【问题讨论】:

  • 刚刚编辑了答案以包括手动设置箱数而不是箱宽的可能性

标签: r ggplot2


【解决方案1】:

考虑一下你可以跳过hexbin的计算,让ggplot来完成这项工作。

然后,如果您更喜欢手动设置 bin 的宽度,您可以设置 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()

这样,六边形永远不会被截断(尽管您最终可能会得到一些“空白”空间。

bwd = 1 的结果:

bwd = 3 的结果:

如果您更喜欢以编程方式设置垃圾箱的数量,则可以使用:

  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()

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2015-10-02
    • 1970-01-01
    • 2018-10-30
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多