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