如何制作具有多个几何形状的自定义ggplot2几何图形

Ben

我一直在阅读有关扩展ggplot2小插图,但是我对如何制作一个可以向图中添加多个几何图形的单一几何图形有些困惑ggplot2几何中已经存在多个几何,例如,我们有geom_contour(多个路径)和geom_boxplot(多个路径和点)之类的东西。但是我不太明白如何将它们扩展到新的领域。

假设我正在尝试geom_manythings通过在单个数据集上进行计算来绘制两个多边形和一个点。一个多边形将是所有点的凸包,第二个多边形将是这些点的子集的凸包,单个点将代表数据的中心。我希望所有这些都显示为对一个geom的调用,而不是三个单独的调用,如我们在此处看到的:

# example data set
set.seed(9)
n <- 1000
x <- data.frame(x = rnorm(n),
                y = rnorm(n))

# computations for the geometries 
# chull for all the points
hull <-  x[chull(x),]
# chull for all a subset of the points
subset_of_x <- x[x$x > 0 & x$y > 0 , ]
hull_of_subset <- subset_of_x[chull(subset_of_x), ]
# a point in the centre of the data
centre_point <- data.frame(x = mean(x$x), y = mean(x$y))

# plot
library(ggplot2)
ggplot(x, aes(x, y)) +
  geom_point() + 
  geom_polygon(data = x[chull(x),], alpha = 0.1) +
  geom_polygon(data = hull_of_subset, alpha = 0.3) +
  geom_point(data = centre_point, colour = "green", size = 3)

在此处输入图片说明

我想geom_manythings替换geom_*上面代码中的三个

在试图创建一个自定义的geom,我开始与代码geom_tufteboxplot,并geom_boxplot作为模板,随着“延长GGPLOT2”小插曲:

library(ggplot2)
library(proto)

GeomManythings <- ggproto(
  "GeomManythings",
  GeomPolygon,
  setup_data = function(self, data, params) {
    data <- ggproto_parent(GeomPolygon, self)$setup_data(data, params)
    data
  },

  draw_group = function(data, panel_scales, coord) {
    n <- nrow(data)
    if (n <= 2)
      return(grid::nullGrob())

    common <- data.frame(
      colour = data$colour,
      size = data$size,
      linetype = data$linetype,
      fill = alpha(data$fill, data$alpha),
      group = data$group,
      stringsAsFactors = FALSE
    )

    # custom bits...

    # polygon hull for all points
    hull <-  data[chull(data), ]
    hull_df <- data.frame(x = hull$x, 
                          y = hull$y, 
                          common, 
                          stringsAsFactors = FALSE)
    hull_grob <-
      GeomPolygon$draw_panel(hull_df, panel_scales, coord)

    # polygon hull for subset
    subset_of_x <-
      data[data$x > 0 & data$y > 0 ,]
    hull_of_subset <-
      subset_of_x[chull(subset_of_x),]
    hull_of_subset_df <- data.frame(x = hull_of_subset$x, 
                                    y = hull_of_subset$y, 
                                    common, 
                                    stringsAsFactors = FALSE)
    hull_of_subset_grob <-
      GeomPolygon$draw_panel(hull_of_subset_df, panel_scales, coord)

    # point for centre point
    centre_point <-
      data.frame(x = mean(coords$x), 
                 y = coords(data$y),
                 common, 
                 stringsAsFactors = FALSE)

    centre_point_grob <-
      GeomPoint$draw_panel(centre_point, panel_scales, coord)

    # end of custom bits

    ggname("geom_mypolygon",
           grobTree(hull_grob,
                    hull_of_subset_grob,
                    centre_point_grob))


  },

  required_aes = c("x", "y"),

  draw_key = draw_key_polygon,

  default_aes = aes(
    colour = "grey20",
    fill = "grey20",
    size = 0.5,
    linetype = 1,
    alpha = 1,
  )
)

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

但是很明显,在这个领域中有很多事情是不对的,我必须错过一些基本细节...

ggplot(x, aes(x, y)) +
  geom_point() +
  geom_manythings()

在此处输入图片说明

如何编写此几何图形以获得所需的结果?

浸礼会

您的代码中存在很多问题,因此我建议您首先尝试一种简化的情况。特别地,合唱计算是有问题的。试试这个,

library(ggplot2)
library(proto)
library(grid)

GeomManythings <- ggproto(
  "GeomManythings",
  Geom,
  setup_data = function(self, data, params) {
    data <- ggproto_parent(Geom, self)$setup_data(data, params)
    data
  },

  draw_group = function(data, panel_scales, coord) {
    n <- nrow(data)
    if (n <= 2)
      return(grid::nullGrob())


    # polygon hull for all points
    hull_df <-  data[chull(data[,c("x", "y")]), ]

    hull_grob <-
      GeomPolygon$draw_panel(hull_df, panel_scales, coord)

    # polygon hull for subset
    subset_of_x <-
      data[data$x > 0 & data$y > 0 ,]
    hull_of_subset_df <-subset_of_x[chull(subset_of_x[,c("x", "y")]),]
    hull_of_subset_df$fill <- "red" # testing
    hull_of_subset_grob <-  GeomPolygon$draw_panel(hull_of_subset_df, panel_scales, coord)

    coords <- coord$transform(data, panel_scales)     

    pg <- pointsGrob(x=mean(coords$x), y=mean(coords$y), 
                     default.units = "npc", gp=gpar(col="green", cex=3))

    ggplot2:::ggname("geom_mypolygon",
                     grobTree(hull_grob,
                              hull_of_subset_grob, pg))


  },


  required_aes = c("x", "y"),

  draw_key = draw_key_polygon,

  default_aes = aes(
    colour = "grey20",
    fill = "grey50",
    size = 0.5,
    linetype = 1,
    alpha = 0.5
  )
)

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


