Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

Dla wszystkich, którzy jeszcze się opierają i/lub zarzekają, że nigdy poza base/trellis nie wyjdą :)

http://mandymejia.wordpress.com/2013/11/13/10-reasons-...

Przyznaję, samemu mi to zajęło sporo czasu. Lenistwo :] Nie chciało mi się uczyć nowego narzędzia o zupełnie innej filozofii tworzenia wykresów. Odkąd zacząłem przygodę z biblioteką ggplot2, jestem w niej totalnie zakochany :)

Z jednej strony standardowa biblioteka graficzna (nazwijmy ją "base") Rossa Ihaki jest fajna, bo: prosta w użyciu, generuje czytelne wykresy, dobrze wyglądające w publikacjach, działa z nią "identify", ma duże możliwości. Z drugiej strony base nie jest "sformalizowany", brak w nim modułowości/klocków schematyzujących i upraszczających pracę, nieraz trzeba się sporo nakombinować, by stworzyć bardziej złożone wykresy o atrakcyjniejszym, niż domyślny, wyglądzie. Innymi słowy - można w nim zrobić wszystko, ale nie zawsze jest to opłacalne. Wiem coś o tym, bo często muszę tworzyć złożone wykresy/diagramy prezentujące dane z różnej perspektywy i lubię, by były atrakcyjne graficznie (co nie znaczy przekombinowane albo "przesłodzone" jak w Excelu).

Biblioteka ggplot2 oferuje inne podejście do tworzenia wykresów. Stanowi ona (uproszczoną) implementacją opracowanej przez L. Wilkinsona "gramatyki do opisu grafiki" (The Grammar of Graphics), ujednolicającej różne aspekty związane z tworzeniem wykresów. Jak się "załapie" pewne kwestie, to potem działa się intuicyjnie, nieomal automatycznie. Możliwości tej biblioteki są potężne, generowane wykresy są estetyczne (estetyka wręcz "prezentacyjna") i czytelne (o ile tego zbytnio nie zepsujemy), w banalnie prosty sposób uzyskuje się "rozbicie" na kategorie, nakładanie warstw (np. histogram, jądrowy estymator gęstości, adnotacje). Oto skromna próbka możliwości biblioteki w Google Images. Początkującym użytkownikom stawianie pierwszych kroków z ggplot2 może ułatwić Deducer plot builder.

"Base" nadal stanowi dla mnie ostatnią deskę ratunku w sytuacji, gdy umiejętności nie pozwalają mi uzyskać określonego efektu w ggplot2, ale z dnia na dzień jest tego coraz mniej. Ggplot2 nie współpracuje też (AFAIK) z "identify", więc do "interaktywnych zabaw" base jest nadal jak znalazł. Niemniej jednak - czas poświęcony na naukę ggplot2 na pewno nie będzie stracony.

Nieco źródeł wiedzy:
* http://www.cookbook-r.com/Graphs/
* ggplot2: elegant graphics for data analysis (PDF)
* http://docs.ggplot2.org/current/
* http://www.ceb-institute.org/bbs/wp-content/uploads/20...
* http://www.amazon.com/Grammar-Graphics-Statistics-Comp...

* Allegro: R GRAPHICS COOKBOOK
* Allegro: GGPLOT2: ELEGANT GRAPHICS FOR DATA ANALYSISTen post został edytowany przez Autora dnia 20.05.14 o godzinie 18:11

Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

Adrian, popieram w całej rozciągłości. Nawet, jeśli może za chwilę wydać się, że wdaję się w polemikę :)

Chyba rzeczywiście base/trellis (dodałbym jeszcze lattice) mają swoich zwolenników, ale dla mnie to akurat ggplot2 był jednym z ważnych powodów, dla których zawędrowałem do R. Z implementacji Grammar of Graphics dobrze znam tylko ggplot2 i GPL/nVIZn w SPSS (swoją drogą tymi projektami w SPSS kierował przez kilka lat nie kto inny, jak Leland Wilkinson). nVIZn to trochę inna bajka, GPL (Graphics Programming Language) jest generalnie porównywalny do ggplot2. W takim porównaniu ggplot2 wypada znacznie lepiej: dużo bardziej ekonomiczny kod, pełne możliwości transformacji danych R, lepsza kontrola elementów składowych wykresu, rezultaty pracy z facets, wykorzystanie niepełnej deklaracji jako podstawy do modyfikacji wykresu / eksploracji danych. Usprawiedliwieniem dla Wilkinsona jest to, że w SPSS możliwości języka musiały stawać równocześnie dostępne w przyjemny sposób na poziomie GUI; ograniczenie, które nie limituje rozwoju ggplot2, a Deducer pokazuje, że zupełnie nie przeszkadza to w rozwoju sympatycznego GUI.

