Коробки для групп?
У меня есть набор данных (тест), как показано ниже:
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, имеющую тип A (желтый, оранжевый) для всех Mets (Met1, Met2, Met3, Met4). В сущности, я хочу что-то вроде следующего (взято из здесь):
![введите описание изображения здесь]()
Я пытаюсь что-то вроде
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" ) )
Но я не могу с этим справиться. Может ли кто-нибудь помочь мне узнать, как я могу сделать такие полевые диаграммы на своих тестовых данных скорректированным образом?
Ответы
Ответ 1
Решение с 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"))
![enter image description here]()
Ответ 2
Как говорили другие, сначала вам нужно расплавить свои данные.
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 )
Ответ 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
![enter image description here]()
Вы смотрите страницу руководства geom_boxplot.
Ответ 4
Вы можете использовать функцию 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"))