Próbuję zrobić wykres słupkowy, w którym największy słupek byłby najbliżej osi y, a najkrótszy słupek byłby najdalej. Jest to coś w rodzaju tabeli, którą mam
Name Position
1 James Goalkeeper
2 Frank Goalkeeper
3 Jean Defense
4 Steve Defense
5 John Defense
6 Tim Striker
Staram się więc zbudować wykres słupkowy, który pokazuje liczbę graczy według pozycji
p <- ggplot(theTable, aes(x = Position)) + geom_bar(binwidth = 1)
ale wykres pokazuje najpierw pasek bramkarza, następnie obronę, a na koniec napastnika. Chciałbym, aby wykres był uporządkowany tak, aby pasek obrony znajdował się najbliżej osi y, bramkarza i wreszcie napastnika. Dzięki
ggplot2
Odpowiedzi:
Kluczem do zamawiania jest ustawienie poziomów współczynnika w żądanej kolejności. Uporządkowany czynnik nie jest wymagany; dodatkowe informacje w uporządkowanym współczynniku nie są konieczne, a jeśli dane te są wykorzystywane w jakimkolwiek modelu statystycznym, może to spowodować niewłaściwą parametryzację - kontrasty wielomianowe nie są odpowiednie dla danych nominalnych takich jak ten.
W najogólniejszym sensie wystarczy ustawić poziomy współczynników w pożądanej kolejności. Jeśli nie zostanie określony, poziomy współczynnika zostaną posortowane alfabetycznie. Możesz również określić kolejność poziomów w wywołaniu, aby uwzględnić czynnik, jak powyżej, a także inne sposoby są możliwe.
źródło
within
, nie musisz go używaćtheTable$Position
, a możesz po prostusort(-table(...))
zmniejszyć zamówienie.-
którego używasz, ponieważ o wiele łatwiej jest uzyskać intencjędecreasing = TRUE
niż zauważyć-
resztę kodu.levels(theTable$Position) <- c(...)
prowadzi do niepożądanego zachowania, w którym rzeczywiste wpisy ramki danych zostają uporządkowane, a nie tylko poziomy współczynnika. Zobacz to pytanie . Może powinieneś zmodyfikować lub usunąć te linie?levels<-
. Zamierzam edytować tę część, przynajmniej wstępnie.levels<-()
dzisiaj. Jest to coś sprzed 8 lat i nie mogę sobie przypomnieć, czy wtedy było inaczej, czy po prostu się myliłem, ale niezależnie od tego, to jest złe i powinno zostać usunięte! Dzięki!@GavinSimpson:
reorder
to potężne i skuteczne rozwiązanie tego:źródło
ggplot(theTable,aes(x=reorder(Position,Position,length))+geom_bar()
Służy
scale_x_discrete (limits = ...)
do określania kolejności prętów.źródło
Myślę, że już dostarczone rozwiązania są zbyt szczegółowe. Bardziej zwięzłym sposobem wykonania wykresu słupkowego posortowanego według częstotliwości jest ggplot
Jest podobny do sugerowanego przez Alexa Browna, ale nieco krótszy i działa bez niepotrzebnej definicji funkcji.
Aktualizacja
Wydaje mi się, że moje stare rozwiązanie było w tym czasie dobre, ale obecnie wolałbym używać
forcats::fct_infreq
współczynnika sortowania według częstotliwości:źródło
Podobnie jak
reorder()
w odpowiedzi Alexa Browna, moglibyśmy również użyćforcats::fct_reorder()
. Zasadniczo posortuje współczynniki określone w 1. arg, zgodnie z wartościami w 2. arg po zastosowaniu określonej funkcji (domyślnie = mediana, której używamy tutaj, ponieważ ma tylko jedną wartość na poziom współczynnika).Szkoda, że w pytaniu PO wymagana kolejność jest również alfabetyczna, ponieważ jest to domyślna kolejność sortowania podczas tworzenia czynników, więc ukryje to, co ta funkcja faktycznie robi. Aby było bardziej jasne, zastąpię „Goalkeeper” słowem „Zoalkeeper”.
źródło
Prosta zmiana kolejności czynników oparta na dplyr może rozwiązać ten problem:
źródło
Musisz tylko określić
Position
kolumnę jako czynnik uporządkowany, w którym poziomy są uporządkowane według ich liczby:(Zauważ, że
table(Position)
tworzy licznik częstotliwościPosition
kolumny.)Następnie twoja
ggplot
funkcja pokaże słupki w malejącej kolejności zliczania. Nie wiem, czy jest taka opcjageom_bar
bez konieczności jawnego tworzenia uporządkowanego czynnika.źródło
reorder()
że biblioteka statystyk wykonuje to samo zadanie.reorder()
w tym przypadku? Czynnik wymagający zmiany kolejności musi zostać zmieniony przez jakąś funkcję samą w sobie i staram się znaleźć dobry sposób, aby to zrobić.with(theTable, reorder(Position, as.character(Position), function(x) sum(duplicated(x))))
jest jeden sposób, a drugi,with(theTable, reorder(Position, as.character(Position), function(x) as.numeric(table(x))))
ale te są równie zawiłe ...sort
zamiastorder
reorder
jest biegły. Zgadzam się z tym pytaniem, że potrzebne jest coś bardziej zaangażowanego. Przepraszam za zamieszanie.Oprócz forcats :: fct_infreq, wspomnianego przez @HolgerBrandl, istnieją forcats :: fct_rev, które odwracają kolejność czynników.
źródło
Zgadzam się z Zach, że liczenie w ramach dplyr jest najlepszym rozwiązaniem. Odkryłem, że jest to najkrótsza wersja:
Będzie to również znacznie szybsze niż wcześniejsze zmienianie poziomów czynników, ponieważ liczenie odbywa się w dplyr, a nie w ggplot lub użyciu
table
.źródło
Jeśli kolumny wykresu pochodzą ze zmiennej numerycznej, jak w ramce danych poniżej, możesz zastosować prostsze rozwiązanie:
Znak minus przed zmienną sortowania (-Qty) kontroluje kierunek sortowania (rosnąco / malejąco)
Oto niektóre dane do testowania:
Kiedy znalazłem ten wątek, to była odpowiedź, której szukałem. Mam nadzieję, że jest to przydatne dla innych.
źródło
Kolejna alternatywa polegająca na zmianie kolejności w celu uporządkowania poziomów czynnika. W porządku rosnącym (n) lub malejącym (-n) na podstawie liczby. Bardzo podobny do tego używającego
fct_reorder
zforcats
pakietu:Kolejność malejąca
Rosnąco
Ramka danych:
źródło
Ponieważ patrzymy tylko na rozkład pojedynczej zmiennej („Pozycja”), a nie na relację między dwiema zmiennymi , być może histogram byłby bardziej odpowiednim wykresem. ggplot ma geom_histogram (), który ułatwia:
Za pomocą geom_histogram ():
Myślę, że geom_histogram ( ) jest trochę dziwaczny, ponieważ inaczej traktuje dane ciągłe i dyskretne.
Aby uzyskać ciągłe dane , możesz po prostu użyć geom_histogram () bez parametrów. Na przykład, jeśli dodamy wektor numeryczny „Wynik” ...
i użyj geom_histogram () w zmiennej „Score” ...
W przypadku danych dyskretnych, takich jak „Pozycja”, musimy określić obliczoną statystykę obliczoną na podstawie estetyki, aby podać wartość y wysokości prętów za pomocą
stat = "count"
:Uwaga: w ciekawy i mylący sposób możesz również używać
stat = "count"
do ciągłego przesyłania danych i myślę, że zapewnia on bardziej estetyczny wykres.Edycje : Rozszerzona odpowiedź w odpowiedzi na pomocne sugestie DebanjanB .
źródło
Uważam to za bardzo denerwujące, że
ggplot2
nie oferuje „automatycznego” rozwiązania tego problemu. Dlatego stworzyłem tębar_chart()
funkcję wggcharts
.Domyślnie
bar_chart()
sortuje paski i wyświetla poziomy wykres. Aby zmienić ten zestawhorizontal = FALSE
. Ponadtobar_chart()
usuwa nieestetyczną „szczelinę” między prętami i osią.źródło