Коробки для групп?

У меня есть набор данных (тест), как показано ниже:

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"))