You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot2的geom_point上叠加半圆展示双重病毒感染数据?

解决ggplot2多病毒感染点图的两个问题

问题背景

需要生成点图展示多个个体随时间的病毒感染变化:不同病毒用不同颜色区分;同一时间点感染多种病毒时,第二种病毒以半圆(Unicode字符\u25D7)叠加在第一个病毒的点上。当前遇到两个问题:

  1. Unicode字符无法正常显示,仅出现空心方块
  2. 需要隐藏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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:40:18