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")
  )