通过这个网站的建议,我在ggplot中构建了一个hexbin图,它显示了每个bin中数据点的计数,并突出显示了感兴趣的特定bin。
现在我想进一步扩展这个图,以显示每个hexbin中第二个分组类别的比例。这已经可以用hextri包实现了,但是我不能把我上一个问题的ggplot解决方案和hextri包的输出结合起来。
最终目标是得到一个看起来像hextri包输出的图,并突出显示感兴趣的单元格。
下面是一些示例数据代码,可以创建具有突出显示的单元格的ggplot和具有所示分类比例的hextri plot。这两个特点是我想合并的。
我已经尝试过使用hextri函数的边界输入来实现期望的结果,但还没有成功。
library(hextri)
library(ggplot2)
n = 100
df = data.frame(x = rnorm(n),
y = rnorm(n),
group = sample(0:1, n, prob = c(0.9, 0.1), replace = TRUE))
# hextri plot
hextri_plot = hextri(
df$x,
df$y,
class = df$group,
colour = c("#00b38a", "#ea324c"),
nbins = 3,
diffuse = FALSE,
sorted = TRUE
)
# GGplot
ggplot(df, aes(x = x, y = y)) +
geom_hex() +
stat_summary_hex(aes(
z = group,
color = after_stat(as.character(value))
), fun = ~ +any(.x == 1), fill = NA) +
scale_color_manual(
values = c("0" = "transparent", "1" = "yellow"),
guide = "none"
)
字符串
1条答案
按热度按时间vq8itlhq1#
这不是一个微不足道的问题。它需要写入一个新的
Geom
、一个新的Stat
和一个新的Grob
(见下文)。我个人并不认为这是一个很好的数据可视化选项,因为它会扭曲位置,并涉及显著的舍入误差。然而,它在视觉上很吸引人,而且相当直观,所以我还是继续写了一个geom_hextri
。为了让它工作,我们简单地将其美学Map到一个分类变量,它应该像预期的那样表现。让我们使用您自己的示例数据:
字符串
并使用您选择的配色方案用
geom_hextri
绘制它。我们将覆盖点,这样我们就可以确保段填充的逻辑与点匹配。型
x1c 0d1x的数据
请注意,如果我们愿意,可以很容易地更改bin大小和外观。要在三角形周围获得实心六边形,我们只需添加一个
geom_hex
层:型
的
应用到另一个数据集,我们得到:
型
还请注意,我们不需要使用填充美学。例如,我们可以简单地改变轮廓颜色:
型
geom_hextri
代码geom_hextri
的实现。我试着把它分解成块,但是代码一定很长,而且很难解释得很详细。我还不得不牺牲一点间距,让它适合不需要滚动的代码框。*最终,ggplot必须将绘图设备上的对象绘制为图形对象(
grobs
),但是没有现成的grob
可以绘制这些六边形段,因此我们需要定义一个函数,在给定适当的x,y坐标,高度,宽度,图形参数和我们正在处理的段的情况下,使用grid::polygonGrob
绘制它们。这需要接受矢量化数据才能与ggplot一起使用:型
但这本身还不够。我们还需要定义一个
geom
,它继承自GeomHex
,但有自己的compute_group
方法来适当地调用我们的hextriGrob
函数。它的一部分工作是确保美学被正确地划分为几个部分,由于技术原因,这不可能在Stat
层中轻松完成。型
在我们的数据到达这个地理位置之前,它需要被分成六边形。不幸的是,现有的
StatBinhex
将无法在保留我们需要的单个片段级美学细节的同时做到这一点,所以我们必须编写自己的分箱函数:型
然后必须在自定义
Stat
中使用:型
最后,我们需要编写一个geom函数,这样我们就可以在ggplot调用中轻松调用上述所有函数:
型