Czy istnieje sposób tworzenia wykresów rozrzutu z histogramami marginalnymi, tak jak w przykładzie poniżej w ggplot2
? W Matlabie jest to scatterhist()
funkcja i istnieją również odpowiedniki dla R. Jednak nie widziałem tego dla ggplot2.
Zacząłem od stworzenia pojedynczych wykresów, ale nie wiem, jak je odpowiednio ułożyć.
require(ggplot2)
x<-rnorm(300)
y<-rt(300,df=2)
xy<-data.frame(x,y)
xhist <- qplot(x, geom="histogram") + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 5/16, axis.text.y = theme_blank(), axis.title.y=theme_blank(), background.colour="white")
yhist <- qplot(y, geom="histogram") + coord_flip() + opts(background.fill = "white", background.color ="black")
yhist <- yhist + scale_x_continuous(limits=c(min(x),max(x))) + opts(axis.text.x = theme_blank(), axis.title.x=theme_blank(), axis.ticks = theme_blank(), aspect.ratio = 16/5, axis.text.y = theme_blank(), axis.title.y=theme_blank() )
scatter <- qplot(x,y, data=xy) + scale_x_continuous(limits=c(min(x),max(x))) + scale_y_continuous(limits=c(min(y),max(y)))
none <- qplot(x,y, data=xy) + geom_blank()
i aranżując je za pomocą funkcji zamieszczonej tutaj . Krótko mówiąc: czy istnieje sposób na tworzenie tych wykresów?
Odpowiedzi:
gridExtra
Pakiet powinien tu pracować. Zacznij od utworzenia każdego z obiektów ggplot:Następnie użyj funkcji grid.arrange:
źródło
xy <- data.frame(x=rnorm(300), y=rt(300,df=2) )
i użyć godata=xy
w wywołaniach ggplot.Nie jest to pełna odpowiedź, ale jest bardzo prosta. Przedstawia alternatywną metodę wyświetlania gęstości krańcowych, a także sposób korzystania z poziomów alfa dla graficznego wyjścia obsługującego przezroczystość:
źródło
To może być trochę za późno, ale zdecydowałem się stworzyć pakiet (
ggExtra
) w tym celu, ponieważ wymagał on trochę kodu i może być żmudny w pisaniu. Pakiet próbuje również rozwiązać niektóre powszechne problemy, takie jak zapewnienie, że nawet jeśli tytuł lub tekst jest powiększony, wątki nadal będą ze sobą wbudowane.Podstawowa idea jest podobna do tych, które dały odpowiedzi, ale wykracza poza to. Oto przykład, jak dodać histogramy krańcowe do losowego zestawu 1000 punktów. Miejmy nadzieję, że ułatwi to w przyszłości dodawanie histogramów / wykresów gęstości.
Link do pakietu ggExtra
źródło
Jeden dodatek, aby zaoszczędzić trochę czasu na szukanie ludzi, którzy robią to po nas.
Legendy, etykiety osi, teksty osi, znaczniki sprawiają, że wykresy oddalają się od siebie, więc Twój wykres będzie wyglądał brzydko i niespójnie.
Możesz to poprawić, używając niektórych z tych ustawień motywu,
i wyrównaj skale,
więc wyniki będą wyglądać dobrze:
źródło
Tylko bardzo niewielka zmiana w odpowiedzi BondedDust , w ogólnym duchu marginalnych wskaźników dystrybucji.
Edward Tufte nazwał to użycie wykresów dywanowych „wykresem kropkowym” i ma przykład w VDQI użycia linii osi do wskazania zakresu każdej zmiennej. W moim przykładzie etykiety osi i linie siatki również wskazują rozkład danych. Etykiety znajdują się przy wartościach podsumowania pięciu liczb Tukeya (minimum, dolny zawias, mediana, górny zawias, maksimum), dając szybkie wrażenie rozrzutu każdej zmiennej.
Te pięć liczb stanowi zatem numeryczną reprezentację wykresu pudełkowego. Jest to trochę skomplikowane, ponieważ nierównomiernie rozmieszczone linie siatki sugerują, że osie mają nieliniową skalę (w tym przykładzie są one liniowe). Być może najlepiej byłoby pominąć linie siatki lub zmusić je do umieszczenia w zwykłych lokalizacjach i po prostu pozwolić etykietom pokazać podsumowanie pięciu liczb.
źródło
Ponieważ nie było satysfakcjonującego rozwiązania dla tego rodzaju wykresu przy porównywaniu różnych grup, napisałem funkcję która to robi.
Działa zarówno dla danych zgrupowanych, jak i niezgrupowanych i akceptuje dodatkowe parametry graficzne:
źródło
Znalazłem pakiet (
ggpubr
), który wydaje się działać bardzo dobrze w przypadku tego problemu i rozważa kilka możliwości wyświetlenia danych.Link do pakietu jest tutaj i w formacie tym linku znajdziesz fajny tutorial jak go używać. Dla kompletności załączam jeden z przykładów, które odtworzyłem.
Najpierw zainstalowałem pakiet (wymaga
devtools
)Dla konkretnego przykładu wyświetlania różnych histogramów dla różnych grup, wspomina w powiązaniu z
ggExtra
: „Jednym z ograniczeńggExtra
jest to, że nie radzi sobie z wieloma grupami na wykresie rozrzutu i na wykresach krańcowych. W kodzie R poniżej podajemy rozwiązanie za pomocącowplot
pakietu ”. W moim przypadku musiałem zainstalować ten drugi pakiet:Postępowałem zgodnie z tym fragmentem kodu:
Co dla mnie działało dobrze:
Iris ustawia wykres rozrzutu histogramów marginalnych
źródło
shape = 19
wggscatter
. Kody kształtów tutajMożesz łatwo tworzyć atrakcyjne wykresy rozrzutu z marginalnymi histogramami za pomocą ggstatsplot (będzie również pasował i opisywał model):
Lub nieco bardziej atrakcyjny (domyślnie) ggpubr :
AKTUALIZACJA:
Zgodnie z sugestią @aickley do stworzenia fabuły wykorzystałem wersję rozwojową.
źródło
To stare pytanie, ale pomyślałem, że przydałoby się opublikowanie tutaj aktualizacji, ponieważ ostatnio napotkałem ten sam problem (dzięki Stefanie Mueller za pomoc!).
Najbardziej pozytywna odpowiedź przy użyciu gridExtra działa, ale wyrównywanie osi jest trudne / hacky, jak wskazano w komentarzach. Można to teraz rozwiązać za pomocą polecenia ggMarginal z pakietu ggExtra, na przykład:
źródło
Wypróbowałem te opcje, ale nie byłem zadowolony z wyników lub niechlujnego kodu, którego trzeba użyć, aby się tam dostać. Na szczęście dla mnie, Thomas Lin Pedersen właśnie opracował pakiet o nazwie patchwork , który wykonuje swoją pracę w całkiem elegancki sposób.
Jeśli chcesz utworzyć wykres rozrzutu z marginalnymi histogramami, najpierw musisz osobno utworzyć te trzy wykresy.
Jedyne, co pozostało, to dodać te wykresy za pomocą prostego
+
i określić układ za pomocą funkcjiplot_layout()
.Funkcja
plot_spacer()
dodaje pusty wykres w prawym górnym rogu. Wszystkie inne argumenty powinny być oczywiste.Ponieważ histogramy w dużym stopniu zależą od wybranej szerokości pasma, można argumentować, że preferowane są wykresy gęstości. Przy niewielkich modyfikacjach można by uzyskać np. Piękny wykres do śledzenia wzroku.
Chociaż na tym etapie dane nie są dostarczane, podstawowe zasady powinny być jasne.
źródło
Aby zbudować na odpowiedzi @ alf-pascu, konfigurując każdy wykres ręcznie i ustawiając je za pomocą
cowplot
zapewnia dużą elastyczność zarówno w odniesieniu do działek głównych, jak i marginalnych (w porównaniu z niektórymi innymi rozwiązaniami). Jednym z przykładów jest dystrybucja według grup. Zmiana głównego wątku na wykres o gęstości 2D to inna sprawa.Poniższy rysunek tworzy wykres rozrzutu z (odpowiednio wyrównanymi) histogramami marginalnymi.
Aby zamiast tego wykreślić wykres gęstości 2D, po prostu zmień główny wykres.
źródło
Inne rozwiązanie wykorzystujące
ggpubr
icowplot
, ale tutaj tworzymy działki używająccowplot::axis_canvas
i dodajemy je do oryginalnej działki za pomocącowplot::insert_xaxis_grob
:źródło
Obecnie istnieje co najmniej jeden pakiet CRAN, który tworzy wykres rozrzutu z jego marginalnymi histogramami.
źródło
Możesz skorzystać z interaktywnej formy
ggExtra::ggMarginalGadget(yourplot)
i wybierać między wykresami pudełkowymi, wykresami skrzypcowymi, wykresami gęstości i histogramami, które są łatwe.tak
źródło