BIểu diễn CI, Median MAP
# Đọc dữ liệu
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
h <- read.csv("C:/Users/ADMIN/OneDrive/Desktop/Bài báo/Huyet dong ghep gan 5 ca.csv")
data <- h
# Long format cho CI và MAP
ci_long <- data %>%
pivot_longer(cols = starts_with("CI"), names_to = "Time", values_to = "CI") %>%
mutate(Time = parse_number(Time))
map_long <- data %>%
pivot_longer(cols = starts_with("MAP"), names_to = "Time", values_to = "MAP") %>%
mutate(Time = parse_number(Time))
# Gộp dữ liệu
combined <- left_join(ci_long, map_long, by = c("ID", "Time"))
# Nhãn thời điểm
combined <- combined %>%
mutate(Time_label = factor(Time, levels = 1:6,
labels = c("Sau khởi mê", "Cắt gan", "Vô gan",
"Tái tưới máu", "Gan mới", "Kết thúc mổ")))
# Tính median CI và MAP
median_data <- combined %>%
group_by(Time_label) %>%
summarise(median_CI = median(CI, na.rm = TRUE),
median_MAP = median(MAP, na.rm = TRUE)) %>%
ungroup()
# Scale MAP để đưa lên cùng trục với CI
scale_factor <- 10 # CI thường từ 2–8, MAP từ ~60–100, scale_factor ≈ 10 là hợp lý
# Vẽ biểu đồ
ggplot() +
# CI từng bệnh nhân
geom_line(data = combined %>% filter(ID %in% paste0("BN", 1:5)),
aes(x = Time_label, y = CI, group = ID, color = ID),
size = 1) +
# Median CI: nét đứt đen
geom_line(data = median_data,
aes(x = Time_label, y = median_CI, group = 1, color = "Median CI"),
linetype = "dashed", size = 1.2) +
# Median MAP: nét chấm đứt xanh dương, vẽ theo scale phụ
geom_line(data = median_data,
aes(x = Time_label, y = median_MAP / scale_factor, group = 1, color = "Median MAP"),
linetype = "dotdash", size = 1.2) +
# Điều chỉnh màu cho các đường
scale_color_manual(
values = c(
"BN1" = "#1b9e77",
"BN2" = "#d95f02",
"BN3" = "#7570b3",
"BN4" = "#e7298a",
"BN5" = "#66a61e",
"Median CI" = "black",
"Median MAP" = "darkblue"
)
) +
scale_y_continuous(
name = "CI",
sec.axis = sec_axis(~ . * scale_factor, name = "MAP (mmHg)")
) +
labs(title = "Biểu đồ CI của từng bệnh nhân và Median MAP",
x = "Thời điểm phẫu thuật",
color = "Chú thích") +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom",
legend.title = element_text(face = "bold")
)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Biểu diễn SVRI kèm median Nor
library(tidyverse)
# Đọc dữ liệu
data <- h
# Long format cho SVRI & NR
svri_long <- data %>%
pivot_longer(cols = starts_with("SVRI"), names_to = "Time", values_to = "SVRI") %>%
mutate(Time = parse_number(Time))
nr_long <- data %>%
pivot_longer(cols = starts_with("NR"), names_to = "Time", values_to = "NR") %>%
mutate(Time = parse_number(Time))
# Gộp lại
combined <- left_join(svri_long, nr_long, by = c("ID", "Time"))
# Nhãn thời điểm
combined <- combined %>%
mutate(Time_label = factor(Time, levels = 1:6,
labels = c("Sau khởi mê", "Cắt gan", "Vô gan",
"Tái tưới máu", "Gan mới", "Kết thúc mổ")))
# Tính median
median_data <- combined %>%
group_by(Time_label) %>%
summarise(median_SVRI = median(SVRI, na.rm = TRUE),
median_NR = median(NR, na.rm = TRUE)) %>%
ungroup()
# Scale để vẽ NR lên cùng biểu đồ
scale_factor <- 40000
# Vẽ biểu đồ
ggplot() +
# SVRI từng bệnh nhân
geom_line(data = combined %>% filter(ID %in% paste0("BN", 1:5)),
aes(x = Time_label, y = SVRI, group = ID, color = ID),
size = 1) +
# Median SVRI (nét đứt đen)
geom_line(data = median_data,
aes(x = Time_label, y = median_SVRI, group = 1, color = "Median SVRI"),
linetype = "dashed", size = 1.2) +
# Median NR (nét chấm đứt đỏ đậm)
geom_line(data = median_data,
aes(x = Time_label, y = median_NR * scale_factor, group = 1, color = "Median NR"),
linetype = "dotdash", size = 1.2) +
# Tùy chỉnh màu legend
scale_color_manual(
values = c(
"BN1" = "#1b9e77",
"BN2" = "#d95f02",
"BN3" = "#7570b3",
"BN4" = "#e7298a",
"BN5" = "#66a61e",
"Median SVRI" = "black",
"Median NR" = "firebrick"
)
) +
scale_y_continuous(
name = "SVRI",
sec.axis = sec_axis(~ . / scale_factor, name = "Median NR")
) +
labs(title = "Biểu đồ SVRI từng bệnh nhân và Median NR",
x = "Thời điểm phẫu thuật",
color = "Chú thích") +
theme_minimal() +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "bottom",
legend.title = element_text(face = "bold")
)
