Bài này minh họa các bước để thêm một line thể hiện biến thiên trung bình hay trend của một biến số theo thời gian.
Dữ liệu được sử dụng là Covid19 ở tỉnh Đồng Nai từ ngày 17/8/2021 đến 12/10/2021.
Package TTR cần thiết để tạo nên data biến thiên trung của một variable.
library(tidyverse)
library(ggthemes)
library(plyr)
library("dplyr")
library("readxl")
library("data.table")
library(TTR)
df <- read_excel("E:/CovidDongNai/Donacovid21.xlsx")
df <- df %>% mutate_at(vars(date2), as.Date, format="%Y-%m-%d") #character to Date
Để vẽ biểu đồ biến thiên của số ca nhiễm covid mới (newcases) và sau đó thêm vào đường biến thiên trung bình trong 7 ngày, tôi dùng function MAS của TTR để tạo ra biến số biến thiên trung bình MAS trước.
Lưu ý là từ ngày thứ n = 7 thì MAS mới có dữ liệu.
df$MAS <- TTR::SMA(df$newcases, n = 7)
head(df$MAS, 15)
[1] NA NA NA NA NA NA 686.0000 682.4286
[9] 707.5714 745.7143 771.4286 694.1429 687.1429 640.8571 689.8571
Vẽ biểu đồ số ca nhiễm covid mới và đường biến thiên trung bình n = 7 ngày.
pl <- ggplot(df, aes(x=date, y=newcases)) +
geom_line(color="#69b3a2", size=1) +
ylim(0,1500) +
geom_hline(yintercept=1000, color="orange", size=.5) +
geom_label(
data=df %>% filter(newcases > 1000), # Filter data first
aes(label=newcases)) +
ggtitle("So Ca Nhiem Moi Covid19 o Dong Nai
tu 17/8/2021 den 12/10/2021") +
ylab("So Ca Benh") +
xlab("Ngay")
pl + geom_line(aes(x=date, y=MAS, color = "steal blue"))+
scale_colour_discrete(labels = "Trung bình")
Warning: Removed 6 row(s) containing missing values (geom_path).

Đường màu đỏ thể hiện sự biến thiên trung bình 7 ngày của số ca nhiễm mới covid ở Đồng Nai.
LS0tDQp0aXRsZTogIkFkZCBhbiBBdmVyYWdlIE1vdmluZyBMaW5lIFRvIENoYXJ0Ig0KYXV0aG9yOiAiVGhpZXUgTmd1eWVuIg0KZGF0ZTogIjEwLzEzLzIwMjEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpCw6BpIG7DoHkgbWluaCBo4buNYSBjw6FjIGLGsOG7m2MgxJHhu4MgdGjDqm0gbeG7mXQgbGluZSB0aOG7gyBoaeG7h24gYmnhur9uIHRoacOqbiB0cnVuZyBiw6xuaCBoYXkgdHJlbmQgY+G7p2EgbeG7mXQgYmnhur9uIHPhu5EgdGhlbyB0aOG7nWkgZ2lhbi4NCg0KROG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgbMOgIENvdmlkMTkg4bufIHThu4luaCDEkOG7k25nIE5haSB04burIG5nw6B5IDE3LzgvMjAyMSDEkeG6v24gMTIvMTAvMjAyMS4NCg0KUGFja2FnZSBUVFIgY+G6p24gdGhp4bq/dCDEkeG7gyB04bqhbyBuw6puIGRhdGEgYmnhur9uIHRoacOqbiB0cnVuZyBj4bunYSBt4buZdCB2YXJpYWJsZS4NCg0KYGBge3IgfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeShwbHlyKQ0KbGlicmFyeSgiZHBseXIiKSAgICAgICAgICAgICAgICAgICAgICAgIA0KbGlicmFyeSgicmVhZHhsIikNCmxpYnJhcnkoImRhdGEudGFibGUiKSANCmxpYnJhcnkoVFRSKQ0KDQpkZiA8LSByZWFkX2V4Y2VsKCJFOi9Db3ZpZERvbmdOYWkvRG9uYWNvdmlkMjEueGxzeCIpDQpkZiA8LSBkZiAlPiUgbXV0YXRlX2F0KHZhcnMoZGF0ZTIpLCBhcy5EYXRlLCBmb3JtYXQ9IiVZLSVtLSVkIikgI2NoYXJhY3RlciB0byBEYXRlDQoNCmBgYA0KDQrEkOG7gyB24bq9IGJp4buDdSDEkeG7kyBiaeG6v24gdGhpw6puIGPhu6dhIHPhu5EgY2Egbmhp4buFbSBjb3ZpZCBt4bubaSAobmV3Y2FzZXMpIHbDoCBzYXUgxJHDsyB0aMOqbSB2w6BvIMSRxrDhu51uZyBiaeG6v24gdGhpw6puIHRydW5nIGLDrG5oIHRyb25nIDcgbmfDoHksIHTDtGkgZMO5bmcgZnVuY3Rpb24gTUFTIGPhu6dhIFRUUiDEkeG7gyB04bqhbyByYSBiaeG6v24gc+G7kSBiaeG6v24gdGhpw6puIHRydW5nIGLDrG5oIE1BUyB0csaw4bubYy4NCg0KTMawdSDDvSBsw6AgdOG7qyBuZ8OgeSB0aOG7qSBuID0gNyB0aMOsIE1BUyBt4bubaSBjw7MgZOG7ryBsaeG7h3UuDQoNCmBgYHtyIH0NCmRmJE1BUyA8LSBUVFI6OlNNQShkZiRuZXdjYXNlcywgbiA9IDcpDQpoZWFkKGRmJE1BUywgMTUpDQpgYGANCg0KVuG6vSBiaeG7g3UgxJHhu5Mgc+G7kSBjYSBuaGnhu4VtIGNvdmlkIG3hu5tpIHbDoCDEkcaw4budbmcgYmnhur9uIHRoacOqbiB0cnVuZyBiw6xuaCBuID0gNyBuZ8OgeS4NCg0KYGBge3J9DQpwbCA8LSBnZ3Bsb3QoZGYsIGFlcyh4PWRhdGUsIHk9bmV3Y2FzZXMpKSArDQogIGdlb21fbGluZShjb2xvcj0iIzY5YjNhMiIsIHNpemU9MSkgKw0KICB5bGltKDAsMTUwMCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MTAwMCwgY29sb3I9Im9yYW5nZSIsIHNpemU9LjUpICsNCiAgZ2VvbV9sYWJlbCggDQogICAgZGF0YT1kZiAlPiUgZmlsdGVyKG5ld2Nhc2VzID4gMTAwMCksICMgRmlsdGVyIGRhdGEgZmlyc3QNCiAgICBhZXMobGFiZWw9bmV3Y2FzZXMpKSArDQogICAgZ2d0aXRsZSgiU28gQ2EgTmhpZW0gTW9pIENvdmlkMTkgbyBEb25nIE5haSANCiAgICAgICAgICAgIHR1IDE3LzgvMjAyMSBkZW4gMTIvMTAvMjAyMSIpICsNCiAgICB5bGFiKCJTbyBDYSBCZW5oIikgKyANCiAgICB4bGFiKCJOZ2F5IikNCg0KcGwgKyBnZW9tX2xpbmUoYWVzKHg9ZGF0ZSwgeT1NQVMsIGNvbG9yID0gInN0ZWFsIGJsdWUiKSkrDQogICBzY2FsZV9jb2xvdXJfZGlzY3JldGUobGFiZWxzID0gIlRydW5nIGLDrG5oIikNCg0KDQpgYGANCg0KxJDGsOG7nW5nIG3DoHUgxJHhu48gdGjhu4MgaGnhu4duIHPhu7EgYmnhur9uIHRoacOqbiB0cnVuZyBiw6xuaCA3IG5nw6B5IGPhu6dhIHPhu5EgY2Egbmhp4buFbSBt4bubaSBjb3ZpZCDhu58gxJDhu5NuZyBOYWkuDQo=