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)
是的,可以通过多种方式之一来完成此操作。除非您有可用的 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 对于高级用户来说具有很大的可扩展性,并且不清楚您是否可以拥有一个有用的适合初学者的形状创建界面。同时,除了最利基的应用之外,还有足够多的形状可以为所有应用提供信息丰富的绘图。