Giả thiết tôi có dữ liệu X và Y. Bây giờ tôi muốn thêm khoảng tin cậy 95% vào đồ thị của mình. Tôi sẽ sử dụng các hàm cơ bản có sẵn trong R:
Để mô tả cách thức tôi dùng dữ liệu mtcars có trong R
# example data from the built-in data set "mtcars"
x = mtcars$wt
y = mtcars$drat
# prepare plot, fit model, get predictions,
# add lines for confidence limits and regression line, add points
plot(y~x,type="n")
m = lm(y~x)
wx = par("usr")[1:2]
new.x = seq(wx[1],wx[2],len=100)
pred = predict(m, new=data.frame(x=new.x), interval="conf")
lines(new.x,pred[,"fit"],lwd=2)
lines(new.x,pred[,"lwr"],lty=3)
lines(new.x,pred[,"upr"],lty=3)
points(x,y,pch=16,col="steelblue")

Alternative: Plot confidence band:
plot(y~x,type="n")
polygon(c(new.x,rev(new.x)),c(pred[,"lwr"],rev(pred[,"upr"])),border=NA,col=blues9[3])
lines(new.x,pred[,"fit"],lwd=2,col=blues9[8])
points(x,y,pch=16)
box()

Trên đây là cách giải quyết với sự hỗ trợ của các hàm cơ bản plot, polygon, ** lines** và predict. Thêm một ví dụ nữa để hiểu thêm về cách giải quyêt vấn đề:
set.seed(1234)
df <- data.frame(x =1:10,
F =runif(10,1,2),
L =runif(10,0,1),
U =runif(10,2,3))
plot(df$x, df$F, ylim = c(0,4), type = "l")
#make polygon where coordinates start with lower limit and
# then upper limit in reverse order
polygon(c(df$x,rev(df$x)),c(df$L,rev(df$U)),col = "grey75", border = FALSE)
lines(df$x, df$F, lwd = 2)
#add red lines on borders of polygon
lines(df$x, df$U, col="red",lty=2)
lines(df$x, df$L, col="red",lty=2)

Tiếp theo tôi sẽ hướng dẫn các bạn giải quyết bài toán đơn giản hơn với việc sử dụng ggplot2 hoặc dygraphs đối với xts objects. Tôi sẽ nói trường hợp phức tạp hơn đó là thêm nhiều confidence intervals với line chart vào cùng 1 biểu đồ:
Tạo Dữ liệu để thực hiện demo
#Create xts data
df <- data.frame("value" = c(1,2,3,4,5), "upper1" = c(1.2, 2.3, 3.1, 4.6, 5.9), "lower1" = c(0.5, 1.8, 2.6, 3.7, 4.9), "upper2" = c(1.2, 2.1, 3.5, 4.8, 5.9), "lower2" = c(0.3, 1.4, 2.7, 3.5, 4.8))
dates <- c("2014-10-01", "2014-11-01", "2014-12-01", "2015-01-01", "2015-02-01")
time <- as.Date(dates)
new_df <- xts::as.xts(df, order.by = time)
sử dụng ggplot2::ribbon
library(ggplot2)
ggplot(df, aes(time)) +
geom_ribbon(aes(ymin = lower2, ymax = upper2), fill = "pink", alpha = 0.7) +
geom_ribbon(aes(ymin = lower1, ymax = upper1), fill = "pink", alpha = 0.9) +
geom_line(aes(y = value), alpha = 0.9, color = "red") +
theme_bw()

