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

SimInf包绘图曲线标注问题:非data.frame对象无法用常规方法标注

我懂你现在的困扰——用SimInf跑出来的模型结果,直接plot(result)之后没法用常规方法给曲线加标注,毕竟这玩意儿不是普通的data.frame对吧?别着急,我给你两个实用的解决方案,你可以根据自己的需求选:

方法1:转成Data Frame用ggplot2绘图(灵活可控)

这个方法的核心是把SimInf的模拟结果提取成标准的data.frame,这样你就能用ggplot2的所有标注工具自由发挥了,样式也能自定义得更美观。

library(SimInf)
library(tidyverse)

# 你的原有模拟代码
transitions <- c("S -> beta*S*I/(S+E+I+R+D) -> E ", "E->epsi*E->I" , "I -> gamma*I -> R", "I -> mu*I -> D")
compartments <- c("S", "E", "I", "R","D")
u0 <- data.frame(S = 9989, E= 10, I = 1, R = 0, D=0)
model1 <- mparse(transitions = transitions, compartments = compartments, 
                 gdata = c(beta = 0.16, epsi=0.25, gamma = 0.077, mu=0.01), 
                 u0 = u0, tspan = 1:250)
set.seed(3)
set_num_threads(1)
result <- run(model = model1)

# 把SimInf结果转成tidy格式的data.frame
result_df <- as.data.frame(result) %>%
  pivot_longer(cols = -time, names_to = "compartment", values_to = "count")

# 用ggplot绘图并在曲线右侧添加标注
ggplot(result_df, aes(x = time, y = count, color = compartment)) +
  geom_line(linewidth = 1) +
  # 取每个曲线的最后一个点,在其右侧标注分组名称
  geom_text(data = result_df %>% group_by(compartment) %>% slice_tail(n=1),
            aes(label = compartment), hjust = -0.1, vjust = 0.5, size = 4) +
  # 扩展x轴范围,给标注留出空间
  xlim(0, max(result_df$time)*1.1) +
  theme_minimal()

这样出来的图不仅有清晰的标注,你还能轻松调整线条样式、颜色主题、坐标轴标签等,完全按需定制。

方法2:在原生Base R图上直接加标注(快捷省事)

如果你不想换绘图系统,只想在SimInf默认的plot基础上补标注,那可以用Base R的text()函数,只要先提取出每个曲线的坐标数据就行:

library(SimInf)

# 你的原有模拟代码(和上面一致,这里省略重复部分)
# ...
result <- run(model = model1)

# 先画出SimInf的默认图
plot(result)

# 提取每个 compartment 的时间序列数据
compartment_data <- lapply(compartments, function(comp) {
  data.frame(time = result@tspan, count = result@U[, comp])
})
names(compartment_data) <- compartments

# 获取当前绘图区域的坐标范围,用来调整标注位置
x_range <- par("usr")[1:2]

# 遍历每个分组,在曲线最后一个点的右侧添加标注
for(comp in compartments) {
  last_point <- tail(compartment_data[[comp]], 1)
  # 把标注放在最后一个点右侧,留出一点间距
  x_pos <- last_point$time + (x_range[2] - x_range[1])*0.02
  y_pos <- last_point$count
  # 用和默认plot一致的颜色
  text(x = x_pos, y = y_pos, labels = comp, col = palette()[match(comp, compartments)])
}

这个方法不用改原有绘图逻辑,直接在默认图上补标注,适合快速出图的场景。

内容的提问来源于stack exchange,提问作者AA1989

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:22:36