• R语言
  • box plot;按照定义的level绘图

Data

ID <- 1:20
conc <- round(rnorm(20, 100, 20), 1)
gene <- c("GA", "AT", "AT", "GA", "GA", "AT", "TT", "TT", "GA", "GG", "GA", "AT", "GT", "TT", "GT", "GA", "GT", "AT", "GT", "GG")
dt <- data.frame(ID, conc, gene)
dt[,3] = lapply(dt[,3],function(x) factor(x, levels=c("GA", "AT", "TT", "GG", "GT"))) # 运行到这里会出错

加上这一步骤的原因是, 尽管某个level缺失也要在x轴上标记出来,以防程序自动省略掉, 就是让数据循环中的每一个图保持这五个level。

错误提示

Warning message:
In [<-.data.frame(*tmp*, , 3, value = list(1L, 2L, 2L, 1L, 1L, :
provided 20 variables to replace 1 variables

绘图

boxplot(conc~as.factor(gene), data=dt, xaxt="n")
beeswarm(conc~as.factor(gene), data=dt, col="deeppink")

axis

axis(1, at=1:5, labels=c(paste0("GA","\n n=",length(dt[,2]=="GA")),
paste0("AT","\n n=",length(dt[,2]=="AT")),
paste0("TT","\n n=",length(dt[,2]=="TT")),
paste0("GG","\n n=",length(dt[,2]=="GG")),
paste0("GT","\n n=",length(dt[,2]=="GT"))))

请指教!

    AILING

    ...没看明白你的代码想实现什么,dt[,3]是数字向量,转成factor自然会失败。

    你想画什么样的图?

      AILING

      这里用不到lapply,直接修改levels即可

      dt <- data.frame(ID, conc, gene)
      #dt[,3] = lapply(dt[,3],function(x) factor(x, levels=c("GA", "AT", "TT", "GG", "GT"))) # 运行到这里会出错
      levels(dt[,3]) <- c("GA", "AT", "TT", "GG", "GT")

      另外绘图的话建议直接上手ggplot2,R的基础作图太麻烦了。
      你的图可以这样

      ID <- 1:20
      conc <- round(rnorm(20, 100, 20), 1)
      gene <- c("GA", "AT", "AT", "GA", "GA", "AT", "TT", "TT", "GA", "GG", "GA", "AT", "GT", "TT", "GT", "GA", "GT", "AT", "GT", "GG")
      dt <- data.frame(ID, conc, gene)
      levels(dt[,3]) <- c("GA", "AT", "TT", "GG", "GT")
      
      
      library(ggplot2)
      gg <- ggplot(data=dt,aes(x=gene,y=conc))+
        geom_boxplot()
      print(gg)

      效果:

        4 天 后

        tctcab 谢谢您。 原来可以这么简单。 偶尔会用ggplot2, 但是我还是基础阶段,先了解一下基础代码?