Sử dụng dygraphs:
library(dygraphs)
dygraph(new_df, main = "testing") %>%
dySeries(c("lower1", "value", "upper1"), label = "num1") %>%
dySeries(c("lower2", "value", "upper2"), label = "num2") %>%
dyRangeSelector()
LS0tDQp0aXRsZTogIlRow6ptIGtob+G6o25nIHRpbiBj4bqteSAoY29uZmlkZW5jZSBpbnRlcnZhbHMpIHbDoG8gxJHhu5MgdGjhu4sgUiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkdp4bqjIHRoaeG6v3QgdMO0aSBjw7MgZOG7ryBsaeG7h3UgWCB2w6AgWS4gQsOieSBnaeG7nSB0w7RpIG114buRbiB0aMOqbSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIHbDoG8gxJHhu5MgdGjhu4sgY+G7p2EgbcOsbmguIFTDtGkgc+G6vSBz4butIGThu6VuZyBjw6FjIGjDoG0gY8ahIGLhuqNuIGPDsyBz4bq1biB0cm9uZyBSOg0KDQrEkOG7gyBtw7QgdOG6oyBjw6FjaCB0aOG7qWMgdMO0aSBkw7luZyBk4buvIGxp4buHdSAqKm10Y2FycyoqIGPDsyB0cm9uZyBSDQoNCmBgYHtyfQ0KIyBleGFtcGxlIGRhdGEgZnJvbSB0aGUgYnVpbHQtaW4gZGF0YSBzZXQgIm10Y2FycyINCnggPSBtdGNhcnMkd3QNCnkgPSBtdGNhcnMkZHJhdA0KDQojIHByZXBhcmUgcGxvdCwgZml0IG1vZGVsLCBnZXQgcHJlZGljdGlvbnMsDQojIGFkZCBsaW5lcyBmb3IgY29uZmlkZW5jZSBsaW1pdHMgYW5kIHJlZ3Jlc3Npb24gbGluZSwgYWRkIHBvaW50cw0KcGxvdCh5fngsdHlwZT0ibiIpDQptID0gbG0oeX54KQ0Kd3ggPSBwYXIoInVzciIpWzE6Ml0NCm5ldy54ID0gc2VxKHd4WzFdLHd4WzJdLGxlbj0xMDApDQpwcmVkID0gcHJlZGljdChtLCBuZXc9ZGF0YS5mcmFtZSh4PW5ldy54KSwgaW50ZXJ2YWw9ImNvbmYiKQ0KbGluZXMobmV3LngscHJlZFssImZpdCJdLGx3ZD0yKQ0KbGluZXMobmV3LngscHJlZFssImx3ciJdLGx0eT0zKQ0KbGluZXMobmV3LngscHJlZFssInVwciJdLGx0eT0zKQ0KcG9pbnRzKHgseSxwY2g9MTYsY29sPSJzdGVlbGJsdWUiKQ0KDQpgYGANCg0KIyMjIEFsdGVybmF0aXZlOiBQbG90IGNvbmZpZGVuY2UgYmFuZDoNCmBgYHtyfQ0KcGxvdCh5fngsdHlwZT0ibiIpDQpwb2x5Z29uKGMobmV3LngscmV2KG5ldy54KSksYyhwcmVkWywibHdyIl0scmV2KHByZWRbLCJ1cHIiXSkpLGJvcmRlcj1OQSxjb2w9Ymx1ZXM5WzNdKQ0KbGluZXMobmV3LngscHJlZFssImZpdCJdLGx3ZD0yLGNvbD1ibHVlczlbOF0pDQpwb2ludHMoeCx5LHBjaD0xNikNCmJveCgpDQpgYGANCg0KVHLDqm4gxJHDonkgbMOgIGPDoWNoIGdp4bqjaSBxdXnhur90IHbhu5tpIHPhu7EgaOG7lyB0cuG7oyBj4bunYSBjw6FjIGjDoG0gY8ahIGLhuqNuICoqcGxvdCoqLCAqKnBvbHlnb24qKiwgKiogbGluZXMqKiB2w6AgKipwcmVkaWN0KiouIFRow6ptIG3hu5l0IHbDrSBk4bulIG7hu69hIMSR4buDIGhp4buDdSB0aMOqbSB24buBIGPDoWNoIGdp4bqjaSBxdXnDqnQgduG6pW4gxJHhu4E6DQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzNCkNCiBkZiA8LSBkYXRhLmZyYW1lKHggPTE6MTAsDQogICAgICAgICAgICAgICAgIEYgPXJ1bmlmKDEwLDEsMiksDQogICAgICAgICAgICAgICAgIEwgPXJ1bmlmKDEwLDAsMSksDQogICAgICAgICAgICAgICAgIFUgPXJ1bmlmKDEwLDIsMykpDQoNCg0KIHBsb3QoZGYkeCwgZGYkRiwgeWxpbSA9IGMoMCw0KSwgdHlwZSA9ICJsIikNCiAjbWFrZSBwb2x5Z29uIHdoZXJlIGNvb3JkaW5hdGVzIHN0YXJ0IHdpdGggbG93ZXIgbGltaXQgYW5kIA0KICMgdGhlbiB1cHBlciBsaW1pdCBpbiByZXZlcnNlIG9yZGVyDQogcG9seWdvbihjKGRmJHgscmV2KGRmJHgpKSxjKGRmJEwscmV2KGRmJFUpKSxjb2wgPSAiZ3JleTc1IiwgYm9yZGVyID0gRkFMU0UpDQogbGluZXMoZGYkeCwgZGYkRiwgbHdkID0gMikNCiAjYWRkIHJlZCBsaW5lcyBvbiBib3JkZXJzIG9mIHBvbHlnb24NCiBsaW5lcyhkZiR4LCBkZiRVLCBjb2w9InJlZCIsbHR5PTIpDQogbGluZXMoZGYkeCwgZGYkTCwgY29sPSJyZWQiLGx0eT0yKQ0KYGBgDQoNCg0KIyMjIFRp4bq/cCB0aGVvIHTDtGkgc+G6vSBoxrDhu5tuZyBk4bqrbiBjw6FjIGLhuqFuIGdp4bqjaSBxdXnhur90IGLDoGkgdG/DoW4gxJHGoW4gZ2nhuqNuIGjGoW4gduG7m2kgdmnhu4djIHPhu60gZOG7pW5nIGdncGxvdDIgaG/hurdjIGR5Z3JhcGhzIMSR4buRaSB24bubaSB4dHMgb2JqZWN0cy4gVMO0aSBz4bq9IG7Ds2kgdHLGsOG7nW5nIGjhu6NwIHBo4bupYyB04bqhcCBoxqFuIMSRw7MgbMOgIHRow6ptIG5oaeG7gXUgY29uZmlkZW5jZSBpbnRlcnZhbHMgduG7m2kgbGluZSBjaGFydCB2w6BvIGPDuW5nIDEgYmnhu4N1IMSR4buTOg0KDQoqKlThuqFvIEThu68gbGnhu4d1IMSR4buDIHRo4buxYyBoaeG7h24gZGVtbyoqDQoNCmBgYHtyfQ0KI0NyZWF0ZSB4dHMgZGF0YQ0KZGYgPC0gZGF0YS5mcmFtZSgidmFsdWUiID0gYygxLDIsMyw0LDUpLCAidXBwZXIxIiA9IGMoMS4yLCAyLjMsIDMuMSwgNC42LCA1LjkpLCAibG93ZXIxIiA9IGMoMC41LCAxLjgsIDIuNiwgMy43LCA0LjkpLCAidXBwZXIyIiA9IGMoMS4yLCAyLjEsIDMuNSwgNC44LCA1LjkpLCAibG93ZXIyIiA9IGMoMC4zLCAxLjQsIDIuNywgMy41LCA0LjgpKQ0KZGF0ZXMgPC0gYygiMjAxNC0xMC0wMSIsICIyMDE0LTExLTAxIiwgIjIwMTQtMTItMDEiLCAiMjAxNS0wMS0wMSIsICIyMDE1LTAyLTAxIikNCnRpbWUgPC0gYXMuRGF0ZShkYXRlcykNCm5ld19kZiA8LSB4dHM6OmFzLnh0cyhkZiwgb3JkZXIuYnkgPSB0aW1lKQ0KYGBgDQoNCioqc+G7rSBk4bulbmcgZ2dwbG90Mjo6cmliYm9uKioNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGYsIGFlcyh0aW1lKSkgKw0KICAgIGdlb21fcmliYm9uKGFlcyh5bWluID0gbG93ZXIyLCB5bWF4ID0gdXBwZXIyKSwgZmlsbCA9ICJwaW5rIiwgYWxwaGEgPSAwLjcpICsgDQogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3dlcjEsIHltYXggPSB1cHBlcjEpLCBmaWxsID0gInBpbmsiLCBhbHBoYSA9IDAuOSkgKyANCiAgICBnZW9tX2xpbmUoYWVzKHkgPSB2YWx1ZSksIGFscGhhID0gMC45LCBjb2xvciA9ICJyZWQiKSArIA0KICAgIHRoZW1lX2J3KCkNCmBgYA0KDQojIyMgU+G7rSBk4bulbmcgZHlncmFwaHM6DQoNCmBgYHtyfQ0KbGlicmFyeShkeWdyYXBocykNCmR5Z3JhcGgobmV3X2RmLCBtYWluID0gInRlc3RpbmciKSAlPiUNCiAgZHlTZXJpZXMoYygibG93ZXIxIiwgInZhbHVlIiwgInVwcGVyMSIpLCBsYWJlbCA9ICJudW0xIikgJT4lIA0KICBkeVNlcmllcyhjKCJsb3dlcjIiLCAidmFsdWUiLCAidXBwZXIyIiksIGxhYmVsID0gIm51bTIiKSAlPiUNCiAgZHlSYW5nZVNlbGVjdG9yKCkNCmBgYA0K