ggplot2中geom_point使用Unicode形状(如心形)填充无效的解决方法
解决ggplot2中Unicode心形fill不生效的问题
你遇到的问题根源是:Unicode emoji属于单一颜色的字符形状,ggplot2的fill参数仅对具备“边框-填充”分离设计的形状(比如shape=21~25这类原生形状)生效,对字符/emoji类形状无效,此时colour会直接控制整个字符的颜色。
下面提供两种可行的解决方案:
方案1:叠层模拟填充效果
通过绘制两层emoji,底层用白色放大作为填充,上层用红色缩小作为轮廓,实现视觉上的“白色填充+红色边框”效果:
library(ggplot2) df <- read.table(text="x y 1 3 2 4 3 6 4 7", header=TRUE) ggplot(data = df, aes(x =x, y=y)) + # 底层白色填充(尺寸稍大) geom_text(label = "\u2764", colour = "white", size = 8) + # 上层红色轮廓(尺寸稍小) geom_text(label = "\u2764", colour = "red", size = 6)
方案2:注册自定义可填充心形形状
如果希望直接用fill和colour参数控制,可以通过grid包自定义心形多边形,并注册为ggplot2可用的形状:
library(ggplot2) library(grid) # 定义心形的多边形坐标 heart_grob <- polygonGrob( x = c(0.5, 0.75, 1, 0.75, 0.5, 0.25, 0, 0.25), y = c(0.2, 0.6, 0.8, 1, 0.75, 1, 0.8, 0.6), gp = gpar(fill = NA, col = "black") ) # 注册自定义形状到ggplot2 registerGrob(name = "custom_heart", grob = heart_grob) df <- read.table(text="x y 1 3 2 4 3 6 4 7", header=TRUE) ggplot(data = df, aes(x =x, y=y)) + geom_point(shape = "custom_heart", colour = "red", fill = "white", size = 6)
这种方法的优势是可以像原生可填充形状一样,直接通过fill和colour分别控制内部和边框颜色,无需叠层。
内容的提问来源于stack exchange,提问作者rempsyc
相关产品推荐
相关产品推荐

