Я изо всех сил пытаюсь получить правильный порядок переменных в графике, который я сделал с помощью 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 аналогичный вопрос и, насколько мне известно, применял все предложенные комбинации решений, но безрезультатно. Я снова отправляю вопрос надеюсь, что смогу решить мою проблему и, надеюсь, быть полезным для других.
coord_flip()
кода, который вы предоставили. 04.09.2011levels(vartype)
, он не должен быть в подразумеваемом порядке (переупорядоченном)variable
. Порядок иcoord_flip()
переплетаются только в смысле условностей представления факторов. Я думаю, вы видите 2 и 2 и переходите к ответу 5 здесь. 04.09.2011levels(variable)
(или, что то же самое, B-› T сcoord_flip()
), в то время как порядок легенды основан наlevels(vartype)
, несмотря на то, что ни один из переменные - это упорядоченные факторы. Порядок - это тот, в котором они появляются во фрейме данных (отсортированные или нет). Ранее я полагал, что порядок по умолчанию на графике как-то связан с переменными, являющимися упорядоченными факторами, но я ошибался. 04.09.2011levels(variable)
, если не указано иное, путем принужденияvariable
его кordered factor
с настраиваемым порядком. 04.09.2011levels(variable)
И записи легенды в порядкеlevels(vartype)
, в общем случае, без ручного упорядочивания ... :-) 04.09.2011variable
, я делал это программно. ggplot будет строить график только в соответствии с порядком уровней факторов. Нет другого способа указать этот AFAICT, но я не так часто использую ggplot. Обратите внимание, что это не имеет ничего отношения к упорядоченным факторам. Забудьте о них, они отвлекающий маневр. Важнейшая проблема состоит в том, чтобы получить такой порядок уровней фактора, который вам нужен, и затем построить график. Если бы существовал способ ggplot, он был бы предложен здесь или в различных дубликатах, которые также можно найти на SO 04.09.2011ggplot
сортирует переменные в порядке уровней факторов. 04.09.2011levels(variable)
иlevels(vartype)
. Если это обычная проблема, не имеющая тривиального решения, возможно, стоит предложить Хэдли добавить параметрtop.down=TRUE
вcoord_flip()
для будущего выпускаggplot2
, что вы скажете? 04.09.2011scale_fill_discrete(guide = guide_legend(reverse=TRUE))
будет эквивалентомtop.down=TRUE
для изменения порядка в легенде. 06.12.2012geom_bar
код больше не работает:Error : Mapping a variable to y and also using stat="bin
. Решение:geom_bar(stat="identity")
23.10.2015