Najbardziej niewykorzystana wizualizacja danych [zamknięte]

178

Histogramy i wykresy rozrzutu są świetnymi metodami wizualizacji danych i zależności między zmiennymi, ale ostatnio zastanawiałem się, jakich technik wizualizacji brakuje. Jak myślisz, jaki rodzaj fabuły jest najczęściej wykorzystywany?

Odpowiedzi powinny:

  1. Niezbyt często stosowane w praktyce.
  2. Bądź zrozumiały bez dużej ilości dyskusji w tle.
  3. Stosuj w wielu typowych sytuacjach.
  4. Dołącz powtarzalny kod, aby utworzyć przykład (najlepiej w języku R). Połączony obraz byłby miły.
Ian Fellows
źródło
13
Myślę, że to bardzo przydatna dyskusja i przykro mi, że została zamknięta.
Alex Brown
2
@AlexBrown: to dlaczego nie zagłosować, aby ponownie otworzyć? Rozumiem, dlaczego sformułowanie tego pytania może wydawać się „niekonstruktywne”, ale to pytanie zaowocowało jednymi z najbardziej przemyślanych i wnikliwych odpowiedzi na ten temat w dowolnym miejscu w sieci. Chciałbym zobaczyć te odpowiedzi zaktualizowane i rozszerzone.
maks.
2
Prawdopodobnie powinno to zostać przeniesione na stats.stackoverflow.com. Jest o wiele bardziej odpowiedni dla tej strony.
naught101
4
Szkoda, że ​​nikt nie wspomniał tutaj o działkach QQ , zanim to zostało zamknięte. Są tak cholernie przydatne!
naught101
To powinno zostać ponownie otwarte.
Peter Flom,

Odpowiedzi:

89

Naprawdę zgadzam się z innymi plakatami: książki Tufte są fantastyczne i warte przeczytania.

Po pierwsze, chciałbym wskazać bardzo fajny samouczek na temat ggplot2 i ggobi z „Looking at Data” na początku tego roku. Poza tym chciałbym tylko podkreślić jedną wizualizację z R i dwa pakiety graficzne (które nie są tak szeroko stosowane jak grafika podstawowa, sieć czy ggplot):

Mapy cieplne

Naprawdę lubię wizualizacje, które potrafią obsługiwać dane wielowymiarowe, zwłaszcza dane szeregów czasowych. Przydadzą się do tego mapy cieplne . Jedną naprawdę fajną prezentował David Smith na blogu Revolutions . Oto kod ggplot dzięki uprzejmości Hadley:

stock <- "MSFT"
start.date <- "2006-01-12"
end.date <- Sys.Date()
quote <- paste("http://ichart.finance.yahoo.com/table.csv?s=",
                stock, "&a=", substr(start.date,6,7),
                "&b=", substr(start.date, 9, 10),
                "&c=", substr(start.date, 1,4), 
                "&d=", substr(end.date,6,7),
                "&e=", substr(end.date, 9, 10),
                "&f=", substr(end.date, 1,4),
                "&g=d&ignore=.csv", sep="")    
stock.data <- read.csv(quote, as.is=TRUE)
stock.data <- transform(stock.data,
  week = as.POSIXlt(Date)$yday %/% 7 + 1,
  wday = as.POSIXlt(Date)$wday,
  year = as.POSIXlt(Date)$year + 1900)

library(ggplot2)
ggplot(stock.data, aes(week, wday, fill = Adj.Close)) + 
  geom_tile(colour = "white") + 
  scale_fill_gradientn(colours = c("#D61818","#FFAE63","#FFFFBD","#B5E384")) + 
  facet_wrap(~ year, ncol = 1)

Co kończy się mniej więcej tak:

alternatywny tekst

RGL: Interaktywna grafika 3D

Kolejnym pakietem, którego warto się nauczyć, jest RGL , który z łatwością zapewnia możliwość tworzenia interaktywnej grafiki 3D. Istnieje wiele przykładów online (w tym w dokumentacji rgl).

