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?
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()
# 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()
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()
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))
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!
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")
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.
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