Закажите категориальные данные в таблице с разбивкой по строкам с помощью ggplot2
У меня есть матрица со следующими элементами:
dput(MilDis[1:200,])
structure(list(hhDomMil = c("HED", "ETB", "HED", "ETB", "PER",
"BUM", "EXP", "TRA", "TRA", "PMA", "MAT", "MAT", "KON", "ETB",
"PMA", "PMA", "HED", "BUM", "BUM", "HED", "PMA", "PMA", "HED",
"TRA", "BUM", "EXP", "BUM", "PMA", "ETB", "MAT", "ETB", "ETB",
"KON", "MAT", "TRA", "BUM", "BUM", "TRA", "TRA", "PMA", "PMA",
"PMA", "MAT", "ETB", "TRA", "BUM", "TRA", "MAT", "BUM", "ETB",
"TRA", "TRA", "BUM", "KON", "ETB", "ETB", "ETB", "BUM", "KON",
"ETB", "ETB", "PMA", "TRA", "PER", "PER", "MAT", "HED", "KON",
"TRA", "TRA", "TRA", "EXP", "TRA", "BUM", "MAT", "MAT", "TRA",
"PMA", "HED", "PER", "TRA", "PER", "EXP", "PER", "BUM", "KON",
"BUM", "ETB", "ETB", "TRA", "PER", "ETB", "KON", "KON", "BUM",
"ETB", "BUM", "MAT", "BUM", "KON", "KON", "ETB", "MAT", "KON",
"PER", "ETB", "ETB", "KON", "PMA", "PER", "HED", "HED", "PMA",
"MAT", "PMA", "PER", "PMA", "TRA", "TRA", "MAT", "BUM", "BUM",
"KON", "ETB", "ETB", "ETB", "PMA", "TRA", "TRA", "PMA", "PER",
"KON", "PER", "BUM", "KON", "ETB", "ETB", "BUM", "TRA", "ETB",
"PMA", "HED", "MAT", "TRA", "BUM", "PMA", "BUM", "ETB", "TRA",
"TRA", "TRA", "PER", "EXP", "HED", "BUM", "EXP", "HED", "BUM",
"MAT", "DDR", "BUM", "MAT", "KON", "HED", "HED", "TRA", "BUM",
"PMA", "PMA", "PMA", "KON", "KON", "MAT", "ETB", "MAT", "TRA",
"MAT", "ETB", "ETB", "TRA", "MAT", "ETB", "TRA", "HED", "BUM",
"MAT", "TRA", "PMA", "BUM", "BUM", "EXP", "ETB", "EXP", "EXP",
"MAT", "TRA", "KON", "BUM", "BUM", "HED"), kclust = c(1L, 2L,
15L, 4L, 5L, 6L, 5L, 7L, 8L, 5L, 6L, 5L, 11L, 6L, 5L, 1L, 9L,
10L, 2L, 1L, 9L, 8L, 4L, 11L, 14L, 5L, 8L, 11L, 12L, 5L, 5L,
14L, 15L, 2L, 10L, 6L, 8L, 4L, 6L, 8L, 14L, 14L, 16L, 10L, 5L,
1L, 12L, 17L, 12L, 16L, 16L, 5L, 10L, 14L, 8L, 19L, 5L, 4L, 4L,
14L, 2L, 14L, 9L, 7L, 1L, 14L, 4L, 15L, 18L, 16L, 9L, 14L, 6L,
14L, 12L, 11L, 4L, 7L, 8L, 12L, 9L, 16L, 2L, 6L, 15L, 1L, 1L,
3L, 14L, 5L, 5L, 9L, 14L, 6L, 5L, 14L, 15L, 2L, 14L, 2L, 1L,
8L, 5L, 10L, 1L, 1L, 16L, 5L, 2L, 9L, 9L, 1L, 12L, 10L, 1L, 4L,
1L, 9L, 8L, 8L, 5L, 10L, 1L, 10L, 2L, 6L, 15L, 2L, 2L, 10L, 5L,
6L, 10L, 19L, 19L, 6L, 5L, 6L, 7L, 7L, 8L, 5L, 16L, 5L, 6L, 6L,
1L, 10L, 12L, 4L, 7L, 19L, 7L, 8L, 16L, 10L, 5L, 16L, 12L, 7L,
7L, 19L, 4L, 6L, 1L, 15L, 7L, 8L, 16L, 4L, 10L, 15L, 11L, 10L,
1L, 10L, 17L, 1L, 2L, 1L, 14L, 8L, 8L, 14L, 10L, 8L, 6L, 6L,
8L, 5L, 7L, 5L, 1L, 5L, 7L, 9L, 2L, 1L, 9L, 14L), order = c(9,
1, 9, 1, 3, 7, 10, 5, 5, 2, 8, 8, 4, 1, 2, 2, 9, 7, 7, 9, 2,
2, 9, 5, 7, 10, 7, 2, 1, 8, 1, 1, 4, 8, 5, 7, 7, 5, 5, 2, 2,
2, 8, 1, 5, 7, 5, 8, 7, 1, 5, 5, 7, 4, 1, 1, 1, 7, 4, 1, 1, 2,
5, 3, 3, 8, 9, 4, 5, 5, 5, 10, 5, 7, 8, 8, 5, 2, 9, 3, 5, 3,
10, 3, 7, 4, 7, 1, 1, 5, 3, 1, 4, 4, 7, 1, 7, 8, 7, 4, 4, 1,
8, 4, 3, 1, 1, 4, 2, 3, 9, 9, 2, 8, 2, 3, 2, 5, 5, 8, 7, 7, 4,
1, 1, 1, 2, 5, 5, 2, 3, 4, 3, 7, 4, 1, 1, 7, 5, 1, 2, 9, 8, 5,
7, 2, 7, 1, 5, 5, 5, 3, 10, 9, 7, 10, 9, 7, 8, 6, 7, 8, 4, 9,
9, 5, 7, 2, 2, 2, 4, 4, 8, 1, 8, 5, 8, 1, 1, 5, 8, 1, 5, 9, 7,
8, 5, 2, 7, 7, 10, 1, 10, 10, 8, 5, 4, 7, 7, 9)), .Names = c("hhDomMil",
"kclust", "order"), row.names = c(NA, 200L), class = "data.frame")
Я хочу создать многострочный график, подобный этому
.
Единственная проблема заключается в том, что я бы хотел, чтобы порядок стеков соответствовал этому (ETB, PMA, PER, KON, TRA, DDR, BUM, MAT, HED, EXP) - номера заказов в матрице и у меня также есть некоторые эстетические проблемы. Я искал решение здесь, но ни один из предложений для заказа не работал у меня...: -\
- Как мне построить такой упорядоченный сюжет?
- Как настроить x, чтобы каждая строка была "on" одним номером?
- Как я разделяю бары - здесь я пробовал это с белой рамкой...?
- Как распечатать все числа kclust в x?
Большое спасибо за вашу помощь!
Dominik
UPDATE
Вот код, который я использовал для рисования моего сюжета:
mycols <- c('#FFFD00', '#97CB00', '#3168FF', '#FF0200', '#FB02FE', \
'#CCFCCC', '#FE9900', '#98CBF8', '#00CCFF', '#00FD03') # Set milieu colors
ggplot(MilDis) +
geom_bar(aes(kclust, fill=factor(hhDomMil), \
colour=mycols), position='fill', binwidth=1, colour='white') +
scale_fill_manual(values = mycols)
ОБНОВЛЕНИЕ 2:
Вот как я это сделал сейчас:
mycols <- c('#3168FF', '#00CCFF', '#98CBF8', '#CCFCCC', '#00FD03',\
'#97CB00', '#FFFD00', '#FE9900', '#FB02FE', '#FF0200') # Set milieu colors
ggplot(MilDis) +
geom_bar(aes(factor(kclust), fill=reorder(hhDomMil,order)),\
position='fill') +
scale_fill_manual(values = mycols)
С помощью этого результата:
![Image]()
Спасибо всем за вашу помощь!
Ответы
Ответ 1
Я вижу, что у вас есть столбец order
в вашем фрейме данных, который я собираю, это ваш заказ. Следовательно, вы можете просто сделать.
p0 = qplot(factor(kclust), fill = reorder(hhDomMil, order), position = 'fill',
data = df1)
Вот элементы этого кода, которые заботятся о ваших вопросах.
- Как мне построить такой упорядоченный сюжет?
reorder
- Как настроить x, чтобы каждая строка была "on" одним номером?
factor(kclust)
- Как разделять панели?
- Как распечатать все числа kclust в x?
factor(kclust)
Я помню из предыдущего вашего вопроса, что hhDomMil
соответствует различным группам, и я подозреваю, что ваш заказ следует за группировкой. В этом случае вы можете использовать эту информацию для выбора цветовой палитры, которая упрощает отслеживание графика. Вот один из способов сделать это.
mycols = c(brewer.pal(3, 'Oranges'), brewer.pal(3, 'Greens'),
brewer.pal(2, 'Blues'), brewer.pal(2, 'PuRd'))
p0 + scale_fill_manual(values = mycols)
![enter image description here]()
Ответ 2
Ответ на этот вопрос легко решить, предварительно отформатировав ваши данные, прежде чем передавать его на ggplot()
. Ключ состоит в том, чтобы явно установить уровни фактора hhDomMil
. Предполагая, что ваши данные находятся в dat
:
dat <- transform(dat, hhDomMil = factor(hhDomMil,
levels = c("ETB", "PMA", "PER", "KON",
"TRA", "DDR", "BUM", "MAT",
"HED", "EXP")))
Это фиксирует hhDomMil
как фактор, расположенный внутри dat
, и устанавливает уровни в том порядке, в котором вы хотели:
> head(dat$hhDomMil)
[1] HED ETB HED ETB PER BUM
Levels: ETB PMA PER KON TRA DDR BUM MAT HED EXP
Обратите внимание на то, что происходит, когда R коэрцирует hhDomMil
в коэффициент:
> head(factor(as.character(dat$hhDomMil)))
[1] HED ETB HED ETB PER BUM
Levels: BUM DDR ETB EXP HED KON MAT PER PMA TRA
Значение по умолчанию - сортировка уровней по алфавиту, поэтому график выводится, когда вы показываете.
Лучший совет, который я могу дать, состоит в том, чтобы сначала правильно отформатировать ваши данные и только затем попытаться построить его - не полагайтесь на автоматическое или "на лету" конвертирование, чтобы получить это право для вас; неизбежно это будет не то, что вы хотите.
Ответ 3
Если вы создадите свой hhDomMil в качестве такого фактора:
o<-c("ETB" "PMA" "PER" "KON" "TRA" "DDR" "BUM" "MAT" "HED" "EXP")
d$hh<-factor(d$hhDomMil,levels=o)
тогда ваш сюжет будет в том порядке, который вам нравится:
ggplot(d,(aes(x=kclust, fill=hh))) +geom_bar(position="fill")