Trong một vài trường hợp chúng ta cần minh họa sự biến thiên tương đồng hoặc tương phản của 2 biến số theo một biến số chung nào đó. Ví dụ, số ca mắc mới covid19 hoặc số bệnh nhân ra viện sau lành bệnh do covid19 trong cùng thời điểm.
Thông thường biến thiên của 2 biến số Y này khác nhau, ví dụ số ca mắc mới khoảng 1000 ca/ngày, trong khi số bệnh nhân ra viện trong khoảng 500 bệnh nhân/ ngày. Vì vậy phải có sự điều chỉnh biên độ (range) của 2 biến số để đồ thị được đặt ở vị trí tương đối gần, dễ so sánh.
Trong bài này tôi lấy data từ dịch covid19 ở tỉnh Đồng Nai để minh họa.
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.4 ✓ dplyr 1.0.7
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0
## ✓ readr 2.0.1 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
library(ggthemes)
library("readxl")
library("dplyr")
library(ggplot2)
df <- read_excel("/Users/nnthieu/Downloads/Donacovid21.xlsx")
df <- df %>% mutate_at(vars(date2), as.Date, format="%Y-%m-%d") #character to Date
ggplot(df, aes(x=date2, y=newcases)) +
geom_line(color="red", 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("Số Ca Bệnh Mới Theo Ngày Ở Đồng Nai từ 17/8/2021 đến 22/9/2021") +
ylab("Số Ca Bệnh") +
xlab("Ngày")
Note that the echo = FALSE
parameter was added to the code chunk to prevent printing of the R code that generated the plot.
mean(df$discharge)
## [1] 488.0476
ggplot(df, aes(x=date2, y=discharge)) +
geom_line(color="steel blue", size=1) +
ylim(0,1900) +
geom_hline(yintercept=500, color="steel blue", size=.5) +
ggtitle("Số Bệnh Nhân Ra Viện Theo Ngày Ở Đồng Nai từ 17/8/2021 đến 26/9/2021") +
ylab("Số Bệnh Nhân") +
xlab("Ngày")
Kết nối 2 biểu đồ trên cùng một graph, code như sau. Lưu ý, code “trans = ~./1” mục đích là điều chỉnh biên độ của 2 biến số y làm cho trục thứ 2 (second axis) phù hợp tương đối với trục y thức nhất.
library(ggplot2)
ggplot(df, aes(x=date2)) +
geom_line( aes(y=newcases), size= 1, color="red") +
geom_line( aes(y=discharge), size= 0.5, color = "steel blue") +
scale_y_continuous(
# Features of the first axis
name = " Ca Nhiễm Mới",
# Add a second axis and specify its features
sec.axis = sec_axis(trans = ~./1, name="Bệnh Nhân Ra Viện")) +
theme(
axis.title.y = element_text(color = "red", size=13),
axis.title.y.right = element_text(color = "steel blue", size=13)
) +
ggtitle("Ca Covid19 Mới và Số Bệnh Nhân Ra Viện")
Cám ơn các bạn đa đọc bài viết.