我正在创建一个自定义几何,并希望它采用一个名为showpoints
的额外参数,它对实际情节执行某些操作或其他操作。例如,通过将其设置为 FALSE,几何实际上返回一个zeroGrob()
。我已经找到了一种方法,但是(i)它很笨重,有点奇怪,(ii)我不完全明白我在做什么,这是一个不好的迹象。问题是,当您定义新统计信息时,可以运行setup_params
,但几何没有它:
与统计和位置相比,Geom 略有不同,因为 设置和计算功能的执行是分开的。setup_data 在位置调整之前运行,draw_layer直到 渲染时间,很久以后。这意味着没有setup_params因为 很难传达这些变化。
[来源]
基本上,我拥有的代码在某种意义上工作,您可以使用附加参数来抑制点的绘制:
# draw the points by default
ggplot(mpg, aes(displ, hwy)) + geom_simple_point()
# suppresses drawing of the points
ggplot(mpg, aes(displ, hwy)) + geom_simple_point(showpoints=FALSE)
这是我到目前为止的代码,基于扩展 ggplot2 教程:
## Return the grob to draw. The additional parameter,
## showpoints, determines whether a points grob should be returned,
## or whether zeroGrob() should take care of not showing the points
.draw_panel_func <- function(data, panel_params, coord) {
coords <- coord$transform(data, panel_params)
showpoints <- unique(data$showpoints)
cat("showpoints=", as.character(showpoints), "n")
if(!is.null(showpoints) && is.logical(showpoints) && !showpoints) {
return(zeroGrob())
} else {
return(
grid::pointsGrob(coords$x, coords$y,
pch = coords$shape,
gp = grid::gpar(col = coords$colour))
)
}
}
## definition of the new geom. setup_data inserts the parameter
## into data, therefore making it accessible for .draw_panel_func
GeomSimplePoint <- ggproto("GeomSimplePoint", Geom,
required_aes = c("x", "y"),
default_aes = aes(shape = 19, colour = "black"),
draw_key = draw_key_point,
setup_data = function(data, params) {
if(!is.null(params$showpoints)) {
data$showpoints <- params$showpoints
}
data
},
extra_params = c("na.rm", "showpoints"),
draw_panel = .draw_panel_func
)
geom_simple_point <- function(mapping = NULL, data = NULL, stat = "identity",
position = "identity", na.rm = FALSE, show.legend = NA,
inherit.aes = TRUE, showpoints=TRUE, ...) {
layer(
geom = GeomSimplePoint, mapping = mapping, data = data, stat = stat,
position = position, show.legend = show.legend, inherit.aes = inherit.aes,
params = list(na.rm = na.rm, showpoints=showpoints, ...)
)
}
有没有更简单的方法将选定的额外参数传递给几何?如果我能定义extra_params
,为什么我不能以某种方式更容易地访问它们?
有一种相对简单的方法,那就是将额外的参数作为参数传递给面板绘图函数。下面是一个适用于您的geom_simple_point()
的简单示例:
GeomSimplePoint <- ggproto(
"GeomSimplePoint",
GeomPoint,
extra_params = c("na.rm", "showpoints"),
draw_panel = function(data, panel_params,
coord, na.rm = FALSE, showpoints = TRUE) {
if (showpoints) {
return(GeomPoint$draw_panel(data, panel_params, coord, na.rm = na.rm))
} else {
return(zeroGrob())
}
}
)
顺便说一句,如果你想复制已经存在的几何的行为,例如geom_point()
,设置你自己的 ggproto 对象以继承从该几何的 ggproto 对象会更容易。这样,您在 ggproto 中指定的默认 aes、必需的 aes 和其他参数会自动从该几何复制/继承,您不必手动指定所有这些参数。