R - заказ на коробчатом графике

Я пытаюсь создать серию коробчатых диаграмм в 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))

person Robert    schedule 23.11.2010    source источник
comment
boxplot(mydata$Nitrogen~mydata$Species*mydata$Treatment) и boxplot(mydata$Nitrogen~f) создают для меня два разных сюжета, причем последний заказывается в том порядке, в котором вы хотите.   -  person Joshua Ulrich    schedule 23.11.2010
comment
верхний совет - используйте кнопку кода (или отступ 4), чтобы добавить код. Это чище, чем использование ‹code› и ‹br›   -  person Alex Brown    schedule 24.11.2010


Ответы (2)


Следующие команды создадут нужный вам порядок, перестроив факторы Лечение и Виды с явным ручным упорядочиванием уровней:

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

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

alt text


изменить 1: к сожалению, я установил HML вместо LMH. фиксация.

изменить 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))
person Alex Brown    schedule 23.11.2010
comment
См. Правку в моем сообщении - я не уверен, что это правда. - person Dirk Eddelbuettel; 24.11.2010
comment
изменение уровней не приводит к изменению перечисленных меток. Однако это влияет на перечисление этих меток. См. Мой комментарий в вашем ответе для более подробной информации. Обратите внимание, что график теперь находится в запрошенном порядке. - person Alex Brown; 24.11.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))

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

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

person Dirk Eddelbuettel    schedule 23.11.2010
comment
Я нашел этот пример отлично воспроизводимым. Используйте следующую команду для загрузки его данных: mydata=read.table(textConnection(scan(,"character",sep="\n")),head=TRUE) Затем вставьте данные его таблицы, а затем ^D - person Alex Brown; 24.11.2010
comment
Упорядоченный здесь не требуется - явный порядок уровней факторов есть. - person Alex Brown; 24.11.2010
comment
Это не делает мой вопрос неправильным, но в худшем случае неэффективным. Что случилось с твоим рвением при отрицательных голосах? - person Dirk Eddelbuettel; 24.11.2010
comment
Абсолютно фрейм данных остался прежним - должен. Однако, изменяя порядок уровней в факторе, функции построения графиков, такие как прямоугольная диаграмма, решетка и ggplot, отображают данные на экране в другом порядке. - person Alex Brown; 24.11.2010
comment
Алексей, ваш комментарий к заказанному все еще неверен. Присвоение упорядоченной факторной переменной к типу ordered также яснее. - person Dirk Eddelbuettel; 24.11.2010
comment
@Dirk, его комментарий верен для ggplot, где нужен фактор в правильном порядке, а не упорядоченный фактор. - person Brandon Bertelsen; 24.11.2010