如何在ggplot2的geom_point上叠加半圆展示双重病毒感染数据?
解决ggplot2多病毒感染点图的两个问题
问题背景
需要生成点图展示多个个体随时间的病毒感染变化:不同病毒用不同颜色区分;同一时间点感染多种病毒时,第二种病毒以半圆(Unicode字符\u25D7)叠加在第一个病毒的点上。当前遇到两个问题:
- Unicode字符无法正常显示,仅出现空心方块
- 需要隐藏Res2中的"Neg"类别,仅在同时检测到两种病毒时显示半圆
环境:R v4.4.0,Windows 10,编码为English_United States.utf8
解决方案
1. 仅在同时感染时显示半圆(过滤Res2的"Neg")
在第二层geom_point中通过subset参数过滤掉Res2为"Neg"的行,只保留存在第二种病毒的记录,避免无效绘图。
2. 解决Unicode字符显示问题
Windows系统默认字体可能不支持部分Unicode字符,使用showtext包加载支持完整Unicode的字体(如微软雅黑、Noto Sans等),确保字符正常渲染。
修改后的完整代码
library(ggplot2) library(ggthemes) library(dplyr) library(showtext) # 加载支持Unicode的字体(Windows下微软雅黑路径示例,可替换为其他支持字体) font_add("msyh", "msyh.ttc") showtext_auto() # 示例数据 AnimalID <- c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C") Week <- c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5) Res1 <- c("HV1","HV1","Neg","HV2","Neg","Neg","HV2","HV1","HV1","HV1","HV1","HV1","HV2","Neg","HV1") Res2 <- c("HV2","Neg","Neg","Neg","Neg","Neg","Neg","HV2","Neg","Neg","Neg","HV2","Neg","Neg","Neg") AllHV <- c("HV1 and HV2","HV1","Neg","HV2","Neg","Neg","HV2","HV1 and HV2","HV1","HV1","HV1","HV1 and HV2","HV2","Neg","HV1") db <- data.frame(AnimalID, Week, Res1, Res2, AllHV) # 绘制图形 Exgraph <- ggplot(db, aes(x = Week, y = AnimalID, color = Res1)) + geom_point(size = 3, shape = 16) + # 仅在Res2不为Neg时绘制半圆,形状设为Unicode字符,大小略大于底层点 geom_point(data = subset(db, Res2 != "Neg"), aes(x = Week, y = AnimalID, color = Res2), shape = "\u25D7", size = 4) + theme_tufte() + ggtitle("HV Shedding Patterns") + xlab("Study Week") + ylab("Animal ID") + theme(axis.line = element_line(colour = "black")) + theme(plot.title = element_text(face = "bold", size = 18, family = "msyh")) + theme(axis.text = element_text(size = 10, family = "msyh")) + theme(axis.title = element_text(face = "bold", size = 14, family = "msyh")) + theme(legend.title = element_text(size = 14, face = "bold", family = "msyh"), legend.text = element_text(size = 11, family = "msyh")) + labs(color = "HV") + scale_color_manual(values = c("green", "blue", "grey80")) Exgraph
关键说明
- 过滤数据:通过
subset(db, Res2 != "Neg")精准筛选出同时感染两种病毒的时间点,避免Res2为"Neg"时的无效绘图操作。 - 字体设置:
showtext包让R调用系统中支持Unicode的字体,彻底解决空心方块问题;需在theme中指定字体family,保证标题、坐标轴等所有文本统一使用该字体。 - 形状大小:将半圆的
size设为4(略大于底层点的size=3),确保半圆能清晰覆盖底层点,同时不遮挡病毒颜色标识。
内容的提问来源于stack exchange,提问作者TurtleyAwesome
相关产品推荐
相关产品推荐

