如何在 ggplot 中为研究中的每个主题创建单独的图

问题描述 投票:0回答:1

我有交叉研究的数据,我需要绘制一些图表。 为所有受试者绘制“平均”图没有问题,但我还需要为每个受试者绘制单独的图,并叠加两种治疗(T 与 R)。还有另一个问题 - 如何为每个图分配一个主题 ID。以下是 4 名受试者的数据(可能更多,最多 100 名)。

结构(列表(主题 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4), seq = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), prd = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), 时间 = c(0, 0.333, 0.667, 1, 1.333, 1.667, 2, 2.5, 3, 3.5, 4、6、8、12、24、48、0、0.333、0.667、1、1.333、1.667、2、 2.5、3、3.5、4、6、8、12、24、48、0、0.333、0.667、1、1.333、 1.667、2、2.5、3、3.5、4、6、8、12、24、48、0、0.333、0.667、 1、1.333、1.667、2、2.5、3、3.5、4、6、8、12、24、48、0、 0.333、0.667、1、1.333、1.667、2、2.5、3、3.5、4、6、8、12、 24、48、0、0.333、0.667、1、1.333、1.667、2、2.5、3、3.5、 4、6、8、12、24、48、0、0.333、0.667、1、1.333、1.667、2、 2.5、3、3.5、4、6、8、12、24、48、0、0.333、0.667、1、1.333、 1.667, 2, 2.5, 3, 3.5, 4, 6, 8, 12, 24, 48), 浓度 = c(0, 0、103.041、301.731、371.722、341.099、326.791、279.52、262.657、 234.926、220.389、141.804、112.702、68.981、31.9、不适用、0、 0、0、0、11、24.436、57.257、122.065、159.702、271.629、402.88、 154.535、126.576、75.999、33.272、不适用、0、0、0、0、0、25.932、 134.108、257.836、250.676、237.466、248.142、142.511、116.839、 66.76、23.942、不适用、0、0、0、27.992、78.208、306.763、361.578、 303.356、248.948、193.574、184.743、104.518、76.36、44.371、 15.609、不适用、0、49.073、356.27、546.462、764.171、822.19、 910.403、818.073、687.538、601.246、598.949、301.036、265.579、 129.278、55.892、11.525、0、60.115、316.231、496.366、764.952、 1086.271、982.368、839.902、757.569、622.151、733.912、314.365、 242.839、138.138、67.617、15.515、0、0、51.362、135.969、 253.814、353.437、346.998、314.292、385.864、516.589、627.003、 263.782、274.407、127.667、45.013、不适用、0、0、0、59.682、237.216、 380.224、528.946、523.512、446.714、417.835、352.487、199.18、 195.568, 99.99, 39.81, NA), 药物 = c("T", "T", "T", "T", “T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、 “R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、 “R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、 “R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“T”、“T”、“T”、“T”、 “T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、 “R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、 “R”、“R”、“R”、“R”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、 “T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、 “T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、“T”、 “R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、“R”、 “R”,“R”,“R”,“R”)),row.names = c(NA,-128L),class = c(“tbl_df”, “tbl”,“data.frame”))

我用于“平均”图的代码如下:

data <-
  Totalplot |>   
  group_by(drug, time) |>
  summarise(conc = mean(conc, na.rm = TRUE))   
plot <-
  ggplot(
    data = data, aes(x = time, y = conc, color = drug)) +
  geom_point(
    aes(
      group = interaction(drug, time)), alpha = 0.5, shape = 2, position = position_jitter(width = 0.1, height = 0)) +
  geom_line(data = data, linewidth = 0.5) +
  xlab('Time, h') + 
  ylab('Drug X plasma conc. ng/ml') +
  labs(title = 'Mean plasma concentration') +
  theme_bw()      
ggplot2 split
1个回答
0
投票

使用

lapply

subjectsIDs <- unique(Totalplot$subj)
plots <- lapply(subjectIDs, function(x) {
  Totalplot %>% filter(subj == x) %>%
    ggplot(
      aes(x = time, y = conc, color = drug)) +
    geom_point(
      aes(
        group = interaction(drug, time)), alpha = 0.5, shape = 2, position = position_jitter(width = 0.1, height = 0)) +
    geom_line(linewidth = 0.5) +
    xlab('Time, h') + 
    ylab('Drug X plasma conc. ng/ml') +
    labs(title = 'Mean plasma concentration') +
    theme_bw()
})

不确定这是否是您为每个图分配主题 ID 的意思,但您可以命名图列表中的每个元素:

names(plots) <- subjectIDs

让您像这样访问每个图:

plots[["1"]]

enter image description here

或者,如果您希望将所有绘图排列在网格中:

plot <- Totalplot %>%
  ggplot(
    aes(x = time, y = conc, color = drug)) +
  geom_point(
    aes(
      group = interaction(drug, time)), alpha = 0.5, shape = 2, position = position_jitter(width = 0.1, height = 0)) +
  geom_line(linewidth = 0.5) +
  xlab('Time, h') + 
  ylab('Drug X plasma conc. ng/ml') +
  labs(title = 'Mean plasma concentration') +
  theme_bw() +
  facet_wrap(facets = vars(subj))
plot

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.