Arhn - архитектура программирования

Порядок записей легенды в столбчатых диаграммах ggplot2 при помощи corre_flip ()

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

Предположим, у меня есть фрейм данных, например:

set.seed(1234)
my_df<- data.frame(matrix(0,8,4))
names(my_df) <- c("year", "variable", "value", "vartype")
my_df$year <- rep(2006:2007)
my_df$variable <- c(rep("VX",2),rep("VB",2),rep("VZ",2),rep("VD",2))
my_df$value <- runif(8, 5,10) 
my_df$vartype<- c(rep("TA",4), rep("TB",4))

что дает следующую таблицу:

  year variable    value vartype
1 2006       VX 5.568517      TA
2 2007       VX 8.111497      TA
3 2006       VB 8.046374      TA
4 2007       VB 8.116897      TA
5 2006       VZ 9.304577      TB
6 2007       VZ 8.201553      TB
7 2006       VD 5.047479      TB
8 2007       VD 6.162753      TB

Существует четыре переменных (VX, VB, VZ и VD), принадлежащих к двум группам типов переменных (TA и TB).

Я хотел бы отобразить значения в виде горизонтальных полос на оси y, упорядоченных по вертикали сначала по группам переменных, а затем по именам переменных, с разбивкой по годам, со значениями на оси x и цветом заливки, соответствующим переменной группа. (т.е. в этом упрощенном примере порядок должен быть сверху вниз, VB, VX, VD, VZ)

1) Моя первая попытка заключалась в следующем:

ggplot(my_df,        
    aes(x=variable, y=value, fill=vartype, order=vartype)) +
       # adding or removing the aesthetic "order=vartype" doesn't change anything
     geom_bar() + 
     facet_grid(. ~ year) + 
     coord_flip()

Однако переменные перечислены в обратном алфавитном порядке, но не по типу: эстетика order=vartype игнорируется.

введите описание изображения здесь

2) После ответа на аналогичный вопрос, который я опубликовал вчера, я попробовал следующее, основываясь на сообщении Полосы заказов на гистограмме ggplot2:

my_df$variable <- factor(
  my_df$variable, 
  levels=rev(sort(unique(my_df$variable))), 
  ordered=TRUE
)

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

введите описание изображения здесь

3) Следующее дает то же, что и 2 (выше):

my_df$vartype <- factor(
  my_df$vartype, 
  levels=sort(unique(my_df$vartype)), 
  ordered=TRUE
)

... который имеет те же проблемы, что и первый подход (переменные перечислены в обратном алфавитном порядке, группы игнорируются)

4) другой подход, основанный на исходном ответе на Полосы заказов на гистограмме ggplot2, также дает то же поле, что и 2, выше

my_df <- within(my_df, 
                vartype <- factor(vartype, 
                levels=names(sort(table(vartype),
                decreasing=TRUE)))
                ) 

Меня озадачивает тот факт, что, несмотря на несколько подходов, эстетика order=vartype игнорируется. Тем не менее, похоже, что это работает с несвязанной проблемой: http://learnr.wordpress.com/2010/03/23/ggplot2-changing-the-default-order-of-legend-labels-and-stacking-of-data/

Надеюсь, что проблема ясна и приветствую любые предложения.

Маттео

Вчера я отправил аналогичный вопрос, но, к сожалению, я сделал несколько ошибок при описании проблемы и предоставлении воспроизводимого примера. С тех пор я выслушал несколько предложений и тщательно искал в stakoverflow аналогичный вопрос и, насколько мне известно, применял все предложенные комбинации решений, но безрезультатно. Я снова отправляю вопрос надеюсь, что смогу решить мою проблему и, надеюсь, быть полезным для других.

04.09.2011

  • Дубликат: stackoverflow.com/q/5208679/602276 04.09.2011
  • Это не дубликат stackoverflow.com/q/5208679/602276. Пожалуйста, прочтите внимательно вопрос. 04.09.2011
  • Это действительно тот же вопрос. Вам необходимо указать уровни вашего фактора в том порядке, в котором вы хотите, чтобы они были на вашем графике. Связанный ответ расскажет вам, как это сделать. 04.09.2011
  • Что, исходя из удаленного вами ответа, предполагает определение порядка вручную. Как я объяснил в комментарии, который вы удалили, у меня есть несколько больших фреймов данных, которые мне нужно часто менять, и я бы не хотел каждый раз записывать строку из 30-40 11-символьных переменных. 04.09.2011
  • Ближе всего к решению этой проблемы я нашел следующее: ggplot(my_df, aes(x=reorder(variable,-as.numeric(vartype)), y=value, fill=vartype, order=vartype)) + geom_bar() + facet_grid(. ~ year) + coord_flip() Переменные TA находятся наверху, но внутри групп они расположены в обратном алфавитном порядке, поэтому это все еще не решение. На основе http://stackoverflow.com/questions/1735540/creating-a-pareto-chart-with-ggplot2-and-r 04.09.2011
  • +1 за обучение предоставлению воспроизводимого кода. 04.09.2011
  • @MatteoS Теперь вы задаете другой вопрос. Этот вопрос в том виде, в каком он поставлен, является дубликатом и, несомненно, будет закрыт. Ваш настоящий вопрос, похоже, связан с переплетением и сортировкой двух разных переменных. Я предлагаю вам изолировать и задать это как новый вопрос. 04.09.2011
  • @Andrie: из исходного вопроса я хотел бы отобразить значения в виде горизонтальных полос на оси y, упорядоченных по вертикали сначала по группам переменных, а затем по именам переменных, фасетированным по годам, со значениями на оси x и цветом заливки, соответствующими переменной группа. (т.е. в этом упрощенном примере порядок должен быть сверху вниз, VB, VX, VD, VZ) это исходный вопрос. Должен ли я опубликовать еще один? 04.09.2011
  • @MatteoS Присоединяйтесь к группе чата R здесь: chat.stackoverflow.com/rooms/106/r 04.09.2011
  • Я был бы рад, но, к сожалению, я только что зарегистрировался и у меня нет необходимых очков репутации ... 04.09.2011
  • @MatteoS Все участники чат-группы согласны с тем, что у вас есть интересный вопрос о сортировке векторов без алфавита. Предлагаю вам задать новый вопрос о вашей проблеме сортировки. Упростите свой пример, удалите код ggplot и задайте новый вопрос только о сортировке. 04.09.2011
  • Понятно (как вы догадались, я умею читать в чате, но, к сожалению, не могу писать). Я попытаюсь сформулировать вопрос в более общей форме, но, насколько я понимаю, это связано с проблемами построения графика ggplot2, поскольку порядок переменных иногда, кажется, учитывает его собственный. Я рад, что мой вопрос был нетривиальным, но я все еще ищу серебряную пулю в том, что касается моего сюжета. 04.09.2011
  • В более общем плане, я считаю, что существует проблема, связанная с corre_flip () при упорядочивании переменных. В моем исходном фрейме данных (не показанном выше) порядок групп в легенде правильный и соответствует таковому в фрейме данных, но вертикальный порядок переменных перевернут. (хотя сюжет концептуально отличается, проблема аналогична этой learnr.files.wordpress.com/2010/03/). Насколько я понимаю, это нечто большее, чем проблема порядка фрейма данных, а проблема, связанная с изменением порядка в ggplot2, возможно, связанная с corre_flip. 04.09.2011
  • Если вы используете код, который вы показали, variable и vartype не факторов. ggplot приведет их к факторам, и вы получите алфавитный порядок. Ваш вопрос почти не имеет отношения к ggplot и касается создания соответствующего порядка. 04.09.2011
  • +1 за ясный, хорошо продуманный и очевидно исследованный вопрос. Мне не кажется, что это обман, ничего не сказано о влиянии coord_flip() на SO. Я думаю, что есть разница между двумя совершенно одинаковыми вопросами и одним и тем же решением для двух разных вопросов. 05.09.2011
  • Оглядываясь назад, я мог бы прояснить вопрос. В любом случае, похоже, что проблемаordin_flip () уже обсуждалась здесь stackoverflow.com/questions/3744178/ggplot2-sorting-a-plot/ хотя по какой-то причине мои результаты поиска не отображались: извините за это. Думаю, я нашел общее решение и разместил его там. 05.09.2011

Ответы:


1

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

set.seed(1234)
df2 <- data.frame(year = rep(2006:2007), 
                  variable = rep(c("VX","VB","VZ","VD"), each = 2),
                  value = runif(8, 5,10),
                  vartype = rep(c("TA","TB"), each = 4))

Обратите внимание, что таким образом variable и vartype являются факторами. Если они не являются факторами, ggplot() будет их принуждать, и тогда вы останетесь с алфавитным порядком. Я сказал это раньше и, без сомнения, повторю это снова; приведите данные в правильный формат сначала перед тем, как вы начнете строить / анализировать данные.

Вам нужен следующий заказ:

> with(df2, order(vartype, variable))
[1] 3 4 1 2 7 8 5 6

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

> with(df2, reorder(variable, order(vartype, variable)))
[1] VX VX VB VB VZ VZ VD VD
attr(,"scores")
 VB  VD  VX  VZ 
1.5 5.5 3.5 7.5 
Levels: VB VX VD VZ

(игнорируйте бит attr(,"scores") и сосредоточьтесь на уровнях). У этого есть правильный порядок, но ggplot() будет рисовать их снизу вверх, а вы хотели сверху вниз. Я недостаточно знаком с ggplot(), чтобы знать, можно ли этим управлять, поэтому нам также нужно будет изменить порядок, используя decreasing = TRUE в вызове order().

Собирая все это вместе, мы получаем:

## reorder `variable` on `variable` within `vartype`
df3 <- transform(df2, variable = reorder(variable, order(vartype, variable,
                                                         decreasing = TRUE)))

Что при использовании с вашим кодом построения:

ggplot(df3, aes(x=variable, y=value, fill=vartype)) +
       geom_bar() + 
       facet_grid(. ~ year) + 
       coord_flip()

производит это:

переупорядоченный штриховой график

04.09.2011
  • Благодарю за решение! Оно работает. Тем не менее, при тщательном поиске я также обнаружил, что моя первоначальная проблема - это частный случай общей неприятности при использовании corre_flip (). 04.09.2011
  • @MatteoS Теперь вы понимаете, почему люди считали, что это еще один дубликат? Ответ тот же - измените порядок уровней фактора в том порядке, в котором вы хотите. Проблема заключалась в том, как получить такой порядок. Весь код ggplot был лишним и отвлекал. Это действительно помогает свести проблемы к их базовому уровню, а также точно сказать нам, чего вы хотите. Ответ Андри был почти точным, пока вы не упомянули в комментариях, что не хотите вводить заказ вручную. 04.09.2011
  • Теперь я понимаю, но здесь проблема с ggplot2. При использовании функции corre_flip () ось переворачивается, переменные, которые изначально упорядочены L- ›R, затем упорядочиваются B -› T, в то время как легенда им не соответствует. 04.09.2011
  • Проблема задокументирована в groups.google.com/group/ggplot2/browse_thread/thread/ mail-archive.com/[email protected]/msg145281.html и stackoverflow.com/questions/4000670/ с более или менее сложными обходными путями. К сожалению, мне не удалось предоставить достаточно общий фреймворк, чтобы проиллюстрировать мою проблему, и мне пришлось прибегнуть к предоставленному мною. Я все же попробую применить ваше решение к своим случаям! 04.09.2011
  • @MatteoS Я не понимаю, в чем проблема - все упорядочены неправильно без coord_flip() кода, который вы предоставили. 04.09.2011
  • На самом деле, именно в этом конкретном фреймворке данных я решил, что это в первую очередь проблема с порядком, и сформулировал ее как таковую. Прошу прощения за недоразумение, но я считаю, что упорядочение и corre_flip () взаимосвязаны. 04.09.2011
  • @MatteoS Насколько я понимаю, в ggplot принято строить уровни осей на основе факторов слева-направо на оси x и снизу-вверх. Он не предназначен для перерисовки, как если бы фигура была повернута. Порядок в легенде основан на levels(vartype), он не должен быть в подразумеваемом порядке (переупорядоченном) variable. Порядок и coord_flip() переплетаются только в смысле условностей представления факторов. Я думаю, вы видите 2 и 2 и переходите к ответу 5 здесь. 04.09.2011
  • Вы правы: переменные на оси x упорядочены L- ›R на основе levels(variable) (или, что то же самое, B-› T с coord_flip()), в то время как порядок легенды основан на levels(vartype), несмотря на то, что ни один из переменные - это упорядоченные факторы. Порядок - это тот, в котором они появляются во фрейме данных (отсортированные или нет). Ранее я полагал, что порядок по умолчанию на графике как-то связан с переменными, являющимися упорядоченными факторами, но я ошибался. 04.09.2011
  • @MatteoS Вы не первый, кто подумал, что здесь задействованы упорядоченные факторы. Здесь есть несколько выдающихся авторов тега r, которые допустили эту ошибку. Во всяком случае, рад, что в конце концов с этим разобрались. 04.09.2011
  • Подводя итог (поправьте меня, если я ошибаюсь): порядок переменных по умолчанию в графике ggplot2 соответствует тому, который находится в levels(variable), если не указано иное, путем принуждения variable его к ordered factor с настраиваемым порядком. 04.09.2011
  • Спасибо. Мне очень жаль, что я сделал такой беспорядок, объясняя проблему, но вы должны признать, что связь между графиком и порядком переменных как-то вводит в заблуждение (для новичка, такого как я, конечно), но основная проблема была нетривиальной (если плохо объяснено) 04.09.2011
  • Гэвин, вы предоставили элегантное решение проблемы неалфавитной сортировки фреймов данных. После обсуждения здесь chat.stackoverflow.com/rooms/106/r кажется, что на этот вопрос стоит ответить. сам по себе, и вы это сделали. Однако существует ли более общий подход к решению проблемы упорядочивания переменных при переворачивании осей в ggplot2, который не включает указание порядка вручную? Я хотел бы получить обе переменные T- ›B в порядке levels(variable) И записи легенды в порядке levels(vartype), в общем случае, без ручного упорядочивания ... :-) 04.09.2011
  • @MatteoS Я не устанавливал вручную порядок variable, я делал это программно. ggplot будет строить график только в соответствии с порядком уровней факторов. Нет другого способа указать этот AFAICT, но я не так часто использую ggplot. Обратите внимание, что это не имеет ничего отношения к упорядоченным факторам. Забудьте о них, они отвлекающий маневр. Важнейшая проблема состоит в том, чтобы получить такой порядок уровней фактора, который вам нужен, и затем построить график. Если бы существовал способ ggplot, он был бы предложен здесь или в различных дубликатах, которые также можно найти на SO 04.09.2011
  • +1 Для демонстрации того, что ggplot сортирует переменные в порядке уровней факторов. 04.09.2011
  • Хорошо понял. Я понимаю (отсутствие прямой) релевантности упорядоченных факторов и проблему, касающуюся последовательности levels(variable) и levels(vartype). Если это обычная проблема, не имеющая тривиального решения, возможно, стоит предложить Хэдли добавить параметр top.down=TRUE в coord_flip() для будущего выпуска ggplot2, что вы скажете? 04.09.2011
  • @MatteoS Спросите, но я не вижу необходимости в этом, учитывая общее решение получения уровней факторов в нужном вам порядке. 04.09.2011
  • @MatteoS scale_fill_discrete(guide = guide_legend(reverse=TRUE)) будет эквивалентом top.down=TRUE для изменения порядка в легенде. 06.12.2012
  • С текущим geom_bar код больше не работает: Error : Mapping a variable to y and also using stat="bin. Решение: geom_bar(stat="identity") 23.10.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..