Выравнивание значений оси X по нулю (HR = 1) с помощью сетки - PullRequest
1 голос
/ 08 июля 2019

Я хотел выровнять три графика, полученные с помощью ggplot, по отношению рисков = 1,0 с grid.arrange.Есть ли в любом случае, чтобы изменить масштаб вывода, представленного на этом графике и вертикально выровнять его по HR = 1?

Please see below for the desired output.

boxLabels = c("Black", "Hispanic", "Asian", "Pacific Islander")

df <- data.frame(
  yAxis = length(boxLabels):1,
  boxOdds = c(6.07,1.35,1.05,4.56),
  boxCILow = c(1.23,0.23,0.26,1.20),
  boxCIHigh = c(29.92,7.83,4.15,17.24)
)

p <- ggplot(df, aes(x = boxOdds, y = yAxis))
p <- p + geom_vline(aes(xintercept = 1), size = .25, linetype = "dashed") +
  geom_errorbarh(aes(xmax = boxCIHigh, xmin = boxCILow), size = .5, height = .2, color = c('#e495a5','#abb065','#39beb1','#aca4e2')) +
  geom_point(size = 3.5, color = "gray38") +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  scale_y_continuous(breaks = yAxis, labels = boxLabels) +
  scale_x_continuous(breaks = c(0,1,5,10,15,20,25,30) ) +
  coord_trans(x = "log10") +
  #ylab("Changes in AHR (Referent: Never AHR)") +
  ylab(expression(atop("Race/Ethnicity"))) +
  xlab("Hazard ratio (COPD mortality)") +
  annotate(geom = "text", y =1.0, x = 1.0, label ="", size = 3.5, hjust = 0) + 
  ggtitle("") 
p

df2 <- data.frame(
  yAxis = length(boxLabels):1,
  boxOdds = c(1.09,0.80,1.07,1.19),
  boxCILow = c(0.53,0.38,0.75,0.77),
  boxCIHigh = c(2.24,1.72,1.5,1.83)
)

p2 <- ggplot(df2, aes(x = boxOdds, y = yAxis))
p2 <- p2 + geom_vline(aes(xintercept = 1), size = .25, linetype = "dashed") +
  geom_errorbarh(aes(xmax = boxCIHigh, xmin = boxCILow), size = .5, height = .2, color = c('#e495a5','#abb065','#39beb1','#aca4e2')) +
  geom_point(size = 3.5, color = "gray38") +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  scale_y_continuous(breaks = yAxis, labels = boxLabels) +
  scale_x_continuous(breaks = c(0,0.5,1,1.5,2,2.5,3)) +
  coord_trans(x = "log10") +
  ylab(expression(atop("Race/Ethnicity"))) +
  xlab("Hazard ratio (CVD mortality)") +
  annotate(geom = "text", y =1.0, x = 1.0, label ="", size = 3.5, hjust = 0) + 
  ggtitle("") 
p2

df3 <- data.frame(
  yAxis = length(boxLabels):1,
  boxOdds = c(0.47,0.90,0.85,0.92),
  boxCILow = c(0.19,0.44,0.60,0.59),
  boxCIHigh = c(1.14,1.84,1.19,1.42)
)

p3 <- ggplot(df3, aes(x = boxOdds, y = yAxis))
p3 <- p3 + geom_vline(aes(xintercept = 1), size = .25, linetype = "dashed") +
  geom_errorbarh(aes(xmax = boxCIHigh, xmin = boxCILow), size = .5, height = .2, color = c('#e495a5','#abb065','#39beb1','#aca4e2')) +
  geom_point(size = 3.5, color = "gray38") +
  theme_bw() +
  theme(panel.grid.minor = element_blank()) +
  scale_y_continuous(breaks = yAxis, labels = boxLabels) +
  scale_x_continuous(breaks = c(0,0.5,1,1.5,2,2.5,3)) +
  coord_trans(x = "log10") +
  ylab(expression(atop("Race/Ethnicity"))) +
  xlab("Hazard ratio (Cancer mortality)") +
  annotate(geom = "text", y =1.0, x = 1.0, label ="", size = 3.5, hjust = 0) + 
  ggtitle("") 
p3

theme_set(theme_pubr())

library("gridExtra")
grid.arrange(p, p2, p3)

Я хотел выровнять три графика, полученных с помощью ggplot, по отношению опасности = 1,0 с grid.arrange.Есть ли в любом случае, чтобы изменить масштаб вывода, представленного на этом графике и вертикально выровнять его по HR = 1?

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Альтернатива для установки одинаковых ограничений на ось х для каждого из графиков.Вы можете сделать это, используя тот же масштаб и добавив аргумент пределов к каждому из ваших вызовов scale_x_continuous.

Вам нужно будет выбрать соответствующие ограничения для вашего набора данных.Используя предоставленные данные, используются пределы 0,1 и 30

library(ggplot2)
library(gridExtra)

boxLabels = c("Black", "Hispanic", "Asian", "Pacific Islander")

