r - ggplot2:draw_panel 的返回值
问题描述
我正在学习在 ggplot2 中编码。我希望创建一个新的几何图形,它使一些复杂的东西——而不是一个简单的多边形。比如说,一个中间有一个点的矩形。
当我定义我的新 geom 对象时,比如 GeomFafik,我需要指定返回draw_panel
grob 的函数(或draw_group
,或任何一个)。这是它现在的样子(基于扩展的 ggplot2小插图:
GeomFafik <- ggproto("GeomFafik",
Geom,
required_aes=c("xmin", "ymin", "xmax", "ymax"),
default_aes=aes(shape=19, colour="black"),
draw_key=draw_key_blank(),
draw_panel=function(data, panel_params, coord) {
coords <- coord$transform(data, panel_params)
# how can I combine grob1 with grob2 and
# return the result?
grob1 <- grid::rectGrob(coords$xmin, coords$ymin,
width=coords$xmax - coords$xmin,
height=coords$ymax - coords$ymin,
gp=gpar(col=coord$colour))
grob2 <- grid::pointsGrob(x=coords$xmin + (coords$xmax - coords$xmin)/2,
y=coords$ymin + (coords$ymax - coords$ymax)/2,
gp=gpar(col=coord$colour))
})
我应该使用grob()
or gTree()
from构建一个 grob 是对的grid
吗?或者有没有ggplot2
办法做到这一点(类似于zeroGrob
)?如果grid
,那么我应该使用两者中的哪一个?我在哪里可以找到示例?手册页并没有说太多。
解决方案
好的,所以这比我想象的要容易。解决方案是使用 gTree 如下(感谢这个例子):
GeomFafik <- ggproto("GeomFafik",
Geom,
required_aes=c("xmin", "ymin", "xmax", "ymax"),
default_aes=aes(shape=19, colour="black"),
draw_key=draw_key_blank(),
draw_panel=function(data, panel_params, coord) {
coords <- coord$transform(data, panel_params)
w <- coords$xmax - coords$xmin
h <- coords$ymax - coords$ymin
x <- coords$xmin + w/2
y <- coords$ymin + h/2
grob1 <- grid::rectGrob(x, y, width=w, height=h,
gp=gpar(col=coord$colour))
grob2 <- grid::pointsGrob(x=x, y=y,
gp=gpar(col=coord$colour))
grid::gTree("fafik_grob", children=grid::gList(grob1, grob2))
})
geom_fafik <- function(mapping = NULL, data = NULL, stat = "identity",
position = "identity", na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE, ...) {
layer(
geom = GeomFafik, mapping = mapping, data = data, stat = stat,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, ...)
)
}
结果,这就是我想要的:
推荐阅读
- javascript - 如何使用 sinon 将同一个方法替换为两个不同的返回值?
- java - Java 中的泛型无法编译
- html - 替换移动浏览器默认全屏下拉菜单
- sas - 使用某些条件搜索目标数据,然后用序列替换它们
- javascript - 在 Windows 上使用 Selenium 更改 Firefox 浏览器时区
- arrays - 如何使用用户输入在 C 中制作二维数组
- flutter - 如何在颤动的任何小部件周围制作渐变阴影?
- angular - 取决于 @Input 更改提供者在 Angular 中的使用类
- excel - 如何获取位于“代表”地址左侧的 smtp 电子邮件地址
- typescript - 一个 void 方法的承诺