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

问题描述 投票:0回答:2

我从这里(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()

r ggplot2 data-visualization
2个回答
9
投票

是的,可以通过多种方式之一来完成此操作。除非您有可用的 7 边多边形的 svg 文件,否则一种快速解决方案是将此形状定义为

grob
并使用
geom_grob
包中的
ggpmisc
来绘制它。这使内容保持矢量格式。

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

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))

情节本身很简单:

# 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))

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


2
投票

也许不完全是您正在寻找的东西,但让我推荐三个套餐:

ggimage - 允许您使用图像(例如 .png 文件)来表达您的观点。

ggpattern - 允许您向图形添加不同的填充。

emoGG - 使用表情符号来表达你的观点。

© www.soinside.com 2019 - 2024. All rights reserved.