Używam R i mam dwie ramki danych: marchew i ogórki. Każda ramka danych ma pojedynczą kolumnę numeryczną, która podaje długość wszystkich zmierzonych marchwi (łącznie: 100 tys. Marchwi) i ogórków (łącznie: 50 tys. Ogórków).
Chciałbym narysować dwa histogramy - długość marchwi i długości ogórków - na tej samej działce. Nakładają się na siebie, więc potrzebuję też pewnej przejrzystości. Muszę również użyć częstotliwości względnych, a nie liczb bezwzględnych, ponieważ liczba wystąpień w każdej grupie jest inna.
coś takiego byłoby fajne, ale nie rozumiem, jak to zrobić z moich dwóch tabel:
Odpowiedzi:
Ten obraz, z którym się łączyłeś, dotyczył krzywych gęstości, a nie histogramów.
Jeśli czytasz na ggplot, być może jedyne, czego brakuje, to połączenie dwóch ramek danych w jedną długą.
Zacznijmy więc od tego, co masz, dwóch oddzielnych zestawów danych i połącz je.
Po tym, co nie jest konieczne, jeśli dane są już w długim formacie, wystarczy tylko jeden wiersz, aby utworzyć wykres.
Teraz, jeśli naprawdę chcesz histogramy, następujące działania będą działać. Zauważ, że musisz zmienić pozycję z domyślnego argumentu „stos”. Możesz tego przegapić, jeśli tak naprawdę nie masz pojęcia, jak powinny wyglądać Twoje dane. Wyższa alfa wygląda tam lepiej. Zauważ też, że zrobiłem to histogramy gęstości. Łatwo jest go usunąć,
y = ..density..
aby przywrócić go do zliczeń.źródło
ggplot(vegLengths, aes(length, fill = veg)) + geom_bar(pos="dodge")
. Spowoduje to utworzenie histogramów z przeplotem, jak w MATLAB.Oto jeszcze prostsze rozwiązanie z wykorzystaniem podstawowej grafiki i mieszania alfa (które nie działa na wszystkich urządzeniach graficznych):
Kluczem jest to, że kolory są półprzezroczyste.
Edytuj, ponad dwa lata później : Ponieważ otrzymałem właśnie opinię, sądzę, że równie dobrze mogę dodać grafikę tego, co wytwarza kod, gdy mieszanie alfa jest tak przydatne:
źródło
plot
polecenia? Możesz umieścić wszystkie te opcje whist
poleceniach i tylko dwie w dwóch liniach.plot
poleceniu bezpośrednio w poleceniu hist, tak jak powiedziałem. Publikowanie kodu nie jest tym, do czego służą komentarze.Oto funkcja, którą napisałem, która używa pseudo-przezroczystości do reprezentowania nakładających się histogramów
Oto inny sposób, aby to zrobić za pomocą obsługi R dla przezroczystych kolorów
Wyniki wyglądają mniej więcej tak:
źródło
postscript
)Są już piękne odpowiedzi, ale pomyślałem o dodaniu tego. Dla mnie wygląda dobrze. (Skopiowano losowe liczby z @Dirk).
library(scales)
jest potrzebny ”Wynik to...
Aktualizacja: Ta funkcja nakładania się może być również przydatna dla niektórych.
Wydaje mi się, że wynik
hist0
jest ładniejszy niżhist
Wynik
jest
źródło
Oto przykład, jak to zrobić w „klasycznej” grafice R:
Jedynym problemem jest to, że wygląda znacznie lepiej, jeśli podział histogramu jest wyrównany, co może wymagać ręcznego wykonania (w przekazanych argumentach
hist
).źródło
ggplot
), która bezpośrednio bierze pod uwagę, jeśli twoje dwa histogramy mają zasadniczo różne rozmiary próbek.breaks=seq(min(data$some_property), max(data$some_property), by=(max_prop - min_prop)/20)
Oto wersja podobna do ggplot2, którą podałem tylko w bazie R. Skopiowałem niektóre z @nullglob.
generować dane
Nie musisz umieszczać go w ramce danych, jak w przypadku ggplot2. Wadą tej metody jest to, że musisz napisać o wiele więcej szczegółów fabuły. Zaletą jest to, że masz kontrolę nad większą ilością szczegółów fabuły.
źródło
@Dirk Eddelbuettel: Podstawowa idea jest doskonała, ale przedstawiony kod można ulepszyć. [Trzeba długo wyjaśniać, stąd osobna odpowiedź, a nie komentarz.]
hist()
Funkcja domyślnie zwraca działek, więc trzeba dodaćplot=FALSE
opcję. Co więcej,plot(0,0,type="n",...)
łatwiej jest ustalić obszar wydruku za pomocą wywołania, w którym można dodać etykiety osi, tytuł wykresu itp. Na koniec chciałbym wspomnieć, że można również użyć cieniowania, aby rozróżnić dwa histogramy. Oto kod:A oto wynik (nieco za szeroki z powodu RStudio :-)):
źródło
postscript
urządzeniach.API R Plotly może być dla Ciebie przydatne. Poniższy wykres jest tutaj .
Pełne ujawnienie: jestem w zespole.
źródło
Tyle świetnych odpowiedzi, ale skoro właśnie napisałem funkcję function (
plotMultipleHistograms()
), aby to zrobić, pomyślałem, że dodam inną odpowiedź.Zaletą tej funkcji jest to, że automatycznie ustawia odpowiednie ograniczenia osi X i Y oraz definiuje wspólny zestaw pojemników, których używa we wszystkich dystrybucjach.
Oto jak go użyć:
plotMultipleHistograms()
Funkcja może mieć dowolną liczbę rozkładów, a wszystkie parametry ogólne kreślenia powinna pracować z nim (na przykładlas
,main
itd.)źródło