Oprócz tych implementacji bardzo ciekawy jeszcze wydaje się Bokeh (prezentacja: youtube.com/watch?v=6_aE0kAedL0 ): projekt bardzo obiecujący, którego celem jest przeniesienie 1:1 możliwości ggplot2 (odtworzenie pełnej składni!) do Pythona. Mocną stroną jest osadzenie Bokeh na Pandas. Dzięki Pandas rezultatem jest grafika z dużymi możliwościami pracy interaktywnej i bezpośrednią możliwością osadzenia w HTML. Czyli to, czego brakuje ggplot2.

The Grammar of Graphics było też inspiracją dla Tableau: widać to w sposobie tworzenia wizualizacji w GUI, ale po stronie kodu (chyba, że z czegoś nie zdaję sobie sprawy) jest to już niskopoziomowa definicja. Możnaby więc Tableau potraktować jako implementację Grammar of Graphics w której, tak się składa, darowano sobie implementację języka opartego na tej gramatyce.

Tutaj dochodzę do momentu, gdy - choć ggplot2 uwielbiam - czasami miewam jednak (choć naprawdę bardzo bardzo rzadko) poczucie straconego czasu zainwestowanego w naukę tego pakietu. Bo ggplot2 jest rozwiązaniem dojrzałym, ale nie rozwojowym. Kontrola, jaką daje nad statyczną wizualizacją danych, jest nieporównywalna do żadnego innego znanego mi rozwiązania. Ale kierunkiem rozwoju wizualizacji danych jest raczej interaktywna eksploracja i zachowanie tej interaktywności po publikacji w HTML. Ideałem byłoby dla mnie, gdyby funkcjonalność i elegancję języka i wykresów z ggplot2 polączyć z urodą i interaktywnością d3.js.

Takiego idealnego rozwiązania nie ma, ale trwają prace dające nadzieję na jego powstanie. Chciałbym zwrócić uwagę na pakiet ggvis (niedostępny na CRAN, instalacja bezpośrednio z GitHub): http://ggvis.rstudio.com/.
W mojej ocenie na plus:
- wykorzystanie vega https://github.com/trifacta/vega/wiki/Vega-and-D3, czyli bardziej wysokopoziomowy dostęp do d3.js i renderowanie grafiki do SVG lub HTML5 Canvas;
- inspiracja ggplot2 i aspiracje, by odtworzyć jego pełną funkcjonalność; zachowanie nazw funkcji ggplot2;
- funkcje pozwalające łatwo definiować elementy interakcji;
- komunikacja zwrotna z WWW do R poprzez shiny (Shiny Server).
Minusy w mojej ocenie:
- zalezność od Shiny Server (http://www.rstudio.com/shiny/server/); w pewnych sytuacjach daje to większe możliwości, ale wolałbym, żeby publikacja do HTML była również możliwa z podarowaniem sobie możliwości komunikacji zwrotnej do R, po prostu poprzez SVG lub Canvas - tak jest np. w rCharts (również dostęp do d3.js, ale przy tradycyjnej filozofii definiowania wykresów przez typ wykresu i parametry);
- zmiany składni w stosunku do ggplot2: można się przyzwyczaić, ale nie bardzo potrafię dostrzec korzyści.

Z ciekawostek, Hadley Wickham rozpoczął kiedyś pracę nad pakietem o fantastycznie dobranej nazwie r2d3, który miał jednym poleceniem przenosić wykresy ggplot2 do d3. Nieaktualizowany od 2012 i chyba nie bardzo działający projekt jest na GitHub w wersji 0.0.1. A szkoda.

Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

Jak zwykle, wszystko zależy od potrzeb :)

Z "base" korzystam wtedy, kiedy chcę oznaczyć sobie wygodnie "podejrzane" dane na scatterplocie/boxplocie za pomocą identify(), a także, kiedy muszę wykonać sporo "adnotacji" - linii, strzałek itd. Ale to tylko dlatego, że po prostu lepiej znam base i mimo wszystko, w tym zakresie, swobodniej się w nim czuję.