R-Wiki ma ładny przykład rysowania wykresów punktowych 3D za pomocą rgl.

GGobi

Kolejnym pakietem, który warto poznać, jest rggobi . Jest na ten temat książka Springera i mnóstwo świetnej dokumentacji / przykładów online, w tym na kursie „Looking at Data” .

Shane
źródło
miły. Dziękujemy za podanie kodu / obrazu.
Ian Fellows
co jest wskazywane przez pionowe położenie „Z” lub zgięcie w każdej jednolitej czarnej pionowej linii?
doug
Są to granice miesięcy (miesiące nie kończą się tego samego dnia).
Shane
3
To jest piękne. Jak udało Ci się osiągnąć granice miesiąca?
Alex Brown
58

Bardzo lubię dotploty i kiedy polecam je innym w przypadku problemów z danymi, zawsze są zaskoczeni i zachwyceni. Nie wydają się zbytnio użyteczne i nie mogę zrozumieć, dlaczego.

Oto przykład z Quick-R: dotplot na danych samochodu

Uważam, że Cleveland jest najbardziej odpowiedzialny za ich rozwój i rozpowszechnianie, a przykład w jego książce (w której błędne dane można było łatwo wykryć za pomocą kropki) jest silnym argumentem za ich użyciem. Zauważ, że powyższy przykład pokazuje tylko jedną kropkę na linię, podczas gdy ich prawdziwa moc pochodzi z tobą, masz wiele kropek na każdej linii, z legendą wyjaśniającą, która jest która. Na przykład, możesz użyć różnych symboli lub kolorów dla trzech różnych punktów czasowych, a tym samym łatwo poznać wzorce czasowe w różnych kategoriach.

W poniższym przykładzie (wykonanym w Excelu wszystkich rzeczy!) Możesz wyraźnie zobaczyć, która kategoria mogła ulec zmianie z powodu zamiany etykiet.

Dotplot z 2 grupami

Ari Ari Friedman
źródło
1
Czym różni się wykres punktowy od wykresu rozrzutu z osią przełączaną, z których jedna jest kategoryczna?
DrSAR,
4
@DrSAR W jaki sposób histogram różni się od wykresu słupkowego lub wykres gęstości różni się od wykresu liniowego? Możesz opisać wiele standardowych typów wykresów w kategoriach bardziej fundamentalnych geometrii (por. Semiologie Graphique Bertina ), ale to nie sprawia, że ​​wgląd w wykreślanie czegoś w określony sposób jest mniej wyjątkowy. W takim przypadku drukujesz dwa fragmenty informacji kategorycznych (jeden w pionie, jeden w kształcie znaku kreślenia) na jednym kawałku ciągłych danych. Podczas gdy w większości pakietów oprogramowania włamałbyś się do tworzenia wykresu rozrzutu, aby go utworzyć, najbardziej nie jest to wykres rozrzutu.
Ari B. Friedman
2
@ gsk3 Nie chciałem brzmieć snarky. W rzeczywistości teraz (po przeczytaniu więcej na temat gramatyki grafiki i podobnych dzieł) zdaję sobie sprawę, że to rozróżnienie wyższego poziomu może być dość ważne dla prezentacji. Dzięki za pokazanie tego.
DrSAR,
@DrSAR I nie chciałem brzmieć defensywnie. Charakter komentarzy SO, jak sądzę ;-)
Ari B. Friedman
56

Wykresy korzystające ze współrzędnych biegunowych są z pewnością niewykorzystane - niektórzy twierdzą, że nie bez powodu. Myślę, że sytuacje uzasadniające ich użycie nie są powszechne; Myślę też, że kiedy takie sytuacje się pojawią, wykresy biegunowe mogą ujawnić wzorce danych, których wykresy liniowe nie są w stanie.

