Упорядочить ось Y по количеству одного конкретного значения в столбце с geom_bar

интересно, как я могу упорядочить кластеры по оси 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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
50
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я бы, вероятно, сделал это как манипуляцию с данными перед построением графика. Примечание. Я переместил киви на первую позицию в порядке укладки, чтобы мы могли видеть, как столбцы становятся меньше по мере продвижения вниз по оси 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 = '')

Другие вопросы по теме

Как вы распределяете определенную часть оси x в ggplot2?
Есть ли способ построить пакет pscl результатов модели препятствий или способ построить счет - нулевая усеченная часть негбина модели препятствий в r?
Ошибка: ! Проблема при преобразовании geom в grob. ℹ Произошла ошибка на 1-м слое
Ошибка в анализе (текст ...) непредвиденная запятая "," при построении графика ggplot с ggpubr::stat_cor и выходным десятичным числом, установленным на запятую (options(OutDec = ","))
Отрегулируйте график geom_bar с большим количеством меток
Сравните среднее значение нескольких переменных в двух группах с помощью GGPLOT
Предупреждающее сообщение R ggplot2: удалены строки, содержащие неконечные значения
Добавление пробелов вдоль оси x в ggplot
Как заменить устаревшую функцию ggplot2 aes_string: принятие произвольного количества именованных строк для указания эстетических отображений?
Измените размер оси Y в матрице. Сложный участок расстройства R