R-扩展GGPLOT以获取列表并将其用于自定义Geoms



我正在尝试使ggplot2列出列表并将列表的元素提供给其他自定义Geom函数。

我有一个新的ggplot函数,可以接受列表:

ggplot.list <- function(data = NULL,
                           mapping = ggplot2::aes(),
                           ...,
                           environment = parent.frame()) {
    p <- ggplot2::ggplot(data=data[[1]],mapping=mapping,..., environment=environment)
    p$data_ext <- data[[2]]
    p
}

我创建我的列表,然后绘制第一个数据。帧:

l <- list(tibble(x=1:10, y=1:10), tibble(x=1:10+100, y =1:10+200))
ggplot(l) + geom_point(aes(x=x,y=y))

理想情况下,我想创建类似的东西(不起作用(,默认情况下,它从GGPLOT对象

中获取data_ext
geom_point2 <- function (mapping = NULL, data_ext = NULL, stat = "identity", position = "identity", 
                         ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) 
{
    layer(data_ext = data_ext, mapping = mapping, stat = stat, geom = GeomPoint, 
          position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
          params = list(na.rm = na.rm, ...))
}
ggplot(l) + geom_point(aes(x=x,y=y)) +  geom_point2(aes(x=x,y=y))

我看到我的第二个data.frame在ggplot对象内,但是我不知道如何访问它。也就是说,ggplot(l)$data_ext有效。我已经尝试使用GGPROTO玩,但我不足以了解该怎么做,并且是否可以帮助您。

添加顺便说一句,我可以通过管道实现我想要的东西,但我不想混淆我的功能的能力用户:

pipe_point2 <-function (plot, mapping = NULL, data = NULL, stat = "identity", position = "identity", 
                        ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) 
{
  plot +  layer(data = plot$data_ext, mapping = mapping, stat = stat, geom = GeomPoint,
          position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
          params = list(na.rm = na.rm, ...))
}
{ggplot(l) + geom_point(aes(x=x,y=y))} %>%  pipe_point2(aes(x=x,y=y))

我开始制作自己的ggproto对象的重要指针来自以下链接扩展GGPLOT2。tl; dr:没有ggproto对象,编写新的Geoms将变得非常困难。

我尝试将矩阵走私到自定义GEOM_RASTER((中,这类似于将列表走私到自定义Geoms中。我了解到的是,尺度很难训练,即位置尺度不知道矩阵的极限是什么,并且填充量表不知道矩阵的限制是什么。我到了一切看起来正确的地步,但是颜色栏指南没有显示正确的数字。

现在,列表可能会更容易一些,因为您可以更轻松地将它们分为有意义的元素,并且可以在数据框架内将列表走私。这意味着您可以轻松地做类似的事情并将其喂入GGPLOT:

mydf <- data.frame(x = 1:3, y = 1:3)
mydf$z <- list(c("A","B"), 1:5, function(x) x/10)
print(mydf)
  x y                   z
1 1 1                A, B
2 2 2       1, 2, 3, 4, 5
3 3 3 function (x) , x/10

我认为这将是您在列表中走私到地理位置的最佳选择。您只将其称为功能的额外美学。

g <- ggplot(mydf) + geom_point(aes(x = x, y = y, z = z))
# Warning: Ignoring unknown aesthetics: z

并检查该层是否具有加速性:

layer_data(g)
  x y                   z PANEL group shape colour size fill alpha stroke
1 1 1                A, B     1    -1    19  black  1.5   NA    NA    0.5
2 2 2       1, 2, 3, 4, 5     1    -1    19  black  1.5   NA    NA    0.5
3 3 3 function (x) , x/10     1    -1    19  black  1.5   NA    NA    0.5

确实如此,现在您只需要编写自定义的Geom面板绘图功能即可在图中描绘此列表,我建议上面的链接。

以下唯一要做的是在提取点之前打印z,并接受z作为可选美学:

MyGeom <- ggproto(
  "MyGeom", GeomPoint,
  draw_panel = function(data, panel_params, coord, na.rm = FALSE) {
    print(data$z)
    GeomPoint$draw_panel(data, panel_params, coord, na.rm = FALSE)
  },
  optional_aes = "z"
)

现在您需要一个针对 MyGeom的包装器:

geom_mine <- function (mapping = NULL, data = NULL, stat = "identity", position = "identity", 
                         ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) 
{
  layer(mapping = mapping, stat = stat, geom = MyGeom, 
        position = position, show.legend = show.legend, inherit.aes = inherit.aes, 
        params = list(na.rm = na.rm, ...))
}

您现在可以在图中使用它:

ggplot(mydf) + geom_mine(aes(x = x, y = y, z = z))
[[1]]
[1] "A" "B"
[[2]]
[1] 1 2 3 4 5
[[3]]
function (x) 
x/10

和voila,它制作了情节并打印z,就像我们说的那样。

希望这些指针有所帮助!

相关内容

  • 没有找到相关文章

最新更新