【问题标题】:how to order the X-axis in a box plot or QQ plot in R?如何在 R 中的箱形图或 QQ 图中对 X 轴进行排序?
【发布时间】:2021-08-08 13:26:47
【问题描述】:

这是一个可重复的样本:

library(ggpubr)
library(rstatix)
library(tibble)

da.ma <-matrix(1:22000, 10, 22) ## a sample matrix

n <-seq(max(length(da.ma[1,]))) ## naming cols and rows
for (i in n) {
    c.names <- paste("k", n, sep = "")
}
colnames(da.ma) <- c.names 

n.pdf <-seq(length(da.ma[,1]))
for (i in n.pdf) {
    r.names <- paste("text",n.pdf, sep ="")
}
rownames(da.ma) <- r.names
col.names <-names(da.ma[1, ])

da.ma <-cbind(id = seq(length(da.ma[, 1])), da.ma) ##adding the id col
data <- as_tibble(da.ma)

in.anova <- data %>%
  gather(key = "Length", value = "TTR", colnames(data[, 2:23])) %>%
  convert_as_factor(id, Length)

到这里,您创建了数据,但是当您绘制绘图时,X 轴的顺序不正确:

ggboxplot(in.anova, x = "Length", y = "TTR", add = "point")

我需要它从k1 开始并上升到k24。但是,它从k1 开始,然后是k10k11k12 等。X 轴上的正确顺序是:k1k2k3、@987654334 @、...、k23k24

【问题讨论】:

  • 如果您将“长度”转换为有序因子,它会起作用:

标签: r plot boxplot anova


【解决方案1】:
in.anova$Length <- factor(in.anova$Length, levels = paste0("k", 1:22))  
ggboxplot(in.anova, x = "Length", y = "TTR", add = "point")

返回:

【讨论】:

    【解决方案2】:

    您可以使用具有预定义顺序的factor() 函数作为长度列的级别。

    library(rstatix)
    library(ggpubr)
    da.ma <-matrix(1:22000, 10, 22) ## a sample matrix
    
    n <-seq(max(length(da.ma[1,]))) ## naming cols and rows
    for (i in n) {
        c.names <- paste("k", n, sep = "")
    }
    colnames(da.ma) <- c.names 
    
    n.pdf <-seq(length(da.ma[,1]))
    for (i in n.pdf) {
        r.names <- paste("text",n.pdf, sep ="")
    }
    rownames(da.ma) <- r.names
    col.names <-names(da.ma[1,])
    
    da.ma <-cbind(id =seq(length(da.ma[,1])), da.ma) ##adding the id col
    library(tibble)
    data <- as_tibble(da.ma)
    
    in.anova <- data %>%
      gather(key = "Length", value = "TTR", colnames(data[,2:23])) %>%
      convert_as_factor(id, Length)
     
    
    #get unique length values             
    levels = unique(in.anova$Length)
    
    #order last two digits
    levels = levels[order(as.numeric(substr(levels,2,4)))]
    
    #change length column type as factor with predefined order previously
    in.anova$Length = factor(in.anova$Length,levels=levels )
    
    ggboxplot(in.anova, x = "Length", y = "TTR", add = "point")
    

    【讨论】:

      【解决方案3】:

      您的 X 轴按顺序,但按字母顺序。如果您在控制台中运行'k2' &gt; 'k11',您会明白我的意思。

      接下来,您的可重现示例。

      样本矩阵

      • 我会避免使用点表示法,因为这样的名称看起来像一个基本函数,而且会造成混淆;
      • 我建议在变量名和赋值运算符之间使用 空格 - 这样更易读;
      • 作为data 参数,您提供一个长度为22000 (1:22000) 的向量。同时你告诉matrix() 你想要一个10 行22 列的矩阵。由于 10 x 22 = 220 仅使用 22000 个值中的前 220 个,其余的将被忽略;
      • 您可以使用set.seed() 和例如sample() 生成随机数据的函数;

      最后,您的示例矩阵生成将如下所示:

      set.seed(67600941)
      
      mtrx <- matrix(sample(220), 10)
      

      行名、列名

      • 在大多数情况下,您不需要在 R 中循环。R 中的大多数函数都是矢量化的;
      • 您不需要将名称保存到单独的变量中,您可以直接分配它们;
      • 对于有序的列,我会使用前导零,这很容易通过sprintf() 函数实现;
      • 您不再使用行名,但我会保持原样;

      最终代码:

      rownames(mtrx) <- sprintf('text%02d', seq(nrow(mtrx)))
      colnames(mtrx) <- sprintf('k%02d',    seq(ncol(mtrx)))
      
      mtrx[1:5, 1:5]
      
      #        k01 k02 k03 k04 k05
      # text01 206 127   9   1 138
      # text02 191  46 220  59  73
      # text03 145  15 148 213 103
      # text04  80 115 211  62  79
      # text05  28  11 195 136  84
      

      数据预处理和绘图

      • 您可以在预处理期间使用tibble 中的rowid_to_column() 创建您的id 列;
      • 我会使用 pivot_longer() 而不是 gather(),因为 gather() 已被贬低;
      • 您无需关心级别,因为前导零会将您的 Length 按字母顺序排列;
      • 我没有将转换后的数据保存到中间变量中,只是为了节省空间。
      library(tidyverse)
      
      mtrx %>%
          as_tibble() %>%
          rowid_to_column('id') %>%
          pivot_longer(-id, names_to = 'Length', values_to = 'TTR') %>%
          mutate(Length = factor(Length)) %>%
          ggplot(aes(x = Length, y = TTR)) +
            geom_jitter() +
            geom_boxplot(fill = NA) +
            ggthemes::theme_few()
      

      【讨论】:

        猜你喜欢
        • 2010-10-08
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 2021-02-22
        • 1970-01-01
        相关资源
        最近更新 更多