Robię unikany wykres słupkowy za pomocą ggplot z dyskretną skalą x, osie x są teraz ułożone w kolejności alfabetycznej, ale muszę to zmienić tak, aby był uporządkowany według wartości osi y (tj. Najwyższy słupek będzie być umieszczone po lewej stronie).
Próbowałem uporządkować lub posortować, ale w rezultacie posortowałem oś X, ale nie odpowiednio słupki.
Co zrobiłem źle?
factor
ireorder
zmiana charakterystyki danych, aczkolwiek w ramachggplot()
połączenia, robi więcej, niż jest to konieczne dla danego problemu.scale_x_discrete(limits = DT$x[order(-DT$y)])+
Możesz użyć
reorder
:Edytować:
Aby mieć najwyższy słupek po lewej stronie, musisz użyć trochę kludge:
Spodziewałbym się, że będzie to również miało ujemne wysokości, ale tak nie jest, więc działa!
źródło
Hadley rozwijał pakiet o nazwie
forcats
. Ten pakiet znacznie ułatwia zadanie. Możesz to wykorzystać,fct_infreq()
gdy chcesz zmienić kolejność osi X o częstotliwość czynnika. W przypadkumtcars
przykładu w tym poście chcesz zmienić kolejność poziomówcyl
według częstotliwości każdego poziomu. Poziom, który pojawia się najczęściej, pozostaje po lewej stronie. Wszystko, czego potrzebujesz, tofct_infreq()
.Jeśli chcesz przejść na odwrót, możesz użyć
fct_rev()
razem zfct_infreq()
.źródło
Zdaję sobie sprawę, że to jest stare, ale może ta funkcja, którą stworzyłem, przyda się komuś:
Teraz dzięki tej funkcji możesz interaktywnie kreślić za pomocą ggplot2, na przykład:
Jak widać,
order_axis
funkcja tworzy kolejną ramkę danych z nową kolumną o tej samej nazwie, ale z_o
końcówką. Ta nowa kolumna ma poziomy w kolejności rosnącej, więc ggplot2 automatycznie kreśli w tej kolejności.Jest to nieco ograniczone (działa tylko dla kombinacji znaków lub czynników i liczb w kolejności rosnącej), ale nadal uważam, że jest bardzo przydatne do kreślenia w ruchu.
źródło
reorder
bezpośredniego używania . Czy nieggplot(df, aes(x = reorder(AXIS_X, COLUMN_Y), y = COLUMN_Y)) + ...
robi tego samego, mniej więcej tak zwięźle i bez funkcji pomocnika?