是否可以定义新的绘图形状?

Ale*_*ock 3 r data-visualization ggplot2

我从这里(http://sape.inf.usi.ch/quick-reference/ggplot2/shape)看到了一组可能的形状。如果我想定义新的形状,可以吗?例如,假设我想使用具有可选填充美学的 7 边多边形 - 有没有办法告诉 ggplot 该形状?

我感到受到这组可能性的限制:

library(tidyverse)
dat <- tibble(p = c(0:25, 32:127),
              x = p %% 16,
              y = p %/% 16)
ggplot(dat, aes(x, y)) +
  geom_text(aes(label = p), size = 3, nudge_y = -.25) +
  geom_point(aes(shape = p), size = 5, fill = "red") +
  scale_shape_identity() +
  theme_void()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

All*_*ron 8

是的,可以通过多种方式之一来完成此操作。除非您有可用的 7 边多边形的 svg 文件,否则一种快速解决方案是将此形状定义为 a并使用包中的grob内容绘制它。这使事物保持矢量格式。geom_grobggpmisc

创建七边形是困难的部分:

library(ggplot2)
library(dplyr)
library(grid)
library(ggpmisc)

# Make heptagon
septs    <- seq(0, 2 * pi, length.out = 8)
devratio <- dev.size()[2]/dev.size()[1]
heptagon <- linesGrob(x = unit(0.5 + 0.2 * devratio * sin(septs), "npc"), 
                      y = unit(0.5 + 0.2 * cos(septs), "npc"),
                      gp = gpar(lwd = 2))
Run Code Online (Sandbox Code Playgroud)

情节本身很简单:

# Plot 10 random points with the heptagon
set.seed(69)

tibble(x = rnorm(10), y = rnorm(10), shape = list(heptagon)) %>%
  ggplot() + 
  geom_grob(aes(x, y, label = shape))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

从这个例子中可以看出,自定义形状不一定那么容易使用,因为形状必须由用户逐点定义,很难将其大小和线宽与现有点相匹配,并且用户将定义它们的填充内容/位置等。我不认为 ggplot 没有一个用于创建自定义形状的简单界面是一个遗漏 - ggplot 对于高级用户来说具有很大的可扩展性,并且不清楚您是否可以拥有一个有用的适合初学者的形状创建界面。同时,除了最利基的应用之外,还有足够多的形状可以为所有应用提供信息丰富的绘图。