Проблема : факторы на x-axis не меняются

Допустим, у меня есть эта коробочка

enter image description here

Сгенерировано с этими данными:

set.seed(1)
y <- data.frame(loglos = log2(runif(1000)),
                corona = as.factor(c(rep("C19", 50), rep("Normal", 50))),
                type = as.factor(c("Vascular", "Hydro", "Trauma", "Tumor", "Infection")))

У меня есть несколько подкатегорий в моем наборе данных, где я проверяю среднюю разницу в продолжительности приема (y$loglos - log2 - шкала) для типов операций до и во время блокировки COVID-19. Я хочу применить for-loop для выполнения этой повторяющейся задачи.

p_perc_ <- c()
p_conf_ <- c()

for(i in unique(y$type)){
  aa <- t.test(y$loglos[y$type == i] ~ relevel(y$corona[y$type == i], ref = "C19"))
  bb <- round(1-2^(aa$estimate[1] - aa$estimate[2]), digits = 3)*(-100)
  p_perc_[i] <- paste0(bb, "%")
  
  p_conf_[i] <- paste0(round(1-2^(aa$conf.int[1]), digits = 3) * -100, 
                      "; ", 
                      round(1-2^(aa$conf.int[2]), digits = 3) * -100)
  
}

В настоящее время метки x-axis хорошо печатают название операции (type), процентные изменения и 95% доверительный интервал.

Однако я хочу переупорядочить x-axis, но мне не удалось использовать эти попытки. Порядок должен быть следующим: «Гидро», «Сосудистый», «Травма», «Инфекция», «Опухоль» .

< Сильный > ( 1 )

ggplot(y,
       aes(x = type, y = loglos, color = corona, fill = corona)) + 
  geom_boxplot() + 
  scale_y_continuous(name = "",
                     breaks = seq(-8, 0, 4),
                     limits = c(-8, 0)) +
  
  scale_x_discrete(name = "",
                   limits = c("Hydro", "Vascular", "Trauma", "Infection", "Tumor"),
                   labels = paste0(unique(y$type), "<br>", "<b>", p_perc_, "</b>", "<br><sub>(", p_conf_, ")</sub>")) +
  
  theme(axis.text.x = ggtext::element_markdown(color = "grey20", size = 12))

< Сильный > ( 2 )

ggplot(y,
       aes(x = type, y = loglos, color = corona, fill = corona)) + 
  geom_boxplot() + 
  scale_y_continuous(name = "",
                     breaks = seq(-8, 0, 4),
                     limits = c(-8, 0)) +
  
  scale_x_discrete(name = "",
                   limits = factor(y$type, c("Hydro", "Vascular", "Trauma", "Infection", "Tumor")),
                   labels = paste0(unique(y$type), "<br>", "<b>", p_perc_, "</b>", "<br><sub>(", p_conf_, ")</sub>")) +
  
  theme(axis.text.x = ggtext::element_markdown(color = "grey20", size = 12))
  

< Сильный > ( 3 )

ggplot(y %>% mutate(type = fct_relevel(type, c("Hydro", "Vascular", "Trauma", "Infection", "Tumor"))),
       aes(x = type, y = loglos, color = corona, fill = corona)) + 
  geom_boxplot() + 
  scale_y_continuous(name = "",
                     breaks = seq(-8, 0, 4),
                     limits = c(-8, 0)) +
  
  scale_x_discrete(name = "",
                   limits = unique(y$type),
                   labels = paste0(unique(y$type), "<br>", "<b>", p_perc_, "</b>", "<br><sub>(", p_conf_, ")</sub>")) +
  
  theme(axis.text.x = ggtext::element_markdown(color = "grey20", size = 12))

(4)