Z ggplot2 korzystam wtedy, kiedy muszę szybko wykonać mega-przeglądowe diagramy, gdzie złożenie boxplota, scatterplota, histogramu, "rug'a" i i powtórzyć taki "kombajn" dla kolejnych poziomów predyktora(ów) jakościowych (facety). Pamiętam, ile roboty mnie kosztowało w base nałożenie boxplota + vioplota na scatterplot i "split po poziomach".

Ale i ggplot2 ma swoje ograniczenia, np. nie da się łatwo dodać drugiej osi Y i jak chcę pokazać dwie różne zmienne na jednym wykresie, albo muszę uwspólnić skalę (ciężko się to analizuje), albo kombinować z grobami (:]) i "rysować" dodatkową skalę, albo po prostu pokazać dwa wykresy obok siebie. W Base nie było z tym problemów. I nie ma tej funkcji w ggplot2 nie dlatego, że się nie da, tylko dlatego, że autor ma po prostu takie widzimisię - nie, bo nie, bo to jest ZUO:

It's not possible in ggplot2 because I believe plots with separate y scales (not y-scales that are transformations of each other) are fundamentally flawed.
(źródło)

Są także dynamiczne wykresy, oparte jak wspomniałeś o JS, w tym pamiętam pakiet korzystający z Google Charts - GoogleVis dla R (Przykłady).

Obrazek


Obrazek

Potencjalna wada - konieczność połączenia z Internetem i wykorzystanie przeglądarki.

Ale akurat te wykresy, choć są super, nie są mi zbytnio potrzebne, ponieważ nie pracuję z wykresami prezentacyjnymi typu "highly interactive", a jak muszę te dane "pooglądać" to korzystam z GGobi albo piszę aplikację w .NETcie.

W mojej pracy (badania kliniczne) największy nacisk kładzie się na obserwację danych ("The first thing to do with data is to look at it ") - detekcja obserwacji "podejrzanych", poszukiwanie pewnych wzorców, przegląd stanu wprowadzania danych w poszczególnych ośrodkach, obserwacja ich rozkładu. Tutaj możliwość komponowania wykresu z klocków (nakładania ich na siebie) i prosta metoda powielenia takiego wykresu w funkcji wartości predyktorów jakościowych jest dla mnie priorytetem w stosunku do interaktywności. Prawdę powiedziawszy, gdyby nie R, to opcją dla mnie byłby najwyżej GNUPlot albo... Excel :) Zresztą i tak wiele z tych wykresów trafia potem do raportu jako EMFy. Z tego powodu dla mnie, w zakresie moich zastosowań, czas poświęcony na GGPlot2 nie jest dla mnie czasem straconym, bo daje mi dokładnie to, czego potrzebuję (a nawet więcej).

Druga sprawa - często tworzę dedykowane narzędzia z wykorzystanie R, które przekazuje zainteresowanym osobom. Taka "paczka" złożona z podstawowego pakietu R, potrzebnych bibliotek (z użyciem np. packrat'a) i plikowej bazy danych Access/SQLite/H2, gdzie dwuklikiem uruchamiasz rscript, wykonują się analizy i zostaje wyświetlone podsumowanie w statycznym HTML albo PDF. Względnie, jeśli narzędzie jest bardziej rozbudowane, korzystam z gWidgets i tworzę "osadzony" interfejs użytkownika. Tutaj istotne dla mnie jest: prosta instalacja (przekopiowanie plików), zero "serwerów" i minimum zależności (najwyżej Java dla JDBC lub zainstalowany sterownik dla ODBC). Powtarzając za Thoreau - "Prostota, prostota" :)

Ty jednak, z tego co wiem, pracujesz bardzo dużo w ramach data miningu, eksplorujesz dane, "obracasz je na wszystkie strony", a dodatkowo zapewne musisz prezentować wyniki pewnych analiz klientom, prawda? A zatem potrzebujesz ładnej, dynamicznej warstwy prezentacji - dla Ciebie ggplot2 nie będzie strzałem w dziesiątkę. Chyba, że dostanie "nowe szaty".

Tak, że każdy musi sobie odpowiedzieć na pytanie czego potrzebuje, by nie stracić czasu na naukę mniej przydatnych narzędzi.

PS1: Shiny jest jedną z najfajniejszych rzeczy, jakie powstały "around R".
PS2: R2D3 - zawsze podziwiałem ludzi, którzy potrafią w kilku literach zawszeć tyle rzeczy, np. tu:pochodną imienia robota z Gwiezdnych Wojen, określenie przynależności "R to ..." oraz nazwę biblioteki :)Ten post został edytowany przez Autora dnia 24.05.14 o godzinie 16:26

Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

