为什么这个CSV数据与ggplot2 whisker图复杂化?

时间:2017-05-18 05:12:56

标签: r csv ggplot2 boxplot quartile

我可以使用测试数据重现工作ggplot2箱图,但不能使用R中的CSV数据。 关于事件(睡眠和清醒)的单点视觉数据

"Vars"    , "Sleep", "Awake"
"Average" , 7      , 12
"Min"     , 4      , 5
"Max"     , 10     , 15

关于睡眠的现实生活中的数据

"Vars"    , "Sleep1", "Sleep2", ...
"Average" , 7       , 5
"Min"     , 4       , 3
"Max"     , 10      , 8

关于觉醒的现实生活中的数据

"Vars"    , "Awake1", "Awake2", ...
"Average" , 12      , 14
"Min"     , 10      , 7
"Max"     , 15      , 17

数据集成的代码

# only single point!
dat.m <- structure(list(Vars = structure(c(1L, 3L, 2L), .Label = c("Average ", 
"Max     ", "Min     "), class = "factor"), Sleep = c(7, 4, 10
), Awake = c(12L, 5L, 15L)), .Names = c("Vars", "Sleep", "Awake"
), class = "data.frame", row.names = c(NA, -3L))

library('ggplot2')    
# works:
str(mpg)
#mpg$class
#mpg$hwy
ggplot(mpg, aes(x = class, y = hwy)) +
    geom_boxplot()

# http://stackoverflow.com/a/44031194/54964
m <- t(dat.m)    
dat.m <- data.frame(m[2:nrow(m),])
names(dat.m) <- m[1,]
dat.m$Vars <- rownames(m)[2:nrow(m)]
dat.m <- melt(dat.m, id.vars = "Vars")

# TODO complicates here although should not
ggplot(dat.m, aes(x = Vars, y = value, fill=variable)) + #
    geom_boxplot() 

图1中的测试数据输出和图2中的输出。

图。 1测试数据输出, 图2代码输出

enter image description here enter image description here

以下对四分位数的假设:

代码

 # http://stackoverflow.com/a/44043313/54964
 quartiles <- data.frame(Vars = c("Q1","Q3"), Sleep = c(6,8), 
               Awake = c(9,13))

我想设置Q1 <- 0.25 * averageQ3 <- 0.75 * average。 假设您有任意数量的主要字段(此处为SleepAwake)。 您如何请求数据(此处dat.m)获取每个主要字段的minmax

R:3.3.3
操作系统:Debian 8.7

1 个答案:

答案 0 :(得分:1)

使用四分位数base R制作箱形图有bxp()功能,但你需要知道第25,第50和第75百分位以及下四分位数(Q1),中位数(Q2)和上四分位数(Q3)。

例如:

bxp(list(stats = matrix(c( 4,6,7,9,10, 10,11,12,14,15), nrow = 5,
 ncol = 2), n = c(30,30), names = c("Sleep", "Awake")))

enter image description here

现在使用您的数据:(已编辑)

让我们使用您介绍的第一个数据集:

dat.m <- structure(list(Vars = structure(c(1L, 3L, 2L), .Label = c("Average ", 
"Max     ", "Min     "), class = "factor"), Sleep = c(7, 4, 10
), Awake = c(12L, 5L, 15L)), .Names = c("Vars", "Sleep", "Awake"
), class = "data.frame", row.names = c(NA, -3L))

> dat.m
      Vars Sleep Awake
1 Average      7    12
2 Min          4     5
3 Max         10    15


> str(dat.m)
'data.frame':   3 obs. of  3 variables:
 $ Vars : Factor w/ 3 levels "Average ","Max     ",..: 1 3 2
 $ Sleep: num  7 4 10
 $ Awake: int  12 5 15

在您的数据中,缺少第一个和第三个四分位数。第二个也是需要的,也就是中位数,但我们假设它等于均值。我会假设你拥有所有这些,例如:

quartiles <- data.frame(Vars = c("Q1","Q3"), Sleep = c(6,8), 
                    Awake = c(9,13))

> str(quartiles)
'data.frame':   2 obs. of  3 variables:
 $ Vars : Factor w/ 2 levels "Q1","Q3": 1 2
 $ Sleep: num  6 8
 $ Awake: num  9 13


data <- rbind(dat.m ,quartiles)

      Vars Sleep Awake
1 Average      7    12
2 Min          4     5
3 Max         10    15
4 Q1           6     9
5 Q3           8    13

然后对变量进行排序:

library(dplyr)
## Disable this line if you want to use the universal approach
data <-  dplyr::arrange(data, Sleep, Awake)
## Enable the following for more universal approach
# data <- arrange_(data, .dots = as.list(strsplit(colnames(data)[2:ncol(data)], ', '))) 

bxp(list(stats = as.matrix(data[,2:3]), n = c(30,30), names = names(data[,2:3]))) # assuming n = 30.

使用ggplot2

我们首先使用reshape2::melt()将数据集从“宽”格式转换为“长格式”。

library(reshape2)
library(ggplot2)
(data2 <- melt(data))

       Vars variable value
1  Min         Sleep     4
2  Q1          Sleep     6
3  Average     Sleep     7
4  Q3          Sleep     8
5  Max         Sleep    10
6  Min         Awake     5
7  Q1          Awake     9
8  Average     Awake    12
9  Q3          Awake    13
10 Max         Awake    15

然后:

ggplot(data2, aes(x = variable, y = value)) +
  geom_boxplot()

enter image description here

您可能会发现这些文章很有趣:

  1. 意义要点:使用箱形图(http://www.nature.com/nmeth/journal/v11/n2/full/nmeth.2813.html
  2. 可视化样本
  3. Box Plot:一种解释数据的简单视觉方法(http://annals.org/aim/article/703149/box-plot-simple-visual-method-interpret-data
  4. 箱形图的变化(http://amstat.tandfonline.com/doi/abs/10.1080/00031305.1978.10479236