Timeseries là đồ thị chuỗi thời gian. Các bạn tham khảo kết quả phân tích mẫu nước để hiểu cách vẽ đồ thị này nhé.

Vẽ bằng base-R graphics

options(width = 200)
library(readxl)
data_1 <- read_excel("test_1.xlsx",
                     sheet = "Water Quality", 
                     range = "AZ7:BF50")

data_1 <- as.data.frame(data_1)

sapply(data_1, class)
## $day
## [1] "POSIXct" "POSIXt" 
## 
## $pH
## [1] "numeric"
## 
## $total_ammonia_nitrogen
## [1] "numeric"
## 
## $nitrite
## [1] "numeric"
## 
## $dissolved_oxygen
## [1] "numeric"
## 
## $temperature
## [1] "numeric"
## 
## $salinity
## [1] "numeric"
data_1
##           day       pH total_ammonia_nitrogen    nitrite dissolved_oxygen temperature salinity
## 1  2022-08-11 6.483601             0.05998792 0.00000000         7.115938    33.93516 9.527480
## 2  2022-08-12 9.735767                     NA         NA         7.006581    31.32774 8.364751
## 3  2022-08-13 8.634653                     NA         NA         6.848394    39.67200 6.348649
## 4  2022-08-14 9.373907             0.20896914 0.06486626         9.921044    38.87469 8.671763
## 5  2022-08-15 8.235977                     NA         NA         8.689734    30.73168 7.471763
## 6  2022-08-16 7.922731                     NA         NA         9.021819    37.08597 6.274478
## 7  2022-08-17       NA                     NA         NA         8.123651    34.61852 6.657327
## 8  2022-08-18 7.810531             0.17121826 0.24949588         7.105878    34.06103 8.884701
## 9  2022-08-19 9.349299                     NA         NA         7.274762    36.67722 6.319860
## 10 2022-08-20 9.913328                     NA         NA         9.561454    39.41573 9.057417
## 11 2022-08-21 8.919318             0.23649883 0.12000000         6.508541    39.77721 6.309944
## 12 2022-08-22 9.442101                     NA         NA         6.728421    39.34810 8.559745
## 13 2022-08-23 6.495703                     NA         NA         7.558905    31.77676 9.594214
## 14 2022-08-24       NA                     NA         NA         7.550808    32.60600 7.482738
## 15 2022-08-25       NA             0.10833932 0.22577448         9.123366    31.87764 8.928095
## 16 2022-08-26 8.031496                     NA         NA         7.141884    35.72586 7.187219
## 17 2022-08-27 8.707216                     NA         NA         8.374158    37.82242 8.490954
## 18 2022-08-28 9.355425             0.15472560 0.08000000         9.291177    37.87837 6.111254
## 19 2022-08-29 7.796455                     NA         NA         9.296595    32.16546 8.786137
## 20 2022-08-30       NA                     NA         NA         7.668259    39.20593 7.494812
## 21 2022-08-31       NA                     NA         NA         8.980902    34.88181 7.343026
## 22 2022-09-01 7.823394             0.08222836 0.24884540         9.561228    37.13762 6.325238
## 23 2022-09-02 7.009612                     NA         NA         8.022073    32.44701 8.120396
## 24 2022-09-03 8.080000                     NA         NA         9.341224    31.79005 8.245495
## 25 2022-09-04       NA             0.00000000 0.19000000         8.370304    39.42649 6.460634
## 26 2022-09-05 8.614674                     NA         NA         9.954012    39.61962 9.344707
## 27 2022-09-06 7.680043                     NA         NA         6.042928    33.91563 9.207883
## 28 2022-09-07       NA                     NA         NA         7.760082    39.77862 9.108411
## 29 2022-09-08 6.002886             0.00000000 0.22697945         8.899884    38.48310 7.813860
## 30 2022-09-09 8.594872                     NA         NA         9.725894    38.65799 6.980183
## 31 2022-09-10       NA                     NA         NA         9.253289    38.55731 8.592848
## 32 2022-09-11       NA             0.17302148 0.17500000         8.424449    37.40832 7.673065
## 33 2022-09-12 9.983757                     NA         NA         8.454844    30.25309 8.857115
## 34 2022-09-13       NA                     NA         NA         9.711735    31.74760 7.470784
## 35 2022-09-14       NA                     NA         NA         8.399588    36.41311 8.590657
## 36 2022-09-15       NA             0.20546269 0.17524820         9.763491    38.41826 6.949832
## 37 2022-09-16       NA                     NA         NA         6.658635    34.38066 6.290941
## 38 2022-09-17       NA                     NA         NA         6.654338    36.91343 7.619416
## 39 2022-09-18       NA             0.07000000 0.11500000         7.787158    36.26957 6.897467
## 40 2022-09-19 7.940000                     NA         NA         7.207710    36.68730 6.945568
## 41 2022-09-20       NA                     NA         NA         9.597726    38.67047 8.385105
## 42 2022-09-21       NA                     NA         NA         7.404706    38.38850 9.807404
## 43 2022-09-22       NA             0.00000000 0.08300000         7.037988    33.22073 9.006370
# data_1$day <- 1:dim(data_1)[1]

oldpar <- par(no.readonly=TRUE)

par(mfrow = c(6, 1), mar = c(2.2, 3, 2.5, 1), cex = 0.8)