ggplot(y %>% mutate(type = factor(type, levels = c("Hydro", "Vascular", "Trauma", "Infection", "Tumor"))),
       aes(x = type, y = loglos, color = corona, fill = corona)) + 
  geom_boxplot() + 
  scale_y_continuous(name = "",
                     breaks = seq(-8, 0, 4),
                     limits = c(-8, 0)) +
  
  scale_x_discrete(name = "",
                   limits = unique(y$type),
                   labels = paste0(unique(y$type), "<br>", "<b>", p_perc_, "</b>", "<br><sub>(", p_conf_, ")</sub>")) +
  
  theme(axis.text.x = ggtext::element_markdown(color = "grey20", size = 12))
2
cmirian 26 Ноя 2021 в 13:22
Forloop у меня не работает - объект bb не найден
 – 
zx8754
26 Ноя 2021 в 13:31
2
Аргумент limits в (1) правильный, но вы переопределяете метки, используя unique(y$type), поэтому они появляются в неправильном порядке. вам также нужно быть осторожным, чтобы не присвоить неправильную метку неправильному уровню при их создании. я бы, вероятно, построил их вне команды ggplot
 – 
George Savva
26 Ноя 2021 в 13:31
Спасибо за комментарий. for-loop должен быть исправлен. Был бы признателен за представленный ответ.
 – 
cmirian
26 Ноя 2021 в 13:50

1 ответ

Лучший ответ

Это то, что вы хотите, смотрите комментарии?

set.seed(1)
y <- data.frame(loglos = log2(runif(1000)),
                corona = as.factor(c(rep("C19", 50), rep("Normal", 50))),
                type = as.factor(c("Vascular", "Hydro", "Trauma", "Tumor", "Infection")))
str(y$type)
levels(y$type)
#you can see these are ordered in the incorrect way (alphabetical)
#[1] "Hydro"     "Infection" "Trauma"    "Tumor"     "Vascular" 

#wanted order: "Hydro", "Vascular", "Trauma", "Infection", "Tumor
#reorder levels as suggested in comments
myorder <- c("Hydro", "Vascular", "Trauma", "Infection", "Tumor")
y$type <- factor(y$type, levels = myorder)


p_perc_ <- c()
p_conf_ <- c()

for(i in unique(y$type)){
  aa <- t.test(y$loglos[y$type == i] ~ relevel(y$corona[y$type == i], ref = "C19"))
  bb <- round(1-2^(aa$estimate[1] - aa$estimate[2]), digits = 3)*(-100)
  p_perc_[i] <- paste0(bb, "%")
  
  p_conf_[i] <- paste0(round(1-2^(aa$conf.int[1]), digits = 3) * -100, 
                       "; ", 
                       round(1-2^(aa$conf.int[2]), digits = 3) * -100)
  
}

#need to order these too
p_perc_ <- p_perc_[myorder]
p_conf_ <- p_conf_[myorder]

ggplot(y,
       aes(x = type, y = loglos, color = corona, fill = corona)) + 
  geom_boxplot() + 
  scale_y_continuous(name = "",
                     breaks = seq(-8, 0, 4),
                     limits = c(-8, 0)) +
  
  scale_x_discrete(name = "",
                   limits = c("Hydro", "Vascular", "Trauma", "Infection", "Tumor"),
                   #instead of unique, use levels
                   labels = paste0(levels(y$type), "<br>", "<b>", p_perc_, "</b>", "<br><sub>(", p_conf_, ")</sub>")) +
  
  theme(axis.text.x = ggtext::element_markdown(color = "grey20", size = 12))

enter image description here

1
user63230 26 Ноя 2021 в 15:18
Спасибо за комментарий! Это закрыто. При вашем подходе ярлыки x-axis упорядочивают правильный y$type. Однако p_perc_ и p_conf_ не упорядочиваются соответствующим образом, поэтому процентное изменение с доверительными интервалами не соответствует y$type на x-axis.
 – 
cmirian
26 Ноя 2021 в 15:06
1
Пропустил это, см. обновление, в качестве обходного решения я заказал p_perc_ и p_conf_ после их расчета, я думаю, что это прямо сейчас
 – 
user63230
26 Ноя 2021 в 15:19
1
Спасибо за помощь мне!
 – 
cmirian
26 Ноя 2021 в 15:27