我有一个数据集(测试),如下所示:
Type Met1 Met2 Met3 Met4
TypeA 65 43 97 77
TypeA 46 25 76 77
TypeA 44 23 55 46
TypeA 46 44 55 77
TypeA 33 22 55 54
TypeB 66 8 66 47
TypeB 55 76 66 65
TypeB 55 77 88 46
TypeB 36 67 55 44
TypeB 67 55 76 65
我已经在箱形图上检查了很多链接,但我仍然没有成功获得我想要的箱形图类型。我希望有一个箱形图,我的X轴有所有Mets(Met1,Met2,Met3,Met4)的A型(黄色,橙色)。从本质上讲,我想要以下内容(取自here):
我正在尝试像
这样的事情boxplot(formula = len ~ Type , data = test, subset == "TypeA")
boxplot(formula = len ~ Type , data = test, subset == "TypeA", add=TRUE)
Legend(legend = c( "typeA", "typeB" ), fill = c( "yellow", "orange" ) )
但我无法解决任何问题。任何人都可以帮助我知道如何以更正的方式在我的测试数据上制作这样的箱形图?
答案 0 :(得分:19)
ggplot2
的解决方案。
首先,使用test
将数据框melt
转换为长格式:
library(reshape2)
test.m <- melt(test)
绘制数据:
library(ggplot2)
ggplot(test.m, aes(x = variable, y = value, fill = Type)) +
geom_boxplot() +
scale_fill_manual(values = c("yellow", "orange"))
答案 1 :(得分:6)
正如其他人所说,首先你需要融化你的数据。
df <- read.table(text="Type Met1 Met2 Met3 Met4
TypeA 65 43 97 77
TypeA 46 25 76 77
TypeA 44 23 55 46
TypeA 46 44 55 77
TypeA 33 22 55 54
TypeB 66 8 66 47
TypeB 55 76 66 65
TypeB 55 77 88 46
TypeB 36 67 55 44
TypeB 67 55 76 65",header=TRUE)
library(reshape2)
df2 <- melt(df)
boxplot(
formula = value ~ variable,
data = df2,
boxwex = 0.25,
at = 1:4 - 0.2,
subset = Type == "TypeA",
col = "yellow",
main = "blah",
xlab = "x",
ylab = "y",
ylim = c( 0, ceiling( max( df2$value ) ) + 1 ),
yaxs = "i" )
boxplot(
formula = value ~ variable,
data = df2,
boxwex = 0.25,
at = 1:4 + 0.2,
subset = Type == "TypeB",
col = "orange",
add = TRUE )
答案 2 :(得分:3)
test <- structure(list(Type = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L), .Label = c("TypeA", "TypeB"), class = "factor"),
Met1 = c(65L, 46L, 44L, 46L, 33L, 66L, 55L, 55L, 36L, 67L
), Met2 = c(43L, 25L, 23L, 44L, 22L, 8L, 76L, 77L, 67L, 55L
), Met3 = c(97L, 76L, 55L, 55L, 55L, 66L, 66L, 88L, 55L,
76L), Met4 = c(77L, 77L, 46L, 77L, 54L, 47L, 65L, 46L, 44L,
65L)), .Names = c("Type", "Met1", "Met2", "Met3", "Met4"),
class = "data.frame", row.names = c(NA, -10L))
# install.packages("ggplot2", dependencies = TRUE)
require(ggplot2)
require(reshape2)
df <- melt(test)
p <- ggplot(df, aes(factor(variable), value)) + geom_boxplot(aes(fill = Type))
p
答案 3 :(得分:2)
您可以使用reshape
函数创建包含Met1,..,Met4列中所有数据的长列。它还会创建一个列(temp$time
)来标识数据来自哪一列,您可以使用它来对您的箱形图进行分层(temp$Type*temp$time
)。
df <- read.table(text=
"Type Met1 Met2 Met3 Met4
TypeA 65 43 97 77
TypeA 46 25 76 77
TypeA 44 23 55 46
TypeA 46 44 55 77
TypeA 33 22 55 54
TypeB 66 8 66 47
TypeB 55 76 66 65
TypeB 55 77 88 46
TypeB 36 67 55 44
TypeB 67 55 76 65",header=TRUE)
temp <- reshape(df, direction='long', varying = 2:5, sep='')
boxplot(temp$Met ~ temp$Type*temp$time, col=c("yellow", "orange"))