【问题标题】:Creating boxplot on log scale in R在 R 中创建对数刻度的箱线图
【发布时间】:2017-08-19 18:10:22
【问题描述】:

我正在尝试在 R 中绘制一个箱线图,其中输入文件有多个列,每列有不同的行数。借助以下链接提供的帮助:

boxplot of vectors with different length

我正在尝试:

x <- read.csv( 'filename.csv', header = T )
     plot(
       1, 1,
       xlim=c(1,ncol(x)), ylim=range(x[-1,], na.rm=TRUE), 
       xaxt='n', xlab='', ylab=''
       )
       axis(1, labels=colnames(x), at=1:ncol(x))

       for(i in 1:ncol(x)) {
       p <- x[,i]
       boxplot(p, add=T, at=i)
}

我正在尝试以对数刻度绘制值。但是定义 log =“y”,我收到以下错误:

xypolygon(xx, yy, lty = "blank", col = boxfill[i]) 中的错误: plot.new 还没有被调用

以下是我输入的 csv 数据的示例:

A         B        C        D
2345.42   932.19   40.8     26.19
138.48    1074.1   4405.62  4077.16
849.35    0.0      1451.66  1637.39
451.38    146.22   4579.6   5133.14
5749.01   7250.08  12.23    0.09
4125.48   129.46   49.51
440.38    6405.02 

【问题讨论】:

  • 请同时提供一些数据。
  • 嗨@Roli,如果我的回答有帮助,请考虑接受它(答案左侧的复选标记)。这让社区知道答案有效并且解决了您的问题。

标签: r


【解决方案1】:

您的数据作为可重复的示例

注意我必须删除一个额外的元素

library(data.table)
df <- fread("A,B,C,D
    2345.42,932.19,40.8,26.19
    138.48,1074.1,4405.62,4077.16
    849.35,0.0,1451.66,1637.39
    451.38,146.22,4579.6,5133.14
    5749.01,7250.08,12.23,0.09
    4125.48,129.46,49.51,440.38", sep=",", header=T)

dplyr 和 tidyr 解决方案

library(dplyr)
library(tidyr)
df1 <- df %>% 
         replace(.==0,NA) %>%               # make 0 into NA
         gather(var,values,A:D) %>%         # convert from wide (4-col) to long (2-col) format
         mutate(values = log10(values))     # log10 transform

如果您想要log2,只需将log10 替换为log2

输出

boxplot(values ~ var, df1)

一点额外的

对于 log10 比例,我喜欢将 1 添加到我的值中,以消除自 log10(0 &lt; x &lt; 1) = -value 以来的负值。这会将您绘图上的最小值设置为0,因为0 + 1 = 1log10(1) = 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 2021-08-22
    • 2019-03-03
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多