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
相关产品推荐
相关产品推荐