set.seed(9)
n <- 20
d <- data.frame(x = rnorm(n),
                y = rnorm(n))

ggplot(d, aes(x, y)) +
  geom_manythings()+
  geom_point() 

在此处输入图片说明

(免责声明:我已经有5年没有尝试编写geom了,所以我现在不知道它是如何工作的)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用ggplot2获取具有不同几何图形的2个图形的网格

来自分类Dev

SceneKit –自定义几何图形不显示

来自分类Dev

如何控制ggplot2中的哪些图例中显示哪些几何图形?

来自分类Dev

ggplot2图例通过几何图形而不是美学图形

来自分类Dev

ggplot2中的自定义几何的自定义比例

来自分类Dev

自定义three.js几何图形不会显示其外观

来自分类Dev

自定义three.js几何图形不会显示其外观

来自分类Dev

在 A-Frame 中将线注册为自定义几何图形

来自分类Dev

GoJS 中的自定义几何图形可以填充颜色吗?

来自分类Dev

无法在ggplot2中为混合几何图形生成图例

来自分类Dev

Three.js平铺,使用平面几何图形具有多个纹理

来自分类Dev

如何在现有pdf的顶部绘制几何图形?

来自分类Dev

使用ShaderMaterial为自定义几何图形加载纹理在Three.js中不起作用

来自分类Dev

编写ggplot自定义几何函数

来自分类Dev

使用ggplot2对两个不同几何图形进行“着色”和“填充”的混合图例

来自分类Dev

在Three.js中,纹理在具有自定义几何形状的网格上显示为一种单色

来自分类Dev

WPF中的几何图形

来自分类Dev

链接几何图形的边界

来自分类Dev

WPF中的几何图形

来自分类Dev

三个JS创建自定义形状几何

来自分类Dev

R,ggplot2-在图例中,如何在一个几何图形中隐藏未使用的颜色而在其他几何图形中显示它们?

来自分类Dev

用自己的几何图形扩展ggplot:调整默认比例

来自分类Dev

从使用2种不同几何图形创建的ggplot图例中删除某些值

来自分类Dev

从Bigquery提取的美国和俄罗斯几何图形具有视觉失真

来自分类Dev

C++:OpenGL:绘制多个几何图形

来自分类Dev

如何在d2d中设置外部几何图形蒙版,因此d2d仅在该几何图形外部绘制

来自分类Dev

如何在d2d中设置外部几何图形蒙版,以便d2d仅在该几何图形外部绘制

来自分类Dev

SceneKit自定义几何:我知道多位置(SCNVector)。如何创建自定义几何

来自分类Dev

如何在CSS中为几何图形添加边框?

Related 相关文章

  1. 1

    如何使用ggplot2获取具有不同几何图形的2个图形的网格

  2. 2

    SceneKit –自定义几何图形不显示

  3. 3

    如何控制ggplot2中的哪些图例中显示哪些几何图形?

  4. 4

    ggplot2图例通过几何图形而不是美学图形

  5. 5

    ggplot2中的自定义几何的自定义比例

  6. 6

    自定义three.js几何图形不会显示其外观

  7. 7

    自定义three.js几何图形不会显示其外观

  8. 8

    在 A-Frame 中将线注册为自定义几何图形

  9. 9

    GoJS 中的自定义几何图形可以填充颜色吗?

  10. 10

    无法在ggplot2中为混合几何图形生成图例

  11. 11

    Three.js平铺,使用平面几何图形具有多个纹理

  12. 12

    如何在现有pdf的顶部绘制几何图形?

  13. 13

    使用ShaderMaterial为自定义几何图形加载纹理在Three.js中不起作用

  14. 14

    编写ggplot自定义几何函数

  15. 15

    使用ggplot2对两个不同几何图形进行“着色”和“填充”的混合图例

  16. 16

    在Three.js中,纹理在具有自定义几何形状的网格上显示为一种单色

  17. 17

    WPF中的几何图形

  18. 18

    链接几何图形的边界

  19. 19

    WPF中的几何图形

  20. 20

    三个JS创建自定义形状几何

  21. 21

    R,ggplot2-在图例中,如何在一个几何图形中隐藏未使用的颜色而在其他几何图形中显示它们?

  22. 22

    用自己的几何图形扩展ggplot:调整默认比例

  23. 23

    从使用2种不同几何图形创建的ggplot图例中删除某些值

  24. 24

    从Bigquery提取的美国和俄罗斯几何图形具有视觉失真

  25. 25

    C++:OpenGL:绘制多个几何图形

  26. 26

    如何在d2d中设置外部几何图形蒙版,因此d2d仅在该几何图形外部绘制

  27. 27

    如何在d2d中设置外部几何图形蒙版,以便d2d仅在该几何图形外部绘制

  28. 28

    SceneKit自定义几何:我知道多位置(SCNVector)。如何创建自定义几何

  29. 29

    如何在CSS中为几何图形添加边框?

热门标签

归档