интересно, как я могу упорядочить кластеры по оси Y, уменьшив количество киви?
df = data.frame()
df = data.frame(matrix(df, nrow=200, ncol=2))
colnames(df) <- c("cluster", "name")
df$cluster <- sample(20, size = nrow(df), replace = TRUE)
df$fruit <- sample(c("banana", "apple", "orange", "kiwi", "plum"), size = nrow(df), replace = TRUE)
p = ggplot(df, aes(x = as.factor(cluster), fill = as.factor(fruit)))+
geom_bar(stat = 'count') +
theme_classic()+
coord_flip() +
theme(axis.text.y = element_text(size = 20),
axis.title.x = element_text(size = 20),
axis.title.y = element_text(size = 20),
axis.text=element_text(size=20)) +
theme(legend.text = element_text(size = 20)) +
xlab("Cluster")+
ylab("Fruit count") +
labs( fill = "")
p
Я бы, вероятно, сделал это как манипуляцию с данными перед построением графика. Примечание. Я переместил киви на первую позицию в порядке укладки, чтобы мы могли видеть, как столбцы становятся меньше по мере продвижения вниз по оси Y.
library(tidyverse)
df %>%
mutate(cluster = factor(cluster,
names(sort(table(fruit == 'kiwi', cluster)[2,]))),
fruit = factor(fruit, c('kiwi', 'apple', 'banana',
'orange', 'plum'))) %>%
ggplot(aes(x = cluster, fill = fruit))+
geom_bar(position = position_stack(reverse = TRUE)) +
theme_classic()+
coord_flip() +
theme(axis.text.y = element_text(size = 20),
axis.title.x = element_text(size = 20),
axis.title.y = element_text(size = 20),
axis.text=element_text(size=20)) +
theme(legend.text = element_text(size = 20)) +
scale_fill_manual(values = c('olivedrab', 'yellowgreen', 'yellow2',
'orange2', 'plum4')) +
xlab("Cluster")+
ylab("Fruit count") +
labs( fill = "")
Возможно, был бы более эффективный способ сделать это, но одна из возможностей состоит в том, чтобы подсчитать, сколько раз киви встречается для каждого кластера, а затем упорядочить кластер по этому параметру. Обратите внимание, что в этом примере может быть NA для количества киви (поэтому мы устанавливаем эти экземпляры равными 0).
order <- df %>%
# count how many times kiwi occurs per cluster
count(fruit, cluster) %>% filter(fruit == 'kiwi')
df <- df %>%
# join the counts to the original df by cluster
left_join(order %>% select(cluster, n)) %>%
# if na make zero (otherwise NAs appear at the top of the plot)
mutate(n = ifelse(is.na(n), 0, n),
# arrange the clusters by n
cluster = fct_reorder(as.factor(cluster), n))
и тогда ваша функция построения графика должна дать желаемый результат.
Вычислить общее количество киви по группам, а затем преобразовать кластер в фактор, упорядоченный по этому сгруппированному общему количеству киви. Используя dplyr и forcats::fct_reorder()
:
set.seed(13)
library(dplyr)
library(forcats)
df <- df %>%
group_by(cluster) %>%
mutate(n_kiwi = sum(fruit == "kiwi")) %>%
ungroup() %>%
mutate(cluster = fct_reorder(factor(cluster), n_kiwi))
p = ggplot(df, aes(x = cluster, fill = fruit))+
geom_bar(stat = 'count') +
theme_classic()+
coord_flip() +
theme(axis.text.y = element_text(size = 20),
axis.title.x = element_text(size = 20),
axis.title.y = element_text(size = 20),
axis.text=element_text(size=20)) +
theme(legend.text = element_text(size = 20)) +
xlab("Cluster")+
ylab("Fruit count") +
labs( fill = "")
p
Не нужно изменять данные, просто используйте x = reorder(cluster, fruit=='kiwi', sum)
в aes()
(вместо as.factor(cluster)
).
ggplot(df, aes(x = reorder(cluster, fruit=='kiwi', sum),
fill = as.factor(fruit))) +
geom_bar(stat = 'count') +
theme_classic() +
coord_flip() +
theme(axis.text.y = element_text(size = 20),
axis.title.x = element_text(size = 20),
axis.title.y = element_text(size = 20),
axis.text=element_text(size=20)) +
theme(legend.text = element_text(size = 20)) +
xlab('Cluster') +
ylab('Fruit count') +
labs(fill = '')