plot(pH ~ day,
     na.omit(data_1[, c("pH", "day")]),
     type = "l", col = 2, las = 1, lwd = 2,
     xaxs = "i", yaxs = "i",
     ylim = c(min(data_1$pH, na.rm = TRUE)*0.8, max(data_1$pH, na.rm = TRUE)*1.2),
     xlim = c(data_1$day[1], data_1$day[length(data_1$day)]),
     xlab = "", ylab = "",
     main = ""
     )
# title(xlab = "Ngày", line = 2)
# title(ylab = "pH", line = 3.5)
title(main = "pH", line = 0.5, cex.main = 0.9)

plot(total_ammonia_nitrogen ~ day,
     na.omit(data_1[, c("total_ammonia_nitrogen", "day")]),
     type = "l", col = 3, las = 1, lwd = 2,
     xaxs = "i", yaxs = "i",
     ylim = c(min(data_1$total_ammonia_nitrogen, na.rm = TRUE)*0.8, max(data_1$total_ammonia_nitrogen, na.rm = TRUE)*1.2),
     xlim = c(data_1$day[1], data_1$day[length(data_1$day)]),
     xlab = "", ylab = "",
     main = ""
)
# title(xlab = "Ngày", line = 2)
# title(ylab = "Total ammonia nitrogen (ppm)", line = 3.5)
title(main = "Total ammonia nitrogen (ppm)", line = 0.5, cex.main = 0.9)

plot(nitrite ~ day,
     na.omit(data_1[, c("nitrite", "day")]),
     type = "l", col = 4, las = 1, lwd = 2,
     xaxs = "i", yaxs = "i",
     ylim = c(min(data_1$nitrite, na.rm = TRUE)*0.8, max(data_1$nitrite, na.rm = TRUE)*1.2),
     xlim = c(data_1$day[1], data_1$day[length(data_1$day)]),
     xlab = "", ylab = "",
     main = ""
)
# title(xlab = "Ngày", line = 2)
# title(ylab = "Total ammonia nitrogen (ppm)", line = 3.5)
title(main = "Nitrite (ppm)", line = 0.5, cex.main = 0.9)

plot(dissolved_oxygen ~ day,
     na.omit(data_1[, c("dissolved_oxygen", "day")]),
     type = "l", col = 5, las = 1, lwd = 2,
     xaxs = "i", yaxs = "i",
     ylim = c(min(data_1$dissolved_oxygen, na.rm = TRUE)*0.8, max(data_1$dissolved_oxygen, na.rm = TRUE)*1.2),
     xlim = c(data_1$day[1], data_1$day[length(data_1$day)]),
     xlab = "", ylab = "",
     main = ""
)
# title(xlab = "Ngày", line = 2)
# title(ylab = "Total ammonia nitrogen (ppm)", line = 3.5)
title(main = "Dissolved oxygen (ppm)", line = 0.5, cex.main = 0.9)

plot(temperature ~ day,
     na.omit(data_1[, c("temperature", "day")]),
     type = "l", col = 6, las = 1, lwd = 2,
     xaxs = "i", yaxs = "i",
     ylim = c(min(data_1$temperature, na.rm = TRUE)*0.8, max(data_1$temperature, na.rm = TRUE)*1.2),
     xlim = c(data_1$day[1], data_1$day[length(data_1$day)]),
     xlab = "", ylab = "",
     main = ""
)
# title(xlab = "Ngày", line = 2)
# title(ylab = "Total ammonia nitrogen (ppm)", line = 3.5)
title(main = "Temperature (°C)", line = 0.5, cex.main = 0.9)

plot(salinity ~ day,
     na.omit(data_1[, c("salinity", "day")]),
     type = "l", col = 7, las = 1, lwd = 2,
     xaxs = "i", yaxs = "i",
     ylim = c(min(data_1$salinity, na.rm = TRUE)*0.8, max(data_1$salinity, na.rm = TRUE)*1.2),
     xlim = c(data_1$day[1], data_1$day[length(data_1$day)]),
     xlab = "", ylab = "",
     main = ""
)
# title(xlab = "Ngày", line = 2)
# title(ylab = "Total ammonia nitrogen (ppm)", line = 3.5)
title(main = "Salinity (ppt)", line = 0.5, cex.main = 0.9)
     
# Tạo tiêu đề chung cho 2 đồ thị
mtext("Số liệu phân tích nước | Đợt 1 | 2022",
  side = 3,
  line = -1.2,
  outer = TRUE
)

par(oldpar)

Vẽ bằng lattice package

library(zoo)
library(lattice)
z <- read.zoo(data_1, FUN = identity)

xyplot(na.approx(z),
  type = "l", col = "#01d086", lwd = 2, xlab = "",
  main = "Số liệu phân tích nước | Đợt 1 | 2022",
  strip = strip.custom(factor.levels = c(
    "pH",
    "Total ammonia nitrogen (ppm)",
    "Nitrite (ppm)",
    "Dissolved oxygen (ppm)",
    "Temperature (°C)",
    "Salinity (ppt)"
  )),
  par.settings = list(strip.background = list(col = "#fcf186")),
  scales = list(y = list(tick.number = 3))
)

Sơ kết

Trên đây là hướng dẫn vẽ đồ thị timeseries trong R. Để học R bài bản từ A đến Z, thân mời Bạn tham gia khóa học “HDSD R để xử lý dữ liệu” để có nền tảng vững chắc về R nhằm tự tay làm các câu chuyện dữ liệu của riêng mình!

ĐĂNG KÝ NGAY: https://www.tuhocr.com/register

Hướng dẫn cài đặt package tuhocr https://tuhocr.github.io/