以下是一些与您所要求的接近的技巧:
首先,我们用两个 unicode 符号绘制上半圆和下半圆。它们的优点是每个点标记的中心是由每个半圆定义的圆的相互中心,但缺点是它们每个都包括另一半圆的边界。结果,其中一个圆圈的轮廓覆盖了另一个圆圈的边缘。您可以通过在其上绘制一个未填充的圆圈来“覆盖”圆形边界,但您需要两个大小略有不同的未填充圆圈才能完全覆盖轮廓圆圈。此外,如果任何点重叠,您将看到这些轮廓圆圈的一部分。 (理想情况下,会有 unicode 填充的半圆符号没有边框,标记的地理中心和(半)圆的中心重合,但我找不到。)
library(ggplot2)
p1 = ggplot(mtcars, aes(wt, mpg)) +
geom_point(shape="\u25D2", colour="red", size=3) +
geom_point(shape="\u25D3", colour="blue", size=3) +
geom_point(shape=1, colour="white", size=3.05) +
geom_point(shape=1, colour="white", size=2.8) +
theme_bw()
接下来,我们用两个 unicode 符号绘制半圆,而圆的另一半没有轮廓(我只能找到并排而不是上/下符号)。但这些都有一个缺点,即标记的中心是标记的地理中心,而圆偏离了标记的中心。因此,您必须手动偏移两个圆圈,以便它们相互对齐。
p2 = ggplot(mtcars) +
geom_point(aes(wt-0.027, mpg), shape="\u25D6", colour="red", size=3) +
geom_point(aes(wt+0.027, mpg), shape="\u25D7", colour="blue", size=3) +
theme_bw()
在上面的图中,我对颜色进行了硬编码,但您也可以将它们映射到其他变量。
为了让 unicode 符号正确显示,我使用了带有 Symbola 字体的 Cairo PDF 设备。
cairo_pdf("p1.pdf", family="Symbola", 4,4)
p1
dev.off()
cairo_pdf("p2.pdf", family="Symbola", 4,4)
p2
dev.off()
这些图是这样的: