Фиксирование порядка граней в ggplot
Данные:
type size amount
T 50% 48.4
F 50% 48.1
P 50% 46.8
T 100% 25.9
F 100% 26.0
P 100% 24.9
T 150% 21.1
F 150% 21.4
P 150% 20.1
T 200% 20.8
F 200% 21.5
P 200% 16.5
Мне нужно построить гистограмму вышеуказанных данных, используя ggplot (ось х → "тип", ось у → "количество", сгруппировать по "размеру"). Когда я использовал следующий код, я не получаю переменную "type" и "size" в порядке, указанном в данных. Пожалуйста, смотрите рисунок. Я использовал следующий код для этого.
ggplot(temp, aes(type, amount , fill=type, group=type, shape=type, facets=size)) +
geom_bar(width=0.5, position = position_dodge(width=0.6)) +
facet_grid(.~size) +
theme_bw() +
scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"),
labels = c("T", "F", "P"))
.
Для решения проблемы заказа я использовал факторный метод для переменной "тип", используя следующее. Пожалуйста, смотрите рисунок также.
temp$new = factor(temp$type, levels=c("T","F","P"), labels=c("T","F","P"))
![enter image description here]()
Однако сейчас я не знаю, как исправить порядок для переменной "размер". Это должно быть 50%, 100%. 150% и 200%.
Ответы
Ответ 1
Сделайте свой размер фактором в вашем фреймворке данных:
temp$size_f = factor(temp$size, levels=c('50%','100%','150%','200%'))
Затем измените значение facet_grid(.~size)
на facet_grid(.~size_f)
Затем сюжет:
![enter image description here]()
Графики теперь находятся в правильном порядке.
Ответ 2
Здесь решение, которое держит вещи в цепочке труб dplyr. Вы сортируете данные заранее, а затем используете mutate_at для преобразования в фактор. Я немного изменил данные, чтобы показать, как это решение можно применять в целом, учитывая данные, которые можно разумно отсортировать:
# the data
temp <- data.frame(type=rep(c("T", "F", "P"), 4),
size=rep(c("50%", "100%", "200%", "150%"), each=3), # cannot sort this
size_num = rep(c(.5, 1, 2, 1.5), each=3), # can sort this
amount=c(48.4, 48.1, 46.8,
25.9, 26.0, 24.9,
20.8, 21.5, 16.5,
21.1, 21.4, 20.1))
temp %>%
arrange(size_num) %>% # sort
mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>% # convert to factor
ggplot() +
geom_bar(aes(x = type, y=amount, fill=type),
position="dodge", stat="identity") +
facet_grid(~ size)
Вы также можете применить это решение, чтобы расположить столбцы внутри фасетов, хотя вы можете выбрать только один предпочтительный порядок:
temp %>%
arrange(size_num) %>%
mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>%
arrange(desc(amount)) %>%
mutate_at(vars(type), funs(factor(., levels=unique(.)))) %>%
ggplot() +
geom_bar(aes(x = type, y=amount, fill=type),
position="dodge", stat="identity") +
facet_grid(~ size)
ggplot() +
geom_bar(aes(x = type, y=amount, fill=type),
position="dodge", stat="identity") +
facet_grid(~ size)