df <- data.frame(
      yAxis = length(boxLabels):1,
      boxOdds = c(6.07,1.35,1.05,4.56),
      boxCILow = c(1.23,0.23,0.26,1.20),
      boxCIHigh = c(29.92,7.83,4.15,17.24)
)
p <- ggplot(df, aes(x = boxOdds, y = yAxis))+
      geom_vline(aes(xintercept = 1), size = .25, linetype = "dashed") +
      geom_errorbarh(aes(xmax = boxCIHigh, xmin = boxCILow), 
                     size = .5, height = .2, color = c('#e495a5','#abb065','#39beb1','#aca4e2')) +
      geom_point(size = 3.5, color = "gray38") +
      theme_bw() +
      theme(panel.grid.minor = element_blank()) +
      scale_y_continuous(breaks = df$yAxis, labels = boxLabels) +
      scale_x_continuous(breaks = c(0,1,5,10,15,20,25,30), limits = c(.1,30)) +
      coord_trans(x = "log10") +
      #ylab("Changes in AHR (Referent: Never AHR)") +
      ylab(expression(atop("Race/Ethnicity"))) +
      xlab("Hazard ratio (COPD mortality)") +
      annotate(geom = "text", y =1.0, x = 1.0, label ="", size = 3.5, hjust = 0) + 
      ggtitle("") 
p

df2 <- data.frame(
      yAxis = length(boxLabels):1,
      boxOdds = c(1.09,0.80,1.07,1.19),
      boxCILow = c(0.53,0.38,0.75,0.77),
      boxCIHigh = c(2.24,1.72,1.5,1.83)
)

p2 <- ggplot(df2, aes(x = boxOdds, y = yAxis))+
      geom_vline(aes(xintercept = 1), size = .25, linetype = "dashed") +
      geom_errorbarh(aes(xmax = boxCIHigh, xmin = boxCILow), size = .5, height = .2, color = c('#e495a5','#abb065','#39beb1','#aca4e2')) +
      geom_point(size = 3.5, color = "gray38") +
      theme_bw() +
      theme(panel.grid.minor = element_blank()) +
      scale_y_continuous(breaks = df2$yAxis, labels = boxLabels) +
      # scale_x_continuous(breaks = c(0,0.5,1,1.5,2,2.5,3)) +
      scale_x_continuous(breaks = c(0,1,5,10,15,20,25,30), limits = c(.1,30)) +
      coord_trans(x = "log10") +
      ylab(expression(atop("Race/Ethnicity"))) +
      xlab("Hazard ratio (CVD mortality)") +
      annotate(geom = "text", y =1.0, x = 1.0, label ="", size = 3.5, hjust = 0) + 
      ggtitle("") 
p2

df3 <- data.frame(
      yAxis = length(boxLabels):1,
      boxOdds = c(0.47,0.90,0.85,0.92),
      boxCILow = c(0.19,0.44,0.60,0.59),
      boxCIHigh = c(1.14,1.84,1.19,1.42)
)

p3 <- ggplot(df3, aes(x = boxOdds, y = yAxis)) +
      geom_vline(aes(xintercept = 1), size = .25, linetype = "dashed") +
      geom_errorbarh(aes(xmax = boxCIHigh, xmin = boxCILow), size = .5, height = .2, color = c('#e495a5','#abb065','#39beb1','#aca4e2')) +
      geom_point(size = 3.5, color = "gray38") +
      theme_bw() +
      theme(panel.grid.minor = element_blank()) +
      scale_y_continuous(breaks = df3$yAxis, labels = boxLabels) +
      # scale_x_continuous(breaks = c(0,0.5,1,1.5,2,2.5,3)) +
      scale_x_continuous(breaks = c(0,1,5,10,15,20,25,30), limits = c(.1,30)) +
      coord_trans(x = "log10") +
      ylab(expression(atop("Race/Ethnicity"))) +
      xlab("Hazard ratio (Cancer mortality)") +
      annotate(geom = "text", y =1.0, x = 1.0, label ="", size = 3.5, hjust = 0) + 
      ggtitle("") 
p3

theme_set(ggpubr::theme_pubr())

grid.arrange(p, p2, p3)

enter image description here

1 голос
/ 08 июля 2019

Один из способов сделать это будет с facet_wrap.Вместо этого вы захотите создать один фрейм данных с переменной для набора данных.Это упростит процесс, поскольку придется наносить график один раз.Используя scales = "fixed" в пределах facet_wrap, вы можете выравнивать оси по графикам.Вот упрощенный пример:

library("dplyr")
library("ggplot2")

boxLabels = c("Black", "Hispanic", "Asian", "Pacific Islander")

df1 <- data.frame(
  yAxis = length(boxLabels):1,
  boxOdds = c(6.07,1.35,1.05,4.56),
  boxCILow = c(1.23,0.23,0.26,1.20),
  boxCIHigh = c(29.92,7.83,4.15,17.24),
  data = 1
)

df2 <- data.frame(
  yAxis = length(boxLabels):1,
  boxOdds = c(1.09,0.80,1.07,1.19),
  boxCILow = c(0.53,0.38,0.75,0.77),
  boxCIHigh = c(2.24,1.72,1.5,1.83),
  data = 2
)

df <- bind_rows(df1, df2)

ggplot(df, aes(x = boxOdds, y = yAxis)) + 
  geom_vline(aes(xintercept = 1), size = .25, linetype = "dashed") +
  geom_errorbarh(aes(xmax = boxCIHigh, xmin = boxCILow), size = .5, height = .2) +
  geom_point(size = 3.5, color = "gray38") +
  facet_wrap(~data, nrow = 2, scale = "fixed")

enter image description here

...