技巧 | 使用基础绘图系统绘制「森林图」
森林圖可以很直觀地表達(dá)數(shù)學(xué)模型的結(jié)果,尤其是在對(duì)比多種情境的結(jié)果時(shí)。
R語言中有一些專門繪制森林圖的工具包,不過小編目前還沒仔細(xì)研究過。實(shí)際上,通過基礎(chǔ)繪圖系統(tǒng)的一些簡(jiǎn)單函數(shù)的組合使用就能繪制森林圖。
首先生成用于繪圖的模型結(jié)果:
##?全樣本模型 data?=?mtcars model?=?lm(mpg?~?qsec,?data) coeff?=?summary(model)$coefficients[2,?1]? se?=?summary(model)$coefficients[2,?2]?##?子樣本模型 for(i?in?3:5)?{model.1?<-?lm(mpg?~?qsec,?data,subset?=?gear?==?i)coeff[i-1]?=?summary(model.1)$coefficients[2,?1]?se[i-1]?=?summary(model.1)$coefficients[2,?2]? }##?結(jié)果整理 library(tidyverse) result?<-?tibble(coeff?=?coeff,se?=?se,lower?=?coeff?-?1.96*se,upper?=?coeff?+?1.96*se )result ##?#?A?tibble:?4?x?4 ##???coeff????se???lower?upper ##???<dbl>?<dbl>???<dbl>?<dbl> ##?1?1.41??0.559??0.316???2.51 ##?2?1.22??0.604??0.0393??2.41 ##?3?0.853?0.998?-1.10????2.81 ##?4?5.77??0.685??4.43????7.11?上述結(jié)果中,coeff為模型系數(shù),lower和upper為95%置信區(qū)間的下限和上限。
下面的代碼提供了繪制森林圖的基本思路:
plot(1,?xlim?=?c(0,4),?ylim?=?c(0,4),type?=?"n",?ann?=?F) abline(h?=?0:4,?col?=?"grey") points(rep(3,4),?(0:3)+0.5,?pch?=?21,?bg?=?"black") set.seed(999) segments(3-runif(4),?(3:0)+0.5,3+runif(4),?(3:0)+0.5)?使用plot()函數(shù)生成繪圖頁面,之后的函數(shù)如abline()、points()等都是低級(jí)函數(shù);
在plot()函數(shù)中,根據(jù)需要設(shè)置橫、縱坐標(biāo)的范圍;type = n表示隱藏圖形,只輸出空白頁面;
abline()函數(shù)用來根據(jù)需要繪制格網(wǎng)(圖中為水平線);
points()函數(shù)繪制中心點(diǎn);
segments()函數(shù)繪制置信區(qū)間的連線。
在上述框架內(nèi),坐標(biāo)范圍的設(shè)置與繪圖數(shù)據(jù)無關(guān),因此需要建立二者的映射關(guān)系。
例如,使用圖形中橫坐標(biāo)在[2,4]之間的區(qū)域來繪制森林圖,這樣就需要把原始數(shù)據(jù)轉(zhuǎn)換到該區(qū)間內(nèi)。
min(result) ##?[1]?-1.102983max(result) ##?[1]?7.112582根據(jù)繪圖數(shù)據(jù)result的實(shí)際范圍,需要將區(qū)間[-2,7.5](「數(shù)據(jù)區(qū)間」)映射到區(qū)間[2,4](「圖形區(qū)間」)上去。這個(gè)過程實(shí)際就是已知兩點(diǎn)去求直線方程,可以通過定義如下函數(shù)f()來實(shí)現(xiàn):
f?=?function(x)?{r1?=?c(-2,7.5)r2?=?c(2,4)?b?=?(lm(r2?~?r1))$coefficientsreturn(x*b[2]?+?b[1]) }result2?=?f(result) result2 ##??????coeff???????se????lower????upper ##?1?2.718342?2.538781?2.487594?2.949090 ##?2?2.678550?2.548206?2.429329?2.927770 ##?3?2.600697?2.631181?2.188846?3.012549 ##?4?3.635697?2.565308?3.352956?3.918438?result2就是轉(zhuǎn)換后的數(shù)據(jù),所有數(shù)值均在[2,4]之間。
將前面繪圖代碼中points()和segments()函數(shù)中的相關(guān)參數(shù)值改成result2中對(duì)應(yīng)的變量:
plot(1,?xlim?=?c(0,4),?ylim?=?c(0,4),type?=?"n",?ann?=?F) abline(h?=?0:4,?col?=?"grey") ##?result2$coeff points(result2$coeff,?(3:0)+0.5,?pch?=?21,?bg?=?"black") ##?result2$lower和result2$upper segments(result2$lower,?(3:0)+0.5,result2$upper,?(3:0)+0.5)上述圖形雖然已經(jīng)能表達(dá)繪圖數(shù)據(jù)的結(jié)果了,但它的坐標(biāo)軸刻度與繪圖數(shù)據(jù)是不對(duì)應(yīng)的。
繪圖數(shù)據(jù)所需要的刻度與圖形實(shí)際的刻度之間也可以通過前面定義的f()函數(shù)進(jìn)行轉(zhuǎn)換:
xx?=?seq(-2,?8,?2) xx0?=?f(xx)在plot()函數(shù)中添加axes = F語句隱去圖形的實(shí)際刻度,再使用低級(jí)函數(shù)axis()添加新的坐標(biāo)刻度。
par(plt?=?c(0.05,0.95,0.2,0.8)) plot(1,?xlim?=?c(0,4),?ylim?=?c(0,4),type?=?"n",?ann?=?F,?axes?=?F) abline(h?=?0:4,?col?=?"grey") points(result2$coeff,?(3:0)+0.5,?pch?=?21,?bg?=?"black") segments(result2$lower,?(3:0)+0.5,result2$upper,?(3:0)+0.5) ##?添加坐標(biāo)刻度 axis(1,?at?=?xx0,?labels?=?xx)至此,森林圖已經(jīng)成型了。在圖形左側(cè)還可以根據(jù)需要添加相關(guān)標(biāo)注,如添加如下文本。
result3?=?round(result,?2) text?=?paste0(result3$coeff,?"(",?result3$lower,"-",?result3$upper,?")") text ##?[1]?"1.41(0.32-2.51)"?"1.22(0.04-2.41)"?"0.85(-1.1-2.81)"?"5.77(4.43-7.11)"使用低級(jí)函數(shù)text()將文本添加到圖形對(duì)應(yīng)位置上:
par(plt?=?c(0.05,0.95,0.2,0.8)) plot(1,?xlim?=?c(0,4),?ylim?=?c(0,4),type?=?"n",?ann?=?F,?axes?=?F) abline(h?=?0:4,?col?=?"grey") points(result2$coeff,?(3:0)+0.5,?pch?=?21,?bg?=?"black") segments(result2$lower,?(3:0)+0.5,result2$upper,?(3:0)+0.5) axis(1,?at?=?xx0,?labels?=?xx) ##?添加文本 text(rep(1,4),?(3:0)+0.5,?text,?family?=?"mono")還可以根據(jù)需要進(jìn)行其他修飾,這里再次使用低級(jí)函數(shù)abline()添加格網(wǎng)(豎直線):
par(plt?=?c(0.05,0.95,0.2,0.8)) plot(1,?type?=?"n",?ann?=?F,?xlim?=?c(0,4),?ylim?=?c(0,4),axes?=?F) abline(h?=?0:4,?col?=?"grey") points(result2$coeff,?(3:0)+0.5,?pch?=?21,?bg?=?"black") segments(result2$lower,?(3:0)+0.5,result2$upper,?(3:0)+0.5) axis(1,?at?=?xx0,?labels?=?xx) text(rep(1,4),?(3:0)+0.5,?text,?family?=?"mono")? ##?添加格網(wǎng) abline(v?=?xx0,?col?=?"grey",?lty?=?2)?segments()函數(shù)也可以用來添加格網(wǎng)。
以上就是僅使用基礎(chǔ)繪圖系統(tǒng)的函數(shù)繪制一個(gè)簡(jiǎn)單森林圖的過程,更復(fù)雜的情況則可以通過各種細(xì)節(jié)進(jìn)行調(diào)整去實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的技巧 | 使用基础绘图系统绘制「森林图」的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EJB - 环境设置
- 下一篇: SOPC设计02——硬件系统开发流程