Но ответ от misuse очень хороший.

ользую набор данных «алмазы», ​​который идет с R. При попытке отсортировать «цветной» фактор по их средней цене, он не будет работать.

Вот что я получил:

ggplot(diamonds, aes(x = reorder(color, -price, FUN=median), y = price)) + 
  geom_boxplot() + 
  facet_wrap(~cut) + 
  ylim(0, 5500)

И это дает мне это (не отсортировано вообще):

Есть ли что-то, что я делаю неправильно или отсутствует?

 clemens03 нояб. 2017 г., 09:58
Каков ожидаемый результат?
 filipetrm03 нояб. 2017 г., 09:05
Я имею, но не мог заставить это работать.
 Hardik gupta03 нояб. 2017 г., 08:45
Вы проверили здесь -stackoverflow.com/questions/45682405/...

Ответы на вопрос(2)

Решение Вопроса

с использованием двух доступных вспомогательных функций.Вот

reorder_within <- function(x, by, within, fun = mean, sep = "___", ...) {
  new_x <- paste(x, within, sep = sep)
  stats::reorder(new_x, by, FUN = fun)
}


scale_x_reordered <- function(..., sep = "___") {
  reg <- paste0(sep, ".+$")
  ggplot2::scale_x_discrete(labels = function(x) gsub(reg, "", x), ...)
}

library(tidyverse)
data(diamonds)

p <- ggplot(diamonds, aes(x = reorder_within(color, price, cut, median), y = price)) + 
  geom_boxplot(width = 5) + 
  scale_x_reordered()+
  facet_wrap(~cut,  scales = "free_x")

с помощьюylim(0, 5500) удалит большую часть данных, что приведет к появлению разных участков, которые будут мешать любому ранее определенному порядку. Если вы хотите ограничить ось без этого, лучше использовать:

p + coord_cartesian(ylim = c(0, 5500))

это приводит к:

Если вы действительно намерены удалить большую часть данных и сохранить порядок, отфильтруйте данные до начала графика:

diamonds %>%
  filter(price < 5500) %>%
  ggplot(aes(x = reorder_within(color, price, cut, median), y = price)) + 
  geom_boxplot(width = 5) + 
  scale_x_reordered()+
  facet_wrap(~cut,  scales = "free_x")

 Matias Andina01 июн. 2018 г., 02:34
Это отличное решение. Это не работало некоторое время в моем случае. Мне потребовалось некоторое время, чтобы понять, что мои данные влияют на расчеты. я добавилFUN = function(x) fun(x, na.rm=T) к первому помощнику. :)
ggplot(diamonds, aes(x = reorder(color, -price, FUN=median), y = price)) + 
      geom_boxplot() + 
      facet_wrap(~cut) + 
      ylim(0, 5500)
  levels(diamonds$color) # "D" "E" "F" "G" "H" "I" "J"
  diamonds$color <- reorder(diamonds$color, -diamonds$price, FUN=median)
  levels(diamonds$color)  # "J" "I" "H" "F" "G" "D" "E"
  ggplot(diamonds, aes(x =color, y = price))+
      geom_boxplot() + 
      facet_wrap(~cut) + 
      ylim(0, 5500)

что у вас есть следующий порядок

  ggplot(diamonds, aes(x =color, y = price))+
      geom_boxplot() + 
      ylim(0, 5500)

Но ответ от misuse очень хороший.

Ваш ответ на вопрос