簡體   English   中英

ggplot2 / R中每個x值組合兩個箱形圖的困難

[英]Difficulties in combining two boxplots per x-value in ggplot2 / R

請在下面找到My Data

我希望生成一個組合箱形圖,如下所示:

在此處輸入圖片說明

我在w$WHO==1,2,3,4有四個不同的患者類別,每個類別分別對應於WHO-I,WHO-II,WHO-III和未知腫瘤。

我希望每w$WHO產生兩個箱線圖

第一個箱線圖應顯示死亡時間,如w$Follow.up.death[w$Death==1] 我想將顏色/輪廓+填充顏色設置為藍色,但填充顏色的alpha值應為0.2。

第二個箱線圖應顯示進展時間,如w$resp.time[w$response==1] 我想將顏色/輪廓+填充設為紅色,但填充的alpha值應為0.2。

w$Deathw$response的長度不同。

相應的圖例應顯示“總體生存期”和“無進展生存期”。

我嘗試了幾本手冊,但無法弄清楚具體如何做-我只設法制作了一張圖。

任何想法如何解決這個問題?

My data樣本

w <- structure(list(WHO = c(1L, 3L, 2L, 2L, 2L, 3L, 2L, 3L, 1L, 2L, 
3L, 3L, 3L, 1L, 2L, 1L, 2L, 3L, 3L, 1L, 2L, 1L, 3L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 4L, 4L, 1L, 4L, 1L, 2L, 1L, 4L, 1L, 4L, 4L, 4L, 
4L, 3L, 3L, 4L, 4L, 4L, 4L, 1L, 4L, 4L, 2L, 1L, 2L, 2L, 4L, 4L, 
4L, 2L, 4L, 1L, 4L, 4L, 2L, 4L, 4L, 3L, 4L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 3L, 2L, 2L, 3L, 3L, 3L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L
), Death = c(0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 
0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 
0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), Follow.up.death = c(18, 
2, 14, 17, 31, 4, 20, 15, 12, 19, 10, 17, 27, 22, 3, 43, 24, 
14, 13, 5, 12, 137, 22, 87, 48, 24, 72, 32, 14, 83, 68, 56, 57, 
18, 16, 70, 1.9, 69.2, 126.3, 41.6, 17.9, 1.3, 87.4, 4.4, 137.4, 
17.5, 95.8, 65.2, 14.8, 98.5, 16.6, 74.9, 10.3, 43.4, 32.5, 4.8, 
7.3, 107.8, 6.8, 18.3, 33, 25.2, 49.2, 15.9, 1.2, 42.7, 1, 9, 
1.8, 15.6, 8.9, 15, 16.4, 7.7, 75.5, 12.2, 54.8, 22.2, 9.7, 14.3, 
5.2, 64.5, 21.8, 0.2, 7.3, 18.7, 5.1, 17.3, 27.4, 16, 24.2, 9.7, 
8.2, 5.7, 41.8, 10.6, 22.8, 4.8, 6, 4, 50, 21, 30, 5, 11, 12), 
    response = c(0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 
    1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 0L, 0L, 
    0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 
    0L, 0L, 0L, 0L, 0L), resp.time = c(18, 2, 13, 17, 22, 2, 
    6, 5, 12, 8, 3, 2, 1, 21, 2, 43, 4, 2, 4, 5, 0.1, 137, 4, 
    87, 17, 24, 72, 19, 14, 83, 68, 56, 57, 18, 14, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, 15.6, 8.9, 15, 16.4, 7.7, 75.5, 3, 54.8, 22.2, 12, 14.3, 
    6, 12, 21.8, 6, 3, 12, 3, 6, 3, 3, 12, 9.7, 3, 3, 12, 3, 
    6, 3, 6, 4, 50, 21, 30, 5, 11, 12)), .Names = c("WHO", "Death", 
"Follow.up.death", "response", "resp.time"), class = "data.frame", row.names = c(NA, 
-106L))

這接近嗎?

# Wrangling data into a digestable format
v <- w[w$Death == 1,]
vv <- w[w$response == 1,]
df <- data.frame(x = as.factor(c(v$WHO, vv$WHO)),
                 y = c(v$Follow.up.death, vv$resp.time),
                 f = rep(c("Death", "Response"), c(nrow(v), nrow(vv))))
df <- df[!is.na(df$x),]

然后進行繪圖:

ggplot(df) +
  geom_boxplot(aes(x, y, fill = f, colour = f)) +
  scale_x_discrete(name = "WHO") +
  scale_y_continuous(name = "Time") +
  # Alpha encoded as hex values as to force to apply on fill only
  # Not sure if alpha = 0.2 corresponds to '33'
  scale_fill_manual(values = c("#FF000033", "#0000FF33"), name = "Survival",
                    labels = c("Overall", "Progression-free")) +
  scale_colour_manual(values = c("red", "blue"), name = "Survival",
                      labels = c("Overall", "Progression-free"))

在此處輸入圖片說明

與@tuenbrand的方法類似,但是使用dplyr/tidyr處理數據:

library(tidyverse)
df <- w %>% 
  rename(Overall = "Follow.up.death", `Progression-free` = "resp.time") %>% 
  gather(key = Survival, value = Time, Overall, `Progression-free`) %>%
  filter((Death == 1 & Survival == "Overall") | 
         (response == 1 & Survival == "Progression-free")) %>% 
  mutate(WHO = paste("WHO:", WHO))

然后在WHO方面划分框線圖:

ggplot(df, aes(x = Survival, y = Time, fill = Survival)) + 
  geom_boxplot() + facet_wrap(~WHO, nrow = 1) +
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        axis.title.x = element_blank(),
        legend.position = "bottom")

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM