为什么这个 CSV 数据与 ggplot2 晶须图复杂化?
Why this CSV data complicates with ggplot2 whisker plot?
我可以用 R 中的测试数据而不是 CSV 数据重现工作 ggplot2
箱线图。
关于事件(睡眠和清醒)的单点视觉数据
"Vars" , "Sleep", "Awake"
"Average" , 7 , 12
"Min" , 4 , 5
"Max" , 10 , 15
现实生活中关于睡眠的数据
"Vars" , "Sleep1", "Sleep2", ...
"Average" , 7 , 5
"Min" , 4 , 3
"Max" , 10 , 8
现实生活中关于Awake的数据
"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()
#
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 代码输出
以下四分位数假设:
代码
#
quartiles <- data.frame(Vars = c("Q1","Q3"), Sleep = c(6,8),
Awake = c(9,13))
我想设置 Q1 <- 0.25 * average
和 Q3 <- 0.75 * average
。
假设您有任意数量的主要字段(此处 Sleep
和 Awake
)。
如何请求数据(此处dat.m
)以获得每个主要字段的min
和max
?
R: 3.3.3
OS:Debian 8.7
有 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
在你的数据中,第一个和第三个四分位数丢失了。还需要第二个,即中位数,但让我们假设它等于均值。我假设您拥有所有这些,例如:
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
我们首先将数据集从 'wide' 转换为 'long' 格式 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()
您可能会对这些文章感兴趣:
我可以用 R 中的测试数据而不是 CSV 数据重现工作 ggplot2
箱线图。
关于事件(睡眠和清醒)的单点视觉数据
"Vars" , "Sleep", "Awake"
"Average" , 7 , 12
"Min" , 4 , 5
"Max" , 10 , 15
现实生活中关于睡眠的数据
"Vars" , "Sleep1", "Sleep2", ...
"Average" , 7 , 5
"Min" , 4 , 3
"Max" , 10 , 8
现实生活中关于Awake的数据
"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()
#
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 代码输出
以下四分位数假设:
代码
#
quartiles <- data.frame(Vars = c("Q1","Q3"), Sleep = c(6,8),
Awake = c(9,13))
我想设置 Q1 <- 0.25 * average
和 Q3 <- 0.75 * average
。
假设您有任意数量的主要字段(此处 Sleep
和 Awake
)。
如何请求数据(此处dat.m
)以获得每个主要字段的min
和max
?
R: 3.3.3
OS:Debian 8.7
有 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
在你的数据中,第一个和第三个四分位数丢失了。还需要第二个,即中位数,但让我们假设它等于均值。我假设您拥有所有这些,例如:
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
我们首先将数据集从 'wide' 转换为 'long' 格式 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()
您可能会对这些文章感兴趣: