R - заказ на боксплоте - PullRequest
       9

R - заказ на боксплоте

26 голосов
/ 23 ноября 2010

Я пытаюсь создать серию коробочных сюжетов в R , сгруппированных по 2 факторам. Мне удалось составить сюжет, но я не могу оформить коробки в правильном направлении.

Моя ферма данных, которую я использую, выглядит следующим образом:

Nitrogen    Species    Treatment
2           G          L
3           R          M
4           G          H
4           B          L
2           B          M
1           G          H

Я пытался:

boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment)

это упорядочивало коробки по алфавиту (сначала три были "Высокими" обработками, затем в пределах этих трех они были упорядочены по названию вида в алфавитном порядке).

alt text

Я хочу, чтобы в рамке был указан порядок Низкий> Средний> Высокий, а затем в каждой из этих групп G> R> B для вида.

Итак, я попытался использовать коэффициент в формуле:

f = ordered(interaction(mydata$Treatment, mydata$Species), 
            levels = c("L.G","L.R","L.B","M.G","M.R","M.B","H.G","H.R","H.B")

, то:

boxplot(mydata$Nitrogen~f)

однако ящики все еще загружаются в том же порядке. Ярлыки теперь другие, но ящики не сдвинулись.

Я вытащил каждый набор данных и нанес их все вместе по отдельности:

lg = mydata[mydata$Treatment="L" & mydata$Species="G", "Nitrogen"]
mg = mydata[mydata$Treatment="M" & mydata$Species="G", "Nitrogen"]
hg = mydata[mydata$Treatment="H" & mydata$Species="G", "Nitrogen"]
etc ..

boxplot(lg, lr, lb, mg, mr, mb, hg, hr, hb)

Это дает то, что я хочу, но я бы предпочел сделать это более элегантно, поэтому мне не нужно извлекать каждый из них отдельно для больших наборов данных.


Загружаемые данные:

mydata <-
structure(list(Nitrogen = c(2L, 3L, 4L, 4L, 2L, 1L), Species = structure(c(2L, 
3L, 2L, 1L, 1L, 2L), .Label = c("B", "G", "R"), class = "factor"), 
    Treatment = structure(c(2L, 3L, 1L, 2L, 3L, 1L), .Label = c("H", 
    "L", "M"), class = "factor")), .Names = c("Nitrogen", "Species", 
"Treatment"), class = "data.frame", row.names = c(NA, -6L))

Ответы [ 2 ]

30 голосов
/ 24 ноября 2010

Следующие команды создадут необходимый порядок упорядочения факторов Обработки и видов с явным упорядочением уровней вручную:

mydata$Treatment = factor(mydata$Treatment,c("L","M","H"))

mydata$Species = factor(mydata$Species,c("G","R","B"))

alt text


edit 1 : упс, я установил HML вместо LMH.fixing.

edit 2: какой фактор (X, Y) делает:

Если вы запускаете коэффициент (X, Y) для существующего фактора, он использует порядокзначений в Y для перечисления значений, присутствующих в факторе X. Вот несколько примеров с вашими данными.

> mydata$Treatment
[1] L M H L M H
Levels: H L M
> as.integer(mydata$Treatment)
[1] 2 3 1 2 3 1
> factor(mydata$Treatment,c("L","M","H"))
[1] L M H L M H                               <-- not changed
Levels: L M H                                 <-- changed
> as.integer(factor(mydata$Treatment,c("L","M","H")))
[1] 1 2 3 1 2 3                               <-- changed

Это НЕ меняет то, как выглядит фактор на первый взгляд, но оно меняет то, какданные хранятся

Здесь важно то, что многие функции печати будут отображать наименьшее перечисление слева, затем следует следующее и т. Д.

Если вы создаете факторы просто с помощью factor(X), то обычно перечисление основано наалфавитный порядок уровней факторов (например, «H», «L», «M»).Если ваши метки имеют обычный порядок, отличный от алфавитного (т. Е. «H», «M», «L»), это может сделать ваши графики странными.

На первый взгляд может показаться, что проблема связана с упорядочением данных во фрейме данных, т. Е. Если бы только мы могли поместить все буквы «H» вверху и «L» внизу, тоэто будет работать.Это не так.Но если вы хотите, чтобы ваши метки отображались в том же порядке, что и первое вхождение в данных, вы можете использовать эту форму:

 mydata$Treatment = factor(mydata$Treatment, unique(mydata$Treatment))
11 голосов
/ 23 ноября 2010

Этот предыдущий вопрос StackOverflow показывает, как изменить порядок boxplot на основе числового значения;то, что вам нужно здесь, это, вероятно, просто переключение с factor на связанный тип ordered.Но трудно сказать, поскольку у нас нет ваших данных, и вы не предоставили воспроизводимый пример.

Редактировать Используя набор данных, который вы разместили в переменной md и полагаясь на решениеЯ указывал ранее, мы получаем

R> md$Species <- ordered(md$Species, levels=c("G", "R", "B"))
R> md$Treatment <- ordered(md$Treatment, levels=c("L", "M", "H"))
R> with(md, boxplot(Nitrogen ~ Species * Treatment))

, который создает диаграмму, которую вы хотели создать.

Это также эквивалентно другому решению, представленному здесь.

...