Myślę, że dzieje się tak dlatego, że czasami twoje dane są z natury biegunowe, a nie liniowe - np. Są cykliczne (współrzędne x reprezentują czasy w ciągu 24-godzinnego dnia przez wiele dni) lub dane były wcześniej mapowane na polarną przestrzeń cech.

Oto przykład. Ten wykres pokazuje średni ruch w witrynie według godziny. Zwróć uwagę na dwa skoki o 10 wieczorem i o 1 w nocy. Dla inżynierów sieciowych Witryny są one znaczące; znaczące jest również to, że występują one blisko siebie (w odstępie zaledwie dwóch godzin). Ale jeśli wykreślisz te same dane na tradycyjnym układzie współrzędnych, wzór ten byłby całkowicie ukryty - wykreślony liniowo, te dwa skoki byłyby w odstępie 20 godzin, to są one, chociaż są one również tylko dwie godziny w kolejnych dniach. Powyższy wykres polarny pokazuje to w oszczędny i intuicyjny sposób (legenda nie jest konieczna).

Wykres polarny pokazujący ruch w witrynie, ze szczytami w godzinach 1 i 22

Są dwa sposoby (o których wiem), aby utworzyć takie wykresy za pomocą R (stworzyłem wykres powyżej w / R). Jednym z nich jest zakodowanie własnej funkcji w systemie graficznym bazowym lub gridowym. Innym sposobem, który jest łatwiejszy, jest użycie okrągłego pakietu . Można by użyć funkcji „ rose.diag ”:

data = c(35, 78, 34, 25, 21, 17, 22, 19, 25, 18, 25, 21, 16, 20, 26, 
                 19, 24, 18, 23, 25, 24, 25, 71, 27)
three_palettes = c(brewer.pal(12, "Set3"), brewer.pal(8, "Accent"), 
                   brewer.pal(9, "Set1"))
rose.diag(data, bins=24, main="Daily Site Traffic by Hour", col=three_palettes)
doug
źródło
4
Po skopiowaniu kodu otrzymuję zupełnie inną fabułę (co jest dość brzydkie); jakiś pomysł dlaczego? Otrzymuję to ostrzeżenie: 1: w as.circular (xx [, 1]): obiekt jest przymuszany do klasy „kołowej” przy użyciu wartości domyślnej dla następujących komponentów: typ: „kąty” jednostki: szablon „radianów”: „ none 'modulo:' asis 'zero: 0 rotacja:' counter 'rose.diagdata24Codziennie ruch w witrynie według Hourthree_palettes
datayoda
Mam ten sam problem.
crayola
Możesz to zrobić również za pomocą wykresu liniowego. Może być nieco trudniejszy do odczytania, ale może też być naprawdę niesamowity dla bardziej szczegółowych danych lub danych, które przechodzą więcej niż jeden cykl (np. Wykreśl dziesięć cykli, a następnie wykreśl ich średnią).
naught101
1
Miałem też problemy z odtworzeniem fabuły. W końcu zdecydowałem, że łatwiej jest używać ggplot2. Zostawiłem krótkie demo na Rpubs z kodem i wynikami: rpubs.com/mattbagg/circular
MattBagg 24.04.2013
1
Odpowiednik ggplot2:qplot(y=data, x=1:length(data), fill=factor(1:length(data)), stat='identity', geom='bar') + coord_polar()
naught101
54

Jeśli wykres rozproszenia ma tak wiele punktów, że staje się kompletnym bałaganem, wypróbuj wygładzony wykres rozproszenia. Oto przykład:

library(mlbench) ## this package has a smiley function
n <- 1e5 ## number of points
p <- mlbench.smiley(n,sd1 = 0.4, sd2 = 0.4) ## make a smiley :-)
x <- p$x[,1]; y <- p$x[,2]
par(mfrow = c(1,2)) ## plot side by side
plot(x,y) ## left plot, regular scatter plot
smoothScatter(x,y) ## right plot, smoothed scatter plot

hexbinOpakowanie (sugeruje @Dirk Eddelbuettel) służy do tego samego celu, lecz smoothScatter()ma tę zaletę, że należące do graphicsopakowania i stanowi część standardowej instalacji R.

Smiley jako zwykły lub wygładzony wykres rozproszenia

nullglob
źródło
6
Dla zachowania kompletności możesz również uzyskać ten efekt w ggplot za pomocą przezroczystości (alfa).), W połączeniu z punktem geom.
Paul Hiemstra
1
czy jest to to samo, co oszacowanie gęstości jądra, czy po prostu podobne?
endolith
30

Odnośnie wykresie przebiegu i innych Tufte idei, YaleToolkit pakiet na CRAN zapewnia funkcje sparklinei sparklines.

Kolejny pakiet, który jest użyteczny w przypadku większych zbiorów danych jest hexbin jak to sprytnie danych „koszach” do wiadra do czynienia ze zbiorami danych, które mogą być zbyt duże dla naiwnych rozrzutu.

Dirk Eddelbuettel
źródło
4
+1 do wykresów przebiegu w czasie. Obecnie pracuję nad pakietem, który koncentruje się na tworzeniu wykresów przebiegu w czasie w R - dodają świetne dodatki do tabel w raportach Sweave.
Sharpie
1
Chłodny! Nie jestem zbyt zadowolony z tego, co Jay ma w YaleToolkit i chciałbym mieć wykresy przebiegu w czasie!
Dirk Eddelbuettel
Właśnie udokumentowałem sposób tworzenia wykresów przebiegu w czasie tylko przy użyciu plotaktualizacji w moim pytaniu , z pewną pomocą tego postu na forum Tufte
Ben
1
Hmisc::latex()Wersja z wyjściem Hmisc::describezawiera mini-histogram, który zostanie uwzględniony w tabeli.
IRTFM,
28

Wykresy skrzypcowe (które łączą wykresy skrzynkowe z gęstością jądra) są stosunkowo egzotyczne i całkiem fajne. Vioplot pakiet w R pozwala uczynić je dość łatwo.

Oto przykład (link do Wikipedii pokazuje również przykład):

wprowadź opis zdjęcia tutaj

Jason Sundram
źródło
3
Wykresy skrzypcowe są również dostępne za pośrednictwem pakietu kratowego:bwplot(... panel = panel.violin)
David J.
3
Wersja wykresów skrzypcowych ggplot2 już wkrótce. github.com/wch/ggplot2/wiki/geom_violin
Roman Luštrik
Nie cienkie wykresy skrzypiec są tak przydatne, wolę zamiast tego pokazywać wszystkie kropki za pomocą fluktuacji.
Nakx
25

Kolejną miłą wizualizacją szeregów czasowych, którą właśnie przeglądałem, jest „wykres wypukły” (opisany w tym poście na blogu „Learning R” ). Jest to bardzo przydatne do wizualizacji zmian pozycji w czasie.

Możesz przeczytać o tym, jak go utworzyć na http://learnr.wordpress.com/ , ale tak to wygląda:

alternatywny tekst

Shane
źródło
Podoba mi się wykres wypukły dla tych konkretnych danych, ale trudno mi myśleć o bardziej ogólnych sytuacjach, w których byłby użyteczny. To powiedziawszy, myślę, że wszyscy możemy się zgodzić, że blog Learning R kołysze skarpetki.
Ian Fellows
7
Wykres wypukły jest równoległym wykresem współrzędnych danych rankingowych.
hadley,
1
przypomina mi to slopegraph, który jest dobry do reprezentowania zmiany rankingu w czasie lub relacji między rankingami: charliepark.org/slopegraphs
topchef 24.04.2013
21

Podoba mi się również modyfikacja wykresów pudełkowych przez Tufte, która pozwala na łatwiejsze porównywanie małych wielokrotności, ponieważ są one bardzo „cienkie” w poziomie i nie zaśmiecają wydruku zbędnym atramentem. Działa jednak najlepiej z dość dużą liczbą kategorii; jeśli masz tylko kilka na działce, zwykłe (Tukey) wykresy pudełkowe wyglądają lepiej, ponieważ mają nieco większą wagę.

library(lattice)
library(taRifx)
compareplot(~weight | Diet * Time * Chick, 
  data.frame=cw , 
  main = "Chick Weights",
  box.show.mean=FALSE,
  box.show.whiskers=FALSE,
  box.show.box=FALSE
  )

porównaj wykres

Inne sposoby ich tworzenia (w tym inny rodzaj wykresu pudełkowego Tufte) zostały omówione w tym pytaniu .

Ari Ari Friedman
źródło
@daroczig Thanks. Któregoś dnia przepiszę go, aby przyjmował różne konfiguracje grup. Wiele się nauczyłem, odkąd napisałem tę funkcję!
Ari B. Friedman
1
Lubię twoje wątki znacznie lepiej niż tufte, które są absurdalnie trudne do odczytania. Nadal uważam, że wykresy pudełkowe w stylu Tukey są lepsze, chociaż dobrym kompromisem może być coś takiego, jak tutaj, ale z liniami szerokości 3px zamiast przesunięcia 1px. I myślę, że linia pozioma o szerokości 1px dla mediany jest prawdopodobnie bardziej starsza i dokładniejsza.
naught101
19

Nie powinniśmy zapominać o uroczej i (historycznie) ważnej fabule łodyg i liści (którą Tufte też uwielbia!). Otrzymujesz bezpośredni numeryczny przegląd gęstości i kształtu danych (oczywiście jeśli twój zestaw danych nie jest większy niż około 200 punktów). W R funkcja stemwytwarza wyświetlanie pędów i liści (w obszarze roboczym). Wolę używać gstemfunkcji z pakietu fmsb, aby narysować ją bezpośrednio w urządzeniu graficznym. Poniżej przedstawiono odchylenie temperatury ciała bobra (dane powinny znajdować się w domyślnym zestawie danych) na ekranie łodyg po liściach:

  require(fmsb)
  gstem(beaver1$temp)

wprowadź opis zdjęcia tutaj

Geek On Acid
źródło
15

Oprócz doskonałej pracy Tufte polecam książki Williama S. Clevelanda: Wizualizacja danych i elementy grafowania danych . Są nie tylko doskonałe, ale wszystkie zostały wykonane w języku R i uważam, że kod jest publicznie dostępny.

Peter Flom
źródło
14

Boxplots! Przykład z pomocy R:

boxplot(count ~ spray, data = InsectSprays, col = "lightgray")

Moim zdaniem jest to najbardziej poręczny sposób na szybkie sprawdzenie danych lub porównanie dystrybucji. W przypadku bardziej złożonych dystrybucji istnieje rozszerzenie o nazwie vioplot.

mbq
źródło
Wykresy pudełkowe nie są zbyt rzadko wykorzystywane, prawda? Mam na myśli, że w wielu artykułach wykresy słupkowe są używane do danych, które powinny być wykreślone, ale wciąż są dość powszechne.
naught101
11

Wydaje mi się, że wykresy mozaikowe spełniają wszystkie cztery wymienione kryteria. Istnieją przykłady wr, pod mozaiką.

Peter Flom
źródło
3
Lepsza implementacja wykresów mozaikowych znajduje się w bibliotece vcd (nazwa funkcji „mozaika”). Ma znacznie bardziej elastyczną sygnaturę metody i jest zaimplementowany w siatce (a nie w podstawowym systemie graficznym).
doug
10

Sprawdź pracę Edwarda Tufte'a, a zwłaszcza tę książkę

Możesz także spróbować złapać jego podróżną prezentację . Jest całkiem dobry i zawiera pakiet czterech jego książek. (przysięgam, że nie posiadam akcji jego wydawcy!)

Nawiasem mówiąc, podoba mi się jego technika wizualizacji danych w czasie. Niespodzianka! Google już to napisał i opublikował w Kodzie Google

Paul Sasik
źródło