如何为ggplot2形状调色板添加带轮廓与填充色的自定义形状?
为ggplot2添加支持轮廓/填充色映射的自定义形状
需求说明
- 基于Franconeri等人2021年研究中提出的感知形状空间理论(开放性、尖刺性、交叉性三个维度存在差异的形状辨识度更高),需为ggplot2实现文中推荐的自定义形状(如双交叉新月形、方形椒盐卷饼形、粗十字形、空心圆等)
- 关键要求:自定义形状必须支持独立的
colour(轮廓色)与fill(填充色)美学映射
已尝试方案及问题
- 尝试通过ChatGPT生成方案:为每个自定义形状编写独立绘图函数(示例代码见下文),并创建自定义geom
geom_custom_point,将形状字符串与对应绘图函数关联 - 问题:ggplot2并未识别自定义形状映射,仍默认使用内置形状,方案未生效,且对该实现思路的合理性存疑
- 额外发现:ggfoundry包可提供兼容ggplot2的扩展形状,但未开放自定义形状的添加接口,其源码可能包含可借鉴的实现逻辑
自定义形状绘图函数示例
.custom_shapes$plus <- function(data, col, fill, size, stroke) { # 解析数据 x <- data$x y <- data$y len <- size * 0.0035 # 控制十字臂长度 bar <- size * 0.001 # 控制单臂半宽 stroke_adj = stroke * 0.5 # 绘制多边形顶点坐标 xs <- c( x - len, x - len, x - bar, x - bar, x + bar, x + bar, x + len, x + len, x + len, x + bar, x + bar, x + bar, x - bar, x - bar, x - bar, x - len ) ys <- c( y + bar, y - bar, y - bar, y - len, y - len, y - bar, y - bar, y + bar, y + bar, y + bar, y + len, y + len, y + len, y + bar, y + bar, y + bar ) # 绘制多边形并设置样式 grid::polygonGrob( x = unit(xs, "npc"), y = unit(ys, "npc"), gp = grid::gpar( col = col, fill = fill, lwd = stroke_adj * .pt ), id = rep(1, length(xs)) ) }
内容的提问来源于stack exchange,提问作者Bajcz
相关产品推荐
相关产品推荐

