我收集了一些研究的数据。对于每项研究,我都会对性别变量的平均值以及是否存在显着差异感兴趣。对于每项研究,我都有男性和女性的平均值和95%的置信区间。

我想做的事情与此类似:


我使用了几种样式的点图(dotplot,dotplot2,Dotplot),但并没有完全到达那里。

使用Dotplot中的Hmisc,我设法拥有一个系列及其错误栏,但是我对如何添加第二个系列不知所措。

我使用Dotplot并按照给定here的建议获取了误差线的垂直结尾。

这是我正在使用的代码的工作示例

data<-data.frame(ID=c("Study1","Study2","Study3"),avgm=c(2,3,3.5),avgf=c(2.5,3.3,4))
data$lowerm <- data$avgm*0.9
data$upperm <- data$avgm*1.1
data$lowerf <- data$avgf*0.9
data$upperf <- data$avgf*1.1

# Create the customized panel function
mypanel.Dotplot <- function(x, y, ...) {
  panel.Dotplot(x,y,...)
  tips <- attr(x, "other")
  panel.arrows(x0 = tips[,1], y0 = y,
               x1 = tips[,2], y1 = y,
               length = 0.05, unit = "native",
               angle = 90, code = 3)
}

library(Hmisc)
Dotplot(data$ID ~ Cbind(data$avgm,data$lowerm,data$upperm), col="blue", pch=20, panel = mypanel.Dotplot,
        xlab="measure",ylab="study")

这将绘制三列数据,分别是男性的平均值(avgm)和95%置信区间的下限和上限(lowerm和upperm)。我还有其他三个系列,用于相同的研究,对女性受试者(avgf,lowerf,upperf)做相同的工作。

我的结果看起来像这样:

简而言之,缺少了什么:
  • 添加第二个系列(avgf),其均值和置信区间定义在同一研究的其他三个变量上
  • 添加了一些垂直抖动,这样它们就不会彼此重叠,但是即使它们重叠,读者也可以看到两者。
  • 最佳答案

    不幸的是,我无法使用Dotplot帮助您,但是我发现使用ggplot相当简单。您只需要稍微重新排列数据即可。

    library(ggplot2)
    # grab data for males
    df_m <- data[ , c(1, 2, 4, 5)]
    df_m$sex <- "m"
    names(df_m) <- c("ID", "avg", "lower", "upper", "sex")
    df_m
    
    # grab data for females
    df_f <- data[ , c(1, 3, 6, 7)]
    df_f$sex <- "f"
    names(df_f) <- c("ID", "avg", "lower", "upper", "sex")
    df_m
    
    # bind the data together
    df <- rbind(df_m, df_f)
    
    # plot
    ggplot(data = df, aes(x = ID, y = avg, ymin = lower, ymax = upper, colour = sex)) +
      geom_point(position = position_dodge(width = 0.2)) +
      geom_errorbar(position = position_dodge(width = 0.2), width = 0.1) +
      coord_flip() +
      scale_colour_manual(values = c("blue", "red")) +
      theme_classic()
    
      # if you want horizontal grid lines you may change the last line with:
      theme_bw() +
      theme(panel.grid.major.y = element_line(colour = "grey", linetype = "dashed"),
            panel.grid.major.x = element_blank(),
            panel.grid.minor.x = element_blank())
    

    10-04 23:22