Planuję zmienną kategorialną i zamiast pokazywać liczby dla każdej wartości kategorii.
Szukam sposobu, aby ggplot
wyświetlić procent wartości w tej kategorii. Oczywiście istnieje możliwość stworzenia innej zmiennej z wyliczonym procentem i wykreślenia tej jednej, ale muszę to robić kilkadziesiąt razy i mam nadzieję, że uda mi się to jednym poleceniem.
Eksperymentowałem z czymś takim
qplot(mydataf) +
stat_bin(aes(n = nrow(mydataf), y = ..count../n)) +
scale_y_continuous(formatter = "percent")
ale muszę go używać niepoprawnie, bo mam błędy.
Aby łatwo odtworzyć konfigurację, oto uproszczony przykład:
mydata <- c ("aa", "bb", NULL, "bb", "cc", "aa", "aa", "aa", "ee", NULL, "cc");
mydataf <- factor(mydata);
qplot (mydataf); #this shows the count, I'm looking to see % displayed.
W prawdziwym przypadku prawdopodobnie użyjęggplot
zamiast qplot
, ale właściwy sposób użycia stat_bin wciąż mi umyka .
Wypróbowałem również te cztery podejścia:
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent');
ggplot(mydataf, aes(y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent') + geom_bar();
ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent');
ggplot(mydataf, aes(x = levels(mydataf), y = (..count..)/sum(..count..))) +
scale_y_continuous(formatter = 'percent') + geom_bar();
ale wszystkie 4 dają:
Error: ggplot2 doesn't know how to deal with data of class factor
Ten sam błąd pojawia się w prostym przypadku
ggplot (data=mydataf, aes(levels(mydataf))) +
geom_bar()
więc wyraźnie chodzi o to, jak ggplot
oddziałuje z pojedynczym wektorem. Drapię się w głowę, szukając w Google tego błędu, daje jeden wynik .
Odpowiedzi:
Odkąd udzielono odpowiedzi, nastąpiły pewne znaczące zmiany w
ggplot
składni. Podsumowując dyskusję w komentarzach powyżej:Oto odtwarzalny przykład przy użyciu
mtcars
:To pytanie jest obecnie numerem 1 w Google pod względem liczby ggplot vs histogram procentowy, więc miejmy nadzieję, że pomoże to wydestylować wszystkie informacje obecnie zawarte w komentarzach do zaakceptowanej odpowiedzi.
Uwaga: jeśli
hp
nie jest ustawiony jako współczynnik, ggplot zwraca:źródło
percent
pakiet, z którego pochodzi, aby powyższe działało (tak zrobiłem).ggplot(mtcars, aes(x = factor(hp))) + geom_bar(aes(y = (..count..)/sum(..count..))) + scale_y_continuous(labels = scales::percent)
geom_bar(aes(y = (..count..)/tapply(..count..,..PANEL..,sum)[..PANEL..]))
zamiast tego użyj . Każdy aspekt powinien sumować się do 100%.ten zmodyfikowany kod powinien działać
jeśli twoje dane mają NA i nie chcesz, aby były uwzględniane w wykresie, przekaż na.omit (mydataf) jako argument do ggplot.
mam nadzieję że to pomoże.
źródło
formatter
argument nie będzie już działał. Zamiast tego będziesz chciał coś takiegolabels = percent_format())
.scales
bibliotekę przed użyciempercent_format()
, w przeciwnym razie nie zadziała. 0.9.0 nie wczytuje już automatycznie pakietów wspierających.? stat_bin
. Pokazuje, jakie dodatkowe kolumny są dodawane do ramki danychggplot2
. Wszystkie dodatkowe kolumny mają postać..variable..
.aes(y = (..count..)/sum(..count..))
prostą ma sensaes(y = ..density..)
? Wizualnie daje to bardzo podobny (ale wciąż inny) obrazscales
bibliotekę, a następnie użyć,scale_y_continuous(labels=percent)
jak wspomniano w dokumentacjiZ ggplot2 w wersji 2.1.0 tak jest
źródło
Według stanu na marzec 2017 r. W wersji
ggplot2
2.2.1 najlepsze rozwiązanie można znaleźć w książce Hadley Wickham's R for data science:stat_count
oblicza dwie zmienne:count
jest używana domyślnie, ale możesz wybrać,prop
która pokazuje proporcje.źródło
fill
mapowania (nie jest zgłaszany żaden błąd, ale nie jest dodawany kolor wypełnienia).group = 1
, aby uzyskać mapowanie wypełnienia. może to pomożegroup
parametr, nie pokazuje on odpowiednich wartości procentowych, ponieważ wszystko należy do własnej grupy dla każdej unikalnej wartości x.Jeśli chcesz procentowe na osi y i oznakowane na barach:
Podczas dodawania etykiet słupków możesz pominąć oś Y, aby uzyskać bardziej przejrzysty wykres, dodając na końcu:
źródło
Jeśli chcesz mieć etykiety procentowe , ale rzeczywiste wartości N na osi y, spróbuj tego:
źródło
Oto obejście dla danych aspektowych. (Zaakceptowana odpowiedź @Andrew nie działa w tym przypadku.) Chodzi o to, aby obliczyć wartość procentową za pomocą dplyr, a następnie użyć geom_col do utworzenia wykresu.
To jest fabuła:
źródło
Zauważ, że jeśli twoja zmienna jest ciągła, będziesz musiał użyć geom_histogram (), ponieważ funkcja ta pogrupuje zmienną według "pojemników".
źródło