Naučite kako da pravite sve, od osnovnih linijskih grafikona do utrkujućih trakastih dijagrama – interaktivnih i lako animiranih – pomoću R paketa echarts4r. Iako za statične grafike uglavnom koristim ggplot2, uvek tražim načine za interaktivnu vizualizaciju. Paket echarts4r je jedan od mojih novih omiljenih paketa za to. Intuitivan je, moćan i fleksibilan. Paket echarts4r je R omotač za JavaScript biblioteku echarts, zvanični projekat fondacije Apache Software (napredovao iz statusa inkubatora u decembru). To mi pomaže da se samouvereno oslonim na JavaScript kôd na kojem se zasniva R paket.
Pa, pogledajmo echarts4r.
Autor paketa John Coene objašnjava osnove na početnoj stranici:
- Svaka funkcija u paketu počinje sa e_.
· Kodiranje vizualizacije započinjete stvaranjem echarts objekta pomoću funkcije e_charts (). Ona kao argumente prima vaš okvir podataka i kolonu x-ose.
· Dalje, dodajete funkciju za tip grafikona (e_line (), e_bar () itd.) sa nazivom kolone niza y-ose kao argumentom.
- Ostalo je uglavnom prilagođavanje!
Hajde da pogledamo.
Linijski grafikon sa echarts4r
Kao primer podataka, preuzeo sam i preuredio neke informacije o cenama stanova iz američkih gradova sa Zillowa. Ako želite da pratite primer, uputstva za podatke se nalaze na kraju ovog članka.
Moj okvir podataka, houses_wide, sadrži po jednu kolonu za svaki mesec (upravo gledam decembar za sve godine počevši od 2007.) i kolone za svaki grad.
Classes ‘data.table’ and ‘data.frame’: 14 obs. of 10 variables:
$ Month : Factor w/ 14 levels „2007-12-31″,“2008-12-31“,..: 1 2 3 4 5 6 7 8 9 10 …
$ Austin : num 247428 240695 237653 232146 230383 …
$ Boston : num 400515 366284 352017 363261 353877 …
$ Charlotte : num 193581 185012 174552 162368 150636 …
$ Chicago : num 294717 254638 215646 193368 171936 …
$ Dallas : num 142281 129887 130739 122384 115999 …
$ New York : num 534711 494393 459175 461231 450736 …
$ Phoenix : num 239798 177223 141344 123984 114166 …
$ San Francisco: num 920275 827897 763659 755145 709967 …
$ Tampa : num 248325 191450 153456 136778 120058 …
Počeću sa učitavanjem paketa echarts4r i dplyr. Imajte na umu da za pristup najnovijoj verziji JavaScript biblioteke echarts koristim razvojnu verziju echarts4r. Verziju za programere možete instalirati pomoću ovih redova:
remotes::install_github"JohnCoene/echarts4r") library(echarts4r) library(dplyr)
U sledećem kodu kreiram osnovni echarts4r objekat sa Month kao kolonom x-ose.
houses_wide %>% e_charts(x = Month)
Ako vam je poznat ggplot, ovaj prvi korak je sličan: kreira objekat, ali u vizualizaciji još nema podataka. Videćete x osu, ali nema y ose ni podataka.
U zavisnosti od širine pretraživača, sve oznake osa se možda neće prikazati, jer je echarts4r podrazumevano responsivan – ne morate da brinete da li će oznake osa međusobno da se prepišu ako nema dovoljno mesta za sve.
Zatim ću dodati željeni tip grafikona i kolonu y ose. Za linijski grafikon, to je funkcija e_line (). Potreban joj je najmanje jedan argument, kolona sa vrednostima. Argument se naziva serija, kao jednina za serije.
houses_wide %>% e_charts(x = Month) %>% e_line(serie = `San Francisco`)
Dostupni su mnogi drugi tipovi grafikona, uključujući trakaste grafikone sa e_bar (), grafikone područja e_area (), raspršene dijagrame e_scatter (), grafikone okvira e_boxplot (), histograme e_histogram (), toplotne mape e_heatmap (), mape stabla e_tree () , oblake reči e_cloud () i kružne grafikone e_pie (). Kompletnu listu možete videti na veb lokaciji paketa echarts4r ili u fajlovima pomoći.
Svaka od funkcija za tip grafikona prima imena argumenata bez navodnika. To je slično kao za ggplot.
Ali većina ovde navedenih funkcija ima verzije koje primaju imena kolona u navodnicima. To vam omogućava da koristite imena promenljivih kao argumente. John Coene naziva te funkcije „escape-hatch“ funkcije, one na kraju imena funkcije imaju donju crtu, kao što je:
e_line(Boston) my_city <- "Boston" e_line_(my_city)
Ovo olakšava stvaranje funkcija iz koda grafikona.
Zatim ću dodati drugi grad sa drugom funkcijom e_line ().
houses_wide %>% e_charts(x = Month) %>% e_line(serie = `San Francisco`) %>% e_line(serie = Boston)
Podrazumevano se opisi alatki ne prikazuju, ali mogu da ih dodam pomoću funkcije e_tooltips (). Primetite da se vrednostima opisa podrazumevano dodaju zarezi , što je lepo.
Ali ovde bi opis mogao da bude još korisniji ako bi se videle obe vrednosti istovremeno. To može da se uradi pomoću ove funkcije:
e_tooltip(trigger = "axis")
Ovaj linijski grafikon mogu da pretvorim u grupisani trakasti grafikon ako e_line ()zamenim sa e_bar ().
Prilagodite boje grafikona pomoću echarts4r
Verovatno ćete u jednom trenutku želeti da prilagodite boje za svoje grafikone. Postoji 13 ugrađenih tema, koje mogu da se vide na veb lokaciji echarts4r. U donjem kodu najpre sačuvam grafikon u promenljivu zvanu p, tako da ne moram stalno da ponavljam taj kôd. Zatim dodam temu, u ovom slučaju inspirisanu pčelom, sa e_theme („bee-inspired“)
p <- houses_wide %>% e_charts(x = Month) %>% e_line(serie = `San Francisco`) %>% e_line(serie = Boston) %>% e_tooltip(trigger = "axis")
p %>% e_theme("bee-inspired")
Možete da napravite vlastitu temu od nule ili da izmenite postojeću. Tu vam može pomoći онлајн alat za pravljenje tema . Da biste koristili taj alat, pravili svoja prilagođavanja, preuzmite JSON fajl za svoju temu i dodajte je u grafikon pomoću e_theme_custom („ime_moje_teme“).
Takođe možete da podesite temu direktno u kodu grafikona – na primer, promenite boju pozadine u temi pomoću koda kao što je:
p %>% e_theme_custom("mytheme.json") %>% e_color(background = "ivory")
Međutim, za prilagođavanje grafikona ne morate da koristite temu; funkcija e_color () radi i na podrazumevanim elementima grafa. Prvi argument za e_color () je vektor boja za vaše linije, trake, tačke, bilo šta drugo. U sledećem kodu najpre pravim vektor od tri boje (koristeći imena boja ili heksadecimalne vrednosti). Zatim dodam taj vektor kao prvi argument u e_color ():
my_colors <- c("darkblue", "#03925e", "purple") p <- houses_wide %>% e_charts(x = Month) %>% e_line(serie = `San Francisco`) %>% e_line(serie = Boston) %>% e_line(serie = Austin) %>% e_tooltip(trigger = "axis") %>% e_color(my_colors)
Palete RColorBrewer
Ne vidim da su palete RColorBrewer ugrađene u echarts4r kao što su u ggplot-u, ali lako možete sami da ih dodate. U sledećem segmentu koda učitavam biblioteku RColorBrewer i pravim vektor boja pomoću funkcije brewer.pal (). Potrebne su mi tri boje iz palete Dark2 (jedne od mojih omiljenih):
library(RColorBrewer) my_colors <- brewer.pal(3, "Dark2") my_colors ## [1] "#1B9E77" "#D95F02" "#7570B3" p %>% e_color(my_colors)
Snimak ekrana Sharon Machlis, IDG
linijski grafikon echarts4r sa RColorBrewer paletom.
Palete paletteer
Inače, sličan format vam omogućava da koristite paket R paletteer za pristup gomili R paleta iz mnogo različitih paketa R paletteer. Kôd u nastavku pretražuje paletu Color_Blind iz kolekcije ggthemes i bira prvu, drugu i petu od tih boja.
library(paletteer) paletteer_d("ggthemes::Color_Blind") my_colors <- paletteer_d("ggthemes::Color_Blind")[c(1,2,5)] p %>% e_color(my_colors)
Snimak ekrana Sharon Machlis, IDG
Paleta Color-blind iz ggthemes
Ako niste upoznati sa paketom paletteer, funkcija paletteer_d () pristupa svakoj dostupnoj paleti diskretnih boja. Ovde sam tražio Color_Blind od ggthemes i za vektor my_colors izabrao boje 1, 2 i 5.
„Uredni“ podaci dugog formata
Ako u vašim podacima ima puno serija, verovatno ne želite da svaku od njih upisujete po imenu u zasebnom pozivu funkcije. I ne morate. echarts4r elegantno obrađuje „uredne“ podatke dugog formata.
Za ovu grupu primera koristiću okvir podataka u dugačkom formatu sa informacijama condo. Informacije o tome kako da napravite vlastitu kopiju tih podataka nalaze se na kraju ovog članka.
Ne propustite sledeću grupu koda: Koristim dplyr funkciju group_by () na okviru podataka pre nego što na njemu pokrenem e_charts (), a echarts4r to razume. Sada, ako kažem echarts4r-u da koristi Month za x osu i Value za y osu, on zna da svaku grupu upotrebi kao zasebnu seriju. (Ovaj grafikon takođe čuvam u promenljivoj koja se zove myplot.)
myplot <- condos %>% group_by(City) %>% #<< e_charts(x = Month) %>% e_line(serie = Value) %>% e_tooltip(trigger = "axis") myplot
Snimak ekrana Sharon Machlis, IDG
linijski grafikon echarts4r sa legendom na vrhu
Legenda na vrhu grafikona ipak nije od velike pomoći. Ako želim da pronađem Tampu (ružičastu liniju), mogu da pređem mišem preko legende, ali i dalje će biti teško videti istaknutu ružičastu liniju sa toliko drugih linija u njenoj blizini. Srećom, postoji rešenje.
Prilagođena legenda
U sledećoj grupi koda na grafikon dodajem funkcije e_grid () i e_legend ().
myplot %>% e_grid(right = '15%') %>% e_legend(orient = 'vertical', right = '5', top = '15%')
Funkcija e_grid (right = ‘15% ‘) kaže da želim da moja glavna vizuelizacija grafikona ima 15% popune na desnoj strani. Funkcija e_legend () kaže da legenda bude vertikalna, a ne horizontalna, dodaje popunu od pet piksela s desne strane i dodaje popunu od 15% na vrhu.
Snimak ekrana Sharon Machlis, IDG
Linijski grafikon sa legendom sa strane.
To pomaže, ali ako želim da vidim samo Tampu, moram da kliknem na sve ostale stavke u legendi da bih ih isključio. Neki interaktivni alati za vizuelizaciju podataka omogućavaju vam dvostruki klik na stavku da biste prikazali samo nju. echarts ovo rešava malo drugačije: Možete dodati dugmad koja „invertuju“ postupak biranja, tako da vidite samo stavke koje kliknete.
Da bih to uradio, dodao sam u funkciju e_legend ()argument selector. Video sam tu dugmad u primerku JavaScript echart grafikona gde se koristio selector, ali (koliko znam) ta funkcionalnost nije ugrađena u echarts4r. John je samo čvrsto kodirao neke funkcije u omot; ali možemo sve da ih koristimo – uz pravilnu sintaksu.
Prevođenje JavaScript-a u echarts4r R kôd
Kratka digresija za malo objašnjenje „kako ovo funkcioniše ispod haube“. Sledi primer koji John Coene ima na sajtu echarts4r. Na slici možete videti originalnu echarts dokumentaciju za JavaScript (verovatno ćete morati da kliknete da biste je proširili): tooltip.axisPointer.type.
tooltip je dostupna funkcija echarts4r, e_tooltip (), tako da je možemo koristiti u R. axisPointer je opcija opisa, ali nije deo R paketa. Jedna od opcija za axisPointer je type, koji može imati vrednost line, shadow, none, ili cross.
Apache Software Foundation
Dakle, moramo da prevedemo taj JavaScript u R. To možemo da uradimo koristeći axisPointer kao argument za e_tooltip (). Evo važnog dela: Za vrednost axisPointer kreiramo listu sa listom koja sadrži type = „cross“.
e_tooltip(axisPointer = list(type = "cross"))
Ako znate kako ovo funkcioniše, imate na raspolaganju svu snagu i fleksibilnost čitave JavaScript biblioteke echarts, a ne samo funkcije i argumente koje je John Coene kodirao u paket.
Da biste kreirali dva dugmeta za izbor, ovo je JavaScript sintaksa sa sajta echarts:
selector: [ { type: 'inverse', title: 'Invert' }, { type: 'all or inverse', title: 'Inverse' } ]
A ovo je R sintaksa:
e_legend( selector = list( list(type = 'inverse', title = 'Invert'), list(type = 'all', title = 'Reset') ) )
Svaki par ključ / vrednost dobija svoju listu u okviru liste selector. Sve je lista, ponekad ugnežđena. To je to!
Naslovi dijagrama u echarts4r
OK, okrenimo se nečemu lakšem: naslovu za naš grafikon. echarts4r ima funkciju e_title () koja može da prima argumente, text za tekst naslova, subtext za tekst podnaslova, kao i link i sublink ako želite da dodate URL na koji se može kliknuti bilo u naslovu ili podnaslovu.
Ako želim da promenim poravnanje naslova i podnaslova, argument je left. left može za vrednost da primi broj za koliko želite popune između leve ivice i početka teksta, ili može da primi center ili right za poravnanje kao što vidite ovde:
myplot %>% e_title(text = "Monthly Median Single-Family Home Prices", subtext = "Source: Zillow.com", sublink = "https://www.zillow.com/research/data/", left = "center" )
left = „center“ nije baš intuitivno za nove korisnike, ali ima smisla ako znate šta je.
Dijagrami u boji po kategorijama sa echarts4r
Za ove prikaze sa bojama po grupama koristiću skup podataka sa kolonama za grad, mesec, vrednost stana, vrednost porodične kuće i „region“ (koji sam upravo napravio za bojenje po grupama; to nije Zillowljev region).
head(all_data_w_type_columns, 2)
City Month Condo SingleFamily Region
1 Austin 2007-12-31 221734 247428 South
2 Austin 2008-12-31 210860 240695 South
Sledi kôd za raspršeni dijagram da bi se videlo da li se cene porodičnih kuća i stanova kreću ujednačeno. Pošto sam na podacima koristio dplyr funkciju group_by () pre nego što sam kreirao raspršeni dijagram, grafikon je obojen po regionima. Takođe sam mogao da podesim veličinu tačke pomoću symbol_size.
Ovaj blok koda dodaje još nešto na dijagram: nekoliko „alatki“ u gornjem desnom uglu grafikona. Uključio sam zumiranje, resetovanje, pregled osnovnih podataka i čuvanje dijagrama kao slike, ali postoji i nekoliko drugih.
all_data_w_type_columns %>% group_by(Region) %>% e_charts(SingleFamily) %>% e_scatter(Condo, symbol_size = 6) %>% e_legend(FALSE) %>% e_tooltip() %>% e_toolbox_feature("dataZoom") %>% e_toolbox_feature(feature = "reset") %>% e_toolbox_feature("dataView") %>% e_toolbox_feature("saveAsImage")
Snimak ekrana Sharon Machlis, IDG
Dostupno je nekoliko statističkih funkcija, uključujući linije regresije i linije odstupanja, kao što su e_lm(Condo ~ SingleFamily, color = „green“) za dodavanje linearne linije regresije.
Animacije sa echarts4r
Završiću našu turneju echarts4r sa nekoliko lakih animacija.
Za ove prikaze koristiću podatke američkog CDC-a o vakcinaciji po državama: primenjene doze u poređenju sa isporučenim dozama vakcina, da bi se videlo koje države najbolje rade na tome da ljudima brzo daju vakcine u ruku. Kolona koju želim grafički da prikažem je PctUsed. Takođe sam dodao kolonu u boji kad želim da istaknem jednu državu drugom bojom, u ovom slučaju Masačusets.
Podatke možete preuzeti sa GitHub-a:
mydata <- readr::read_csv("https://gist.githubusercontent.com/smach/194d26539b0d0deb9f6ac5ca2e7d49d0/raw/f0d3362e06e3cb7dbfc0c9df67e259f1e9dfb898/timeline_data.csv")
str(mydata)
spec_tbl_df [112 × 7] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ State : chr [1:112] "ЦТ" "MA" "ME" "NH" ...
$ TotalDistributed : num [1:112] 740300 1247600 254550 257700 3378300 ...
$ TotalAdministered: num [1:112] 542414 806376 178449 166603 2418074 ...
$ ReportDate : Date[1:112], format: "2021-02-08" "2021-02-08" "2021-02-08" "2021-02-08" ...
$ Used : num [1:112] 0.733 0.646 0.701 0.646 0.716 ...
$ PctUsed : num [1:112] 73.3 64.6 70.1 64.6 71.6 62.7 77.8 72.1 62.5 70.1 ...
$ color : chr [1:112] "#3366CC" "#003399" "#3366CC" "#3366CC"
Sledi kôd za animirani vremenski niz. Ako svoje podatke grupišem po datumu, u e_charts ()dodam timeline = TRUE a u funkciju opcija vremenske trake dodam autoPlay = TRUE, napraviću vremensku liniju za automatsko puštanje. timeline = TRUE je vrlo jednostavan način animiranja podataka po vremenu na trakastom grafikonu.
U ostatku ove sledeće grupe koda podesio sam da trake budu jednobojne koristeći argument itemStyle. Ostatak koda je dodatno stilsko oblikovanje: Isključiivanje legende, dodavanje oznaka za trake sa e_labels (), dodavanje naslova sa fontom veličine 24 i ostaviljanje razmaka od 100 piksela između vrha grafikona i vrha celokupne vizuelizacije.
mydata %>% group_by(ReportDate) %>% #<< e_charts(State, timeline = TRUE) %>% #<< e_timeline_opts(autoPlay = TRUE, top = 40) %>% #<< e_bar(PctUsed, itemStyle = list(color = "#0072B2")) %>% e_legend(show = FALSE) %>% e_labels(position = 'insideTop') %>% e_title("Percent Received Covid-19 Vaccine Doses Administered", left = "center", top = 5, textStyle = list(fontSize = 24)) %>% e_grid(top = 100)
Pokrenite kôd na svom sistemu ako želite da vidite animiranu verziju ovog statičkog dijagrama:
Snimak ekrana Sharon Machlis, IDG
Statička slika animirane vremenske linije echarts4r.
Animiranje linijskog grafikona je jednostavno dodavanje funkcije e_animation (). Grafikoni su podrazumevano animirani, ali možete produžiti trajanje da biste stvorili uočljiviji efekat, kao što je e_animation (duration = 8000):
mydata %>% group_by(State) %>% e_charts(ReportDate) %>% e_line(PctUsed) %>% e_animation(duration = 8000)
Predlažem da i ovaj kôd pokušate da pokrenete lokalno da biste videli efekat animacije.
Utrkujuće trake
Utrkujuće trake su dostupne u verziji echarts 5. U vreme objavljivanja ovog članka bila bi potrebna GitHub verzija echarts4r (paket R) da biste koristili funkcije echarts verzije 5 (iz JavaScript biblioteke). Kako izgledaju utrkujuće trake možete videti na mom videu:
Ovo je ceo kôd:
mydata %>%
group_by(ReportDate) %>%
e_charts(State, timeline = TRUE) %>%
e_bar(PctUsed, realtimeSort = TRUE, itemStyle = list(
borderColor = „black“, borderWidth = ‘1’)
) %>%
e_legend(show = FALSE) %>%
e_flip_coords() %>%
e_y_axis(inverse = TRUE) %>%
e_labels(position = „insideRight“,
formatter = htmlwidgets::JS(“
function(params){
return(params.value[0] + ‘%’)
}
„) ) %>%
e_add(„itemStyle“, color) %>%
e_timeline_opts(autoPlay = TRUE, top = „55“) %>%
e_grid(top = 100) %>%
e_title(paste0(„Percent Vaccine Dose Administered „),
subtext = „Source: Analysis of CDC Data“,
sublink = „https://covid.cdc.gov/covid-data-tracker/#vaccinations“,
left = „center“, top = 10)
Objašnjenje koda za utrkujuće trake
Kôd započinje okvirom podataka, a zatim koristi dbyr funkciju group_by () za grupisanje podataka po datumu – za vremenske linije i utrkujuće trake morate da grupišete po datumu.
Sledeće, kreiram objekat e_charts sa državom kao x osom, a uključujem timeline = TRUE i dodam e_bar (PctUsed) da napravim trakasti grafikon koristeći kolonu PctUsed za y vrednosti. Jedna nova stvar koju još uvek nismo pokrili je realtimeSort = TRUE.
Drugi kôd unutar e_bar () stvara crnu liniju obruba oko traka (nije potrebno, ali znam da bi neki ljudi želeli da znaju kako se to radi). Takođe isključujem legendu, jer ovde nije od pomoći.
Sledeći red, e_flip_coords (), menja grafikon iz vertikalnih u horizontalne trake. e_y_axis (inverse = TRUE) sortira trake od najveće do najmanje.
Funkcija e_labels () dodaje oznaku vrednosti unutar trake sa desne strane. Sav formatter kôd koristi JavaScript za izradu prilagođenog formata u prikazu oznaka – u ovom slučaju dodajem znak procenta. To nije obavezno.
Formatiranje oznaka i opisa alatki
Korisno je znati sintaksu za formate, jer istu sintaksu možete koristiti za prilagođavanje opisa alata. params.value [0] je vrednost x-ose, a params.value [1] je vrednost y-ose. Vrednosti i nizove u JavaScriptu spajate pomoću znaka plus. Na primer:
formatter = htmlwidgets::JS(" function(params){ return('X equals ' + params.value[0] + 'Y equals' + params.value[1]) }
Na sajtu echarts4r nalazi se više informacija o formatiranju opisa alata.
Funkcija e_add („itemStyle“, color) je mesto gde boje iz kolone color u mojim podacima preslikavam na trake, koristeći itemStyle. Ovo se prilično razlikuje od sintakse ggplot, pa može da vam zatreba malo vremena za navikavanje ako ste koristili tidyverse.
Na kraju sam dodao naslov i podnaslov, URL kojem se pristupa klikom na podnaslov i nešto popune oko mreže grafikona i naslova, tako da ne naleću jedni na druge. Pokrenite ovaj kôd i trebalo bi da dobijete utrkujuće trake.
Više resursa
Više informacija o echarts4r potražite na veb lokaciji paketa na https://echarts4r.john-coene.com i na veb lokaciji biblioteke echarts na https://echarts.apache.org. A za više R saveta i vodiča, posetite moju stranicu „Do more with R“!
Uputstva za podatke
Idite na https://www.zillow.com/research/data/ i preuzmite podatke kuća ZHVI Single-Family Home Time Series by city i podatke stanova ZHVI Condo/Co-op Time Series by city. Zatim pokrenite sledeće:
library(data.table)
library(dplyr)
library(echarts4r)
process_file <- function(filename, hometype) {
mydata_all <- data.table::fread(filename)
mycols <- grep(„((2007)|(2008)|(2009)|(201.)|(202.))-12-„, names(mydata_all), value = T)
mydata_all[, RegionID := as .character(RegionID)]
myregionids <- c(„38128“, „10221“, „24043“, „44269“, „6181“, „20330“, „17426“, „40326“, „41176“)
mydata <- mydata_all[RegionID %chin% myregionids, c(„RegionName“, mycols), with = FALSE]
setnames(mydata, „RegionName“, „City“)
mydt <- melt(mydata, id.vars = „City“, variable.name = „Month“, value.name = „Value“)
mydt[, Region := fcase(
City %chin% c(„New York“, „Boston“), „Northeast“,
City %chin% c(„Dallas“, „Austin“, „Charlotte“, „Tampa“), „South“,
default = „Other“
)]
setorder(mydt, City)
mydt[, HomeType := hometype]
return (mydt)
}
houses <- process_file(„data/City_zhvi_uc_sfr_tier_0.33_0.67_sm_sa_mon.csv“, „SingleFamily“)
houses_wide <- dcast(houses[, c(„City“, „Month“, „Value“)], Month ~ City)
condos <- <- process_file(„data/City_zhvi_uc_condo_tier_0.33_0.67_sm_sa_mon.csv“, „Condo“)
Izvor: InfoWorld