Forestplot в R. Как добавить стрелки, разрывы оси x и расширить ось x?

Я создал лесной участок, используя пакет Forestplot и приведенный ниже код.

Есть три вещи, которые я хотел бы добавить:

  1. Добавьте стрелки и текст под осью X (т. е. стрелки в любом направлении поясняют связь).

Я просмотрел эти сообщения, используя другой пакет.

Как добавить стрелки в лес участок в survminer (ggforest)

Как добавить стрелки на лесной участок?< /а>

  1. Я также хотел бы разбить ось X, так как у меня есть одна переменная с очень широким CI.

  2. Я также хотел бы расширить отрицательную сторону оси x до -5, чтобы сбалансировать фигуру (хотя большинство точек данных находятся справа).

Я использую пакет лесного участка. Любые идеи, как это сделать с этим пакетом?

table2OR_ex <- structure(list(X = c("Aeroplanes", "Sex (F)", "1", "2", "Cars", "Sex (F)", "1", "2"), 
                 mean = c(NA, 1.35, 7.81, 6.14, NA, 1.17, 0.15, 0.4), 
                 lower = c(NA, 1.13, 5.69, 4.36, NA, 0.74, 0.05, 0.16), 
                 upper = c(NA, 1.61, 11.01, 8.83, NA, 1.88, 0.35, 0.89),
                 p.value = c("", "< 0.001", "< 0.001", "< 0.001", "", "0.509", "< 0.001", "0.034")), 

                 .Names = c("Transport", "mean", "lower", "upper", "p value"), 
                 class = "data.frame", row.names = c(NA, -8L))

tabletext <- cbind(c("Transport","\n",table2OR_ex$Transport), 
               c("Odds ratio","\n",table2OR_ex$mean),
               c("Confidence Interval","\n", 
                 ifelse(is.na(table2OR_ex$lower), "", paste(table2OR_ex$lower, table2OR_ex$upper, 
sep= " - "))))
mat <- rbind(rbind(rep(NA, 3), rbind(rep(NA, 3), as.matrix(table2OR_ex[, 2:4]))))


fn <- local({
i = 0
no_lines <- sum(!is.na(mat[,"mean"])) 
b_clrs = colorRampPalette(colors=c("pink", "blue"))(no_lines)
l_clrs = colorRampPalette(colors=c("blue", "pink"))(no_lines) 
function(..., clr.line, clr.marker){
    i <<- i + 1
    fpDrawDiamondCI(..., clr.line = l_clrs[i], clr.marker = b_clrs[i])
}
})

forestplot(labeltext=tabletext, 
       mat,
       graphwidth=unit (70, "mm"), 
       graph.pos=3, 
       fn.ci_norm = fn,
       clip =c(-.125, max(table2OR_ex$upper, na.rm = TRUE)),
       is.summary=c(TRUE, TRUE, rep(FALSE, 8)),
       txt_gp=fpTxtGp(label=gpar(fontsize=12, cex=1), 
                      ticks=gpar(fontsize=12, cex=1.4),
                      xlab=gpar(fontsize=12,cex = 1),
                      title=gpar(fontsize=12,cex = 1.2)),

       zero=1,
       boxsize=0.4)

person sar    schedule 13.05.2020    source источник


Ответы (1)


Здесь нет всего, что вы хотели, но это только начало. Может быть, кто-то еще может улучшить этот ответ.

  1. Я добавил метки слева и справа от нулевого значения, используя grid.text, но у него нет стрелок. Возможно, вам придется настроить значения y в grid.text так, чтобы метки не перекрывались с делениями по оси X.
  2. Я не знаю, как сделать разрыв по оси X, но отношения шансов должны быть нанесены на логарифмическую шкалу (см. https://doi.org/10.1002/sim.4780070807), и я думаю, что это решает проблему.
  3. Не имеет смысла иметь отрицательное значение по оси X, когда вы строите ОШ, но с логарифмической шкалой вы можете сделать ось X симметричной, установив нижнюю границу на обратную величину верхней границы, что это то, что я сделал.
library(forestplot)

table2OR_ex <- structure(list(X = c("Aeroplanes", "Sex (F)", "1", "2", "Cars", "Sex (F)", "1", "2"), 
                 mean = c(NA, 1.35, 7.81, 6.14, NA, 1.17, 0.15, 0.4), 
                 lower = c(NA, 1.13, 5.69, 4.36, NA, 0.74, 0.05, 0.16), 
                 upper = c(NA, 1.61, 11.01, 8.83, NA, 1.88, 0.35, 0.89),
                 p.value = c("", "< 0.001", "< 0.001", "< 0.001", "", "0.509", "< 0.001", "0.034")), 

                 .Names = c("Transport", "mean", "lower", "upper", "p value"), 
                 class = "data.frame", row.names = c(NA, -8L))

tabletext <- cbind(c("Transport","\n",table2OR_ex$Transport), 
               c("Odds ratio","\n",table2OR_ex$mean),
               c("Confidence Interval","\n", 
                 ifelse(is.na(table2OR_ex$lower), "", paste(table2OR_ex$lower, table2OR_ex$upper, 
sep= " - "))))
mat <- rbind(rbind(rep(NA, 3), rbind(rep(NA, 3), as.matrix(table2OR_ex[, 2:4]))))


fn <- local({
i = 0
no_lines <- sum(!is.na(mat[,"mean"])) 
b_clrs = colorRampPalette(colors=c("pink", "blue"))(no_lines)
l_clrs = colorRampPalette(colors=c("blue", "pink"))(no_lines) 
function(..., clr.line, clr.marker){
    i <<- i + 1
    fpDrawDiamondCI(..., clr.line = l_clrs[i], clr.marker = b_clrs[i])
}
})

ticks <- c(0.04, 0.2, 1, 5, 25) # ADDITION
attr(ticks, "labels") <- as.character(ticks) # ADDITION
#attr(ticks, "labels") <- c("1/25", "1/5", "1", "5", "25") # ADDITION

forestplot(labeltext=tabletext, 
       mat,
       graphwidth=unit (70, "mm"), 
       graph.pos=3, 
       fn.ci_norm = fn,
       mar = unit(rep(10, times = 4), "mm"), # ADDITION
       xlog=TRUE, # ADDITION
       xticks=ticks, # ADDITION
       clip =c(0.04, 25), # CHANGE
       is.summary=c(TRUE, TRUE, rep(FALSE, 8)),
       txt_gp=fpTxtGp(label=gpar(fontsize=12, cex=1), 
                      ticks=gpar(fontsize=12, cex=1.4),
                      xlab=gpar(fontsize=12,cex = 1),
                      title=gpar(fontsize=12,cex = 1.2)),

       zero=1,
       boxsize=0.4)

# ADDITION
downViewport("forestplot_margins")
downViewport("axis_margin")
downViewport("axis")
grid.text("Favors X", x=0.46, y=-0.25, just=c("right", "center"))
grid.text("Favors Y", x=0.54, y=-0.25, just=c("left", "center"))
person whatever    schedule 17.05.2020
comment
Спасибо. По какой-то причине это создает неравномерные размеры или края рамки (ромб выглядит неровным, как будто это два наложенных друг на друга изображения). - person sar; 21.05.2020
comment
Странный. Это так, когда вы экспортируете в PDF или только в панели предварительного просмотра? - person whatever; 22.05.2020