R 为什么使用ggplot2触须图会使CSV数据复杂化?

R 为什么使用ggplot2触须图会使CSV数据复杂化?,r,csv,ggplot2,boxplot,quartile,R,Csv,Ggplot2,Boxplot,Quartile,我可以用测试数据复制工作ggplot2boxplot,但不能用R中的CSV数据。 关于事件的单点可视数据(睡眠和唤醒) 现实生活中关于睡眠的数据 "Vars" , "Sleep1", "Sleep2", ... "Average" , 7 , 5 "Min" , 4 , 3 "Max" , 10 , 8 现实生活中关于觉醒的数据 "Vars" , "Awake1", "Awake2", ... "Average" , 12

我可以用测试数据复制工作
ggplot2
boxplot,但不能用R中的CSV数据。 关于事件的单点可视数据(睡眠和唤醒)

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

"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() 
#只有一个点!

dat.m有
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")))

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

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

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
然后:

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

  • 重要点:用方框图可视化样本()
  • 方框图:解释数据的简单直观方法()
  • 方框图的变化()

  • 您是否正在尝试使用3个观察值进行箱线图绘制?但是,如果您确实想要绘制箱线图,请尝试:library(ggplot2);图书馆(E2);你指的是每个变量吗?“观察值”是单个值。如果是这样的话,你应该提供一个更好的数据集部分。这些数据仍然没有用处。绘图所需的是“原始”数据。该函数将在内部计算汇总统计信息,例如中值、IQR、最小值、最大值等;因此,这些统计数据在数据集中没有用处。@ed_sans我只有描述性统计数据,而不是数据本身,因此我想这样绘制这些值。这能做到吗?@LéoLéopoldertz준영, 请参阅上面“使用您的数据”部分的编辑。@LéoLéopoldHertz준영 可能将该行替换为:这些值(Q1和Q3)预计将被提供或包含在数据集(dat.m)或汇总统计数据中。对于这个特定的例子,我手动输入了一些值来解释函数。@LéoLéopoldertz준영, 如果您有原始或全部(未分组)数据,则可以计算包括中位数在内的四分位数。在本例中,只有最大值、最小值和平均值,这不足以计算四分位数。四分位数是独立的度量值,我认为仅使用平均值、最小值和最大值无法得到正确的估计。例如,如果你的分布是右偏的,那么第三个四分位数将与你建议的Q3=0.75*非常不同。
    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")))
    
    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.
    
    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()