处理ggplot

时间:2018-05-31 09:50:23

标签: r ggplot2

我正在尝试可视化一些数据,这些数据包含嵌套在国家/地区的区域的优势比和置信区间。我正在使用geom_pointrange选项,它一般很好用。

我的问题是,由于优势比(和上限置信区间)可以获得相当高的值,因此绘制了曲线的轴以适应这一点。结果是,介于0和1之间的置信区间不够清晰。我通过这个社区找到的一个选项是将值更改为因子,并且对于每个测量,它们之间的距离将被视为相同。这适用于优势比(仍然需要调整轴刻度线)但是当涉及较低和较高置信区间的值时,位置是完全错误的并且置信区间不包括点估计。我试图通过将所有值包含在因子的水平来解决这个问题,但这似乎并没有解决问题。

我要做的是能够“放大”图形中0到1之间的区域,同时保持绘图区域的其余部分不变或设法使ggplot正确放置置信区间比值比。

下面我列出了我的数据的简化版本以及我用于重新生成的代码。

dat <- data.frame(region = rep(LETTERS[1:5], 2), 
              country = rep(c("A1", "A2"), each = 5), 
              or = c(6.459578, 1.696221, 0.895115, 3.393235, 2.325510, 
                     4.457805, 0.407111, 22.760861, 3.354883, 2.214915), 
              lower = c(5.768999699, 0.237062909, 0.347443105, 0.369881529, 
                        0.010233696, 1.020315696, 0.004419494, 3.87391259, 
                        0.808667764, 0.874415935), 
              upper = c(7.2328221, 12.1367207, 2.3060778, 31.1290104, 
                        28.4497981, 19.4763489, 0.750188, 337.2960785, 
                        13.9182469,    5.610429))

library(ggplot2)

 ggplot(dat, aes(x = region, y = or, ymin = lower, ymax = upper))+
   geom_pointrange() +
   geom_hline(yintercept = 1, linetype = 2) +
   theme_bw() + 
   theme(plot.margin = unit(c(1, 1, 1, 4), "lines"),
         axis.title = element_blank(),
         axis.ticks.y = element_blank(),
         panel.grid.major = element_blank(),
         panel.grid.minor = element_blank(), 
         legend.position="none") + 
   facet_wrap(~ country) + 
   coord_flip(ylim = c(0, 100))

 # Change numeric variable into factors
 f.levels <- c(dat$or, dat$lower, dat$upper)
 f.levels <- unique(f.levels)
 f.levels <- as.character(f.levels[order(f.levels)])

 dat$or <- factor(dat$or, levels = f.levels)
 dat$lower <- factor(dat$lower, levels = f.levels)
 dat$upper <- factor(dat$upper, levels = f.levels)

 ggplot(dat, aes(x = region, y = or, ymin = lower, ymax = upper))+
    geom_pointrange() +
    geom_hline(yintercept = 1, linetype = 2) +
    theme_bw() + 
    theme(plot.margin = unit(c(1, 1, 1, 4), "lines"),
          axis.title = element_blank(),
          axis.ticks.y = element_blank(),
          panel.grid.major = element_blank(),
          panel.grid.minor = element_blank(), 
          legend.position="none") + 
    facet_wrap(~ country) + 
    coord_flip(ylim = c(0, 30))

我对ggplot比较新,所以请原谅任何新手的错误。 对此问题的任何建议都非常感谢。

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为这个问题的标准解决方案是以log(10)的比例绘制OR。有关简洁的解释,请参阅https://blogs.sas.com/content/iml/2015/07/29/or-plots-log-scale.html

ggplot(dat, aes(x = region, y = or, ymin = lower, ymax = upper)) +
geom_pointrange() +
  geom_hline(yintercept = 1, linetype = 2) +
  scale_y_log10() + ### This is the line that makes the transfomation
  theme_bw() + 
  theme(plot.margin = unit(c(1, 1, 1, 4), "lines"),
        axis.title = element_blank(),
        axis.ticks.y = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        legend.position="none") + 
  facet_wrap(~ country) + 
  coord_flip()

enter image description here