Uporządkuj dyskretną skalę x według częstotliwości/wartości

Robię uniknięty wykres słupkowy za pomocą ggplot z dyskretnej skali X, oś x są teraz ułożone w porządku alfabetycznym, ale muszę zmienić go tak, że jest uporządkowany według wartości osi y (tzn. najwyższy pasek zostanie umieszczony po lewej stronie).

Próbowałem uporządkować lub posortować, ale w rezultacie sortować oś x, ale nie odpowiednio słupki.

Co zrobiłem źle?

Author: camille, 2010-07-15

5 answers

Spróbuj ręcznie ustawić poziomy współczynnika na osi X. Na przykład:

library(ggplot2)
# Automatic levels
ggplot(mtcars, aes(factor(cyl))) + geom_bar()    

ggplot zbioru danych Samochodów Z automatycznie ustalanymi poziomami współczynników

# Manual levels
cyl_table <- table(mtcars$cyl)
cyl_levels <- names(cyl_table)[order(cyl_table)]
mtcars$cyl2 <- factor(mtcars$cyl, levels = cyl_levels)
# Just to be clear, the above line is no different than:
# mtcars$cyl2 <- factor(mtcars$cyl, levels = c("6","4","8"))
# You can manually set the levels in whatever order you please. 
ggplot(mtcars, aes(cyl2)) + geom_bar()

ggplot zbioru danych o samochodach z poziomami czynnika zmienionymi ręcznie

Jak zauważył James w swojej odpowiedzi, reorder jest idiomatycznym sposobem zmiany kolejności poziomów czynnika.

mtcars$cyl3 <- with(mtcars, reorder(cyl, cyl, function(x) -length(x)))
ggplot(mtcars, aes(cyl3)) + geom_bar()

ggplot zbioru danych o samochodach z poziomami współczynników zmienionymi za pomocą funkcji reorder

 108
Author: Richie Cotton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-03 06:42:55

Najlepszym sposobem dla mnie było użycie wektora z kategoriami w kolejności, w jakiej potrzebuję jako parametr limits do scale_x_discrete. Myślę, że jest to dość proste i proste rozwiązanie.

ggplot(mtcars, aes(factor(cyl))) + 
  geom_bar() + 
  scale_x_discrete(limits=c(8,4,6))

Tutaj wpisz opis obrazka

 203
Author: Yuriy Petrovskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 09:41:12

Możesz użyć reorder:

qplot(reorder(factor(cyl),factor(cyl),length),data=mtcars,geom="bar")

Edit:

Aby mieć najwyższy pasek po lewej stronie, musisz użyć trochę kludge:

qplot(reorder(factor(cyl),factor(cyl),function(x) length(x)*-1),
   data=mtcars,geom="bar")

Spodziewałbym się, że to również będzie miało ujemną wysokość, ale tak nie jest, więc działa!

 40
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 15:20:41

Hadley opracowuje pakiet o nazwie forcats. Ten pakiet znacznie ułatwia zadanie. Możesz wykorzystać fct_infreq(), Gdy chcesz zmienić kolejność osi x o częstotliwość czynnika. W przypadku przykładu mtcars w tym poście, chcesz zmienić kolejność poziomów cyl według częstotliwości każdego poziomu. Poziom, który pojawia się najczęściej, pozostaje po lewej stronie. Wszystko czego potrzebujesz to fct_infreq().

library(ggplot2)
library(forcats)

ggplot(mtcars, aes(fct_infreq(factor(cyl)))) +
geom_bar() +
labs(x = "cyl")

Jeśli chcesz iść na odwrót, możesz użyć fct_rev() wraz z fct_infreq().

ggplot(mtcars, aes(fct_rev(fct_infreq(factor(cyl))))) +
geom_bar() +
labs(x = "cyl") 

Tutaj wpisz opis obrazka

 33
Author: jazzurro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-22 07:06:48

Zdaję sobie sprawę, że to jest stare, ale może ta funkcja, którą stworzyłem, jest przydatna komuś tam:

order_axis<-function(data, axis, column)
{
  # for interactivity with ggplot2
  arguments <- as.list(match.call())
  col <- eval(arguments$column, data)
  ax <- eval(arguments$axis, data)

  # evaluated factors
  a<-reorder(with(data, ax), 
             with(data, col))

  #new_data
  df<-cbind.data.frame(data)
  # define new var
  within(df, 
         do.call("<-",list(paste0(as.character(arguments$axis),"_o"), a)))
}

Teraz za pomocą tej funkcji możesz interaktywnie rysować za pomocą ggplot2, Tak:

ggplot(order_axis(df, AXIS_X, COLUMN_Y), 
       aes(x = AXIS_X_o, y = COLUMN_Y)) +
        geom_bar(stat = "identity")

Jak widać, funkcja order_axis tworzy kolejną ramkę danych z nową kolumną o tej samej nazwie, ale z _o na końcu. Ta nowa kolumna ma poziomy w porządku rosnącym, więc ggplot2 automatycznie wykresy w tej kolejności.

Jest to nieco ograniczone (działa tylko dla postaci lub czynnika i numeryczne kombinacje kolumn i w porządku rosnącym), ale nadal uważam, że jest to bardzo przydatne do kreślenia w podróży.

 2
Author: eflores89,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-08 23:00:21