No pewnie, że wszystko zależy od potrzeb.

W moim przypadku te potrzeby mogą być bardzo różne:
- w najprostszej sytuacji, jeśli potrzebuję czegoś na szybko do prezentacji lub dokumentu i akurat pracuję w SPSS, pewnie w SPSS zostanę; grafika z defualtu nie nadaje się do publikacji, ale przystosowanie jej to względnie niewiele pracy; do PPT/DOC wystarcza mi eksport do PNG i ten SPSS dobrze obsługuje; całkiem możliwe jednak, że w takich zastosowaniach użyję wykresu Excela (też po modyfikacjach), w szczególności, co się zdarza, jeśli prezentacja wyników jest do Excela; jeśli potrzebuję zautomatyzować budowanie wizualizacji, pewnie będzie to SPSS lub Excel i VBA lub SPSS+VBA lub SPSS+Python lub inna podobna konfiguracja (potencjalnie również z R, choć R produkcyjnie chętniej wykorzystuję w innych zastosowaniach), w zależności od potrzeb, z zastrzeżeniem, że i tak możliwie jak najwięcej rzeczywistej pracy obliczeniowej będę chciał przerzucić na bazę danych;
- jeśli potrzebuję grafiki statycznej w wysokim standardzie publikacyjnym (czyli np. artykuł, grafika do książki, rzadziej: materiały biznesowe) i eksportu do grafiki wektorowej - ggplot2 w wielu zastosowaniach będzie świetnym rozwiązaniem i będzie to dla mnie prawdopodobnie w tym momencie pierwszy wybór (choć długo radziłem sobie z SPSS);
- do eksploracji graficznej wolałbym pewnie coś pokroju latticist pracujące na dużych danych + scatter3d {car}, a najlepiej, jakby wyglądało to i obiecywało coś podobnego do: http://superconductor.github.io/superconductor/; po prawdzie jednak, jeśli to eksploracja na moje potrzeby, nie potrzebuję ładnych grafik i najszybciej pracuję na produktach SPSS lub w ogóle nie wychodząc poza SQL - grafikę trzeba sobie samemu wyobrazić :);
- zabawa zaczyna się przy implementacjach analiz w środowiskach produkcyjnych i tutaj moja rola to raczej tylko baza danych, algorytmy i generowanie danych wejściowych dla wizualizacji; osobiście dla aplikacji webowych / thin client wybierałbym vega/d3.js - lubię, kiedy z wynikami mojej pracy można później w ten sposób dalej pracować; implementacji do narzędzi standalone nigdy nie robiłem ani nie uczestniczyłem w takim projekcie; na potrzeby jednorazowej prezentacji wyników dla klienta teoretycznie też fajnie byłoby wykorzystać dynamiczną prezentację, ale gdyby mieć już zautomatyzowane rozwiązania; na chwilę obecną - to z mojej perspektywy za dużo pracy i przerost formy (a dynamiczną prezentację, jeśli chcieć, można zrobić na Excelu).

Tak to wygląda w (mojej) praktyce. W moim poprzednim poście bardziej jednak próbowałem bawić się w wizjonerstwo, niż opisywać swoją pracę. Myśląc nad tym, jak powinna wyglądać idealna (dostosowana do różnych potrzeb różnych użytkowników) implementacja Grammar of Graphics, widziałbym to następująco:
- język opisu grafiki i możliwości zastosowania przekształceń danych w definicji wykresu: ggplot2 jest czytelny, zwięzły a wsparty bazowymi funkcjonalnościami R daje taką elastyczność, że trudno wyobrazić mi sobie lepsze rozwiązanie, ale dla implementacji dodatkowych funkcjonalności mógłby okazać się zbyt ograniczony;
- zarządzanie wynikami w jednej strukturze projektowej pozwalającej na eksplorację historii projektu oraz dostęp do zapisanych obiektów: wykresy z możliwością przełączania się pomiędzy kodem źródłowym (z możliwością modyfikacji i podglądu oraz zapisu jej wyniku), strukturą obiektu wynikowego (XML/JSON: również z możliwością modyfikacji) i wynikiem renderowania; podgląd całości zapisanych wyników w różnych formatach (lista, szczegóły, kafelki, statyczne wykresy...);
- renderowanie wykresów do obiektów interaktywnych (2D, 3D, 4D - czyli z animacją pokazującą np. oś czasu jak w googleVis; identyfikacją punktów, ale też selekcją danych z możliwością zwrócenia wyniku np. jako filtru do zbioru źródłowego), tu myślę również o możliwości definiowania z poziomu języka kontrolek i późniejszej interakcji z nimi;
- żeby zapewnić skalowalność: elastyczność w zakresie zarządzania danymi podstawowymi dla wykresu (np. zapis kopii całości danych do struktury obiektu wynikowego, co pozwalałoby na interakcje np. na poziomie dodania do wykresu dodatkowych zmiennych; lub: zapis całości zmiennych wykorzystywanych dla budowy wykresu; lub: zapis tylko agregatów / próbek danych; lub: zapis definicji dostępu do danych źródłowych rzeczywiście przechowywanych w zewnętrznych strukturach - to dawałoby możliwość aktualizacji);
- eksport zarówno do obiektów statycznych (grafika, grafika wektorowa) jak i dynamicznych skryptów do publikacji na WWW (opartych na SVG lub Canvas); jako opcja również: do dynamicznych obiektów w środowisku publikacyjnym takim jak np. Shiny.
Lista nie jest kompletna...

Wiesz, taki ggplot2, tylko na sterydach i z napędem warp :)
I co sądziłbyś o takim rozwiązaniu?

Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

Przy okazji odświeżania wiedzy o nowościach, trafiłem na "staroć", ale całkiem fajny z punktu widzenia użytkownika RCommandera :) Niby mała rzecz, a o całkiem sporym potencjale i - w połączeniu z RCmdr - przydatna do nauki ggplot2
http://www.r-bloggers.com/rggplot2r-bloggersrcmdrplugi...

Przykład:

Obrazek


Obrazek


Obrazek
Ten post został edytowany przez Autora dnia 24.09.14 o godzinie 15:40
Adam Żyła

Adam Żyła Tester
Oprogramowania,
Square Design Sp.z
o.o.

Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

Witam serdecznie
Ma pytanie: w jaki sposób zainstalować ggplot2?

Po wpisaniu w terminalu:
install.packages("ggplot2")
oraz po wybraniu mirrora
zwraca:
"Warning message:
package ‘ggplot2’ is not available (for R version 3.0.2) "

Z góry dziękuje za wszelką pomoc.
Adam Żyła

Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

Trzeba zaktualizować R (i posiadane pakiety) do jak najnowszej wersji. Google podpowie jak wykonać aktualizację. Na najnowszej wersji zadziała zwykłe install.packages.

Google mówi: https://www.google.pl/search?q=is+not+available+(for+R+...
Pierwszy link: http://stackoverflow.com/questions/25721884/how-should...

Jeśli potrafi się skonfigurować środowisko tak, by można było budować pakiety ze źródeł, można skorzystać ze starszych wersji: https://cran.r-project.org/src/contrib/Archive/ggplot2/Ten post został edytowany przez Autora dnia 21.04.16 o godzinie 23:04
Piotr Ocalewicz

Piotr Ocalewicz Statystyka, Analiza
Danych, Data Mining,
Raportowanie

Temat: ggplot2 - "10 reasons to switch to ggplot2" :)

Fajną odpowiedzią na brak "interaktywności" w wykresach z R jest https://plot.ly/r/. Ja się dopiero w to wgryzam, ale wygląda bardzo obiecująco - składnia oparta o R i funkcjonalność ggplot2.

Z poziomu R można korzystać z bardzo fajnej funkcji
ggplotly()
z pakietu plotly . Zamienia ona statyczny wykres stworzony w ggplot2 na jego interaktywny odpowiednik, który można przybliżać/oddalać, filtrować kategorie, po najechaniu myszką pojawiają się etykiety danych itd. Wynik można zapisać w HTML i przesłać odbiorcy, który nie musi mieć zainstalowanego R.



Wyślij zaproszenie do