Opprette et flertallskart ved hjelp av D3.js Del 2

I den forrige delen av denne serien så vi hvordan du kommer i gang med å lage et flertallskart ved hjelp av D3.js JavaScript-biblioteket. I denne opplæringen tar vi det til neste nivå ved å gjøre flerlinjediagrammet reagere på data dynamisk, og vi legger til flere funksjoner ettersom opplæringen utvikler seg.

Starter

La oss begynne med å klone den første delen av opplæringen fra GitHub.

git klon https://github.com/jay3dec/MultiLineChart_D3.git

Navigere til MultiLineChart_D3 og bla gjennom index.html, og du bør ha en flerlinjediagram basert på utvalgsdataene.

Sette domenet dynamisk

I den forrige veiledningen, da vi opprettet XScale og ySkala ved hjelp av Område og Domene, vi har hardkodet minimum og maksimum for domenet. For å gjøre grafen mer fleksibel må vi lese minimums- og maksimumverdiene for domenet dynamisk fra datakilden.

D3.js gir d3.min og d3.max metoder for å få minimums- og maksimumverdiene fra en matrise henholdsvis. Vi benytter disse funksjonene for å få minimums- og maksimumverdiene for domenet.

Vi kan få minimumsverdien fra en matrise som vist:

d3.min (data, funksjon (d) return d.value;)

På samme måte, for å få maksimal verdi:

d3.max (data, funksjon (d) return d.value;)

Bare erstatt minimums- og maksimumverdiene i XScale domenet som vist: 

xScale = d3.scale.linear () .område ([MARGINS.left, WIDTH - MARGINS.right]) .domæne ([d3.min (data, funksjon (d) retur d.år;), d3.max (data, funksjon (d) retur d.år;)]),

Tilsvarende, erstatte ySkala domene:

yScale = d3.scale.linear () .område ([HEIGHT - MARGINS.top, MARGINS.bottom]). domene ([d3.min (data, funksjon (d) return d.sale;), d3.max (data, funksjon (d) return d.sale;)]),

Lagre alle endringene og bla gjennom index.html. Nå bør du ha grafen som fungerer, som det var tidligere. Den eneste forskjellen er at den plukker opp domenet maksimum og minimum verdier dynamisk.

Lag linjediagrammet dynamisk

Å holde et enkelt JSON-objekt for prøven ville gjøre det lettere å analysere dataene og plotte det på diagrammet. Så kombiner de to stykkene av prøvedataene i en enkelt JSON datastreng som vist nedenfor: 

var data = ["Klient": "ABC", "salg": "202", "år": "2000", "Klient": "ABC", "salg": "215" : "2002", "Klient": "ABC", "salg": "179", "år": "2004", "Klient": "ABC" år ":" 2006 ", " Klient ":" ABC "," salg ":" 134 "," år " , "år": "2010", "Klient": "XYZ", "salg": "100", "år": "2000", "Klient": "XYZ", "salg" 215 "," år ":" 2002 ", " Klient ":" XYZ "," salg ":" 179 "," år " : "199", "år": "2006", "Klient": "XYZ", "salg": "134" salg ":" 176 "," år ":" 2013 "];

Nå vil vi endre koden vår for å gjøre vår grafskala dynamisk i henhold til utvalgsdatasettet og dets verdier. 

Neste deler vi og organiserer dataene basert på Klient slik at vi kan tegne en linjediagram for hver Klient i dataene. D3 gir en metode som kalles d3.nest som bidrar til å ordne data basert på en bestemt nøkkel felt. Vi skal bruke d3.nest å sortere ut dataene basert på Klient som vist:

var dataGroup = d3.nest () .key (funksjon (d) return d.Client;) .entries (data);

Her er hvordan dataGroup ville se: 

["nøkkel": "ABC", "verdier": ["Klient": "ABC", "salg": "202", "år": "2000", "Klient": "ABC" "salg": "215", "år": "2002", "Klient": "ABC", "salg": "179", "år" "," salg ":" 199 "," år ":" 2006 ", " Klient ":" ABC "," salg ":" 134 "," år ":" 2008 ", " Klient " "ABC", "salg": "176", "år": "2010"], "nøkkel": "XYZ", "verdier": ["Klient": "XYZ", "salg" "100", "år": "2000", "Klient": "XYZ", "salg": "215", "år": "2002", "Klient": "XYZ" ":" 179 "," år ":" 2004 ", " Klient ":" XYZ "," salg ":" 199 "," år ":" 2006 ", " Klient ":" XYZ " "salg": "134", "år": "2008", "Klient": "XYZ", "salg": "176", "år": "2013"]]

Deretter fjerner du svg linje banekode for linjeskaping som vi hardkodede tidligere.

vis.append ('svg: path') .attr ('d', lineGen (data)) .attr ('slag', 'grønt') .attr ('slagbredde', 2) .attr , 'ingen'); vis.append ('svg: path') .attr ('d', lineGen (data2)) .attr ('slag', 'blå') .attr ('slagbredde', 2) .attr , 'ingen');

I stedet skal vi iterere over dataGroup og opprett en linjediagram for hver Klient som vist:

dataGroup.forEach (funksjon (d, i) vis.append ('svg: path') .attr ('d', lineGen (d.values)) .attr ('stroke', 'blue') .attr strekkbredde ', 2) .attr (' fyll ',' ingen '););

Lagre endringene og prøv å bla gjennom index.html. Du bør kunne se flerlinjediagrammet som vist: 

La oss også legge til noen tilfeldige farger til graflinjene. For å legge til tilfeldige farger, bruker vi d3.hsl-metoden. Endre hjerneslag Attributt av linjediagrammet som vist nedenfor for å få tilfeldige farger for linjene.

dataGroup.forEach (funksjon (d, i) vis.append ('svg: path') .attr ('d', lineGen (d.values)) .attr ('slag', funksjon (d, j) "hsl (" + Math.random () * 360 + ", 100%, 50%)";) .attr ('slagbredde', 2) .attr ('fyll', 'ingen');) ;

Lagre endringene og bla gjennom index.html. Du bør se tilfeldige farger for linjene på grafen.

Legge til Legends

Deretter legger vi til legender for klienter i utvalgsdataene. Når legender er lagt til, legger vi til et klikkhendelse på legender som ville bytte skjermen til de respektive linjediagrammer.

Først, for å legge til legenden, må vi endre margin bunn og margin topp til 50 for å imøtekomme legender.

var vis = d3.select ("# visualisering"), WIDTH = 1000, HEIGHT = 500, MARGINS = topp: 50, høyre: 20, bunn: 50, venstre: 50,

Mens iterating the dataGroup, Vi legger til legender for de tilsvarende linjediagrammer. Legge til legender er ganske enkelt. Først definerer legenden plass basert på antall klienter eller linjediagrammer vi skal tegne:

lSpace = WIDTH / dataGroup.length;

Legg til en tekst til svg element med x og y koordinater mens iterating dataGroup etter linjens opprettelse som vist:

vis.append ("text") .attr ("x", (lSpace / 2) + i * lSpace) .attr ("y", HEIGHT) .stil ("fyll", "svart"). nøkkel);

Vi har justert legendenavstanden (lSpace) Basert på antall legender vi må vise, slik at alle legender er like avstand fra hverandre. Vi har delt legenden med 2 slik at den er midtlinjert i sin plass og vil være slik den går fremover, som vi legger til (jeg * lSpace) til kommende legender.

Lagre alle endringene og prøv å bla gjennom index.html og du bør se legender under X-aksen.

La oss legge til litt styling på legender for å få dem til å se fet ut. Legg til følgende CSS til index.html:

.legenden font-size: 14px; font-weight: bold; 

Legg til klassen legende til legenden opprettet.

vis.append ("text") .attr ("x", (lSpace / 2) + i * lSpace) .attr ("y", HEIGHT) .stil ("fyll", "svart") .attr "," legend ") .text (d.key);

D3.js Hendelser

Nå la vi legge til klikkhendelser på hver av legender som vises for å veksle skjermen til den tilsvarende linjen på flertallslinjen.

Først må vi legge til en id for hver linjediagram opprettet for å veksle skjermen.

.attr ('id', 'linje _' + d.key)

Slik ser linjekodekoden ut:

vis.append ('svg: bane') .attr ('d', lineGen (d.values, xScale, yScale)) .attr ('slag', funksjon (d, j) return "hsl (" + Math. tilfeldig () * 360 + ", 100%, 50%)";) .attr ('slagbredde', 2) .attr ('id', 'linje_' + d.key) , 'ingen');

Deretter legger du til i Legenden-opprettingsdelen klikk Egenskap:

.på ('klikk', funksjon () alarm (d.key);)

Lagre endringen og bla gjennom index.html. Klikk på legender, og du bør se legenderens navn som varsler. 

Deretter la vi legge til koden for å bytte linjevisningen. Vi trenger bare å sjekke gjeldende visningstilstand for linjediagrammet og bytte opaciteten for å vise og skjule linjen tilsvarende.

.på ('klikk', funksjon () var aktiv = d.aktiv? falsk: sant; var opacity = aktiv? 0: 1; d3.select ("# line_" + d.key). stil ("opacity" opacity); d.active = active;)

Lagre endringene og prøv å bla gjennom index.html. Prøv å klikke på legender og displayet på den tilsvarende linjediagrammet skal bytte.

Konklusjon

I denne opplæringen så vi hvordan vi kan gjøre vårt flertallskart dynamisk. Vi så også hvordan du lager D3.js-hendelser. For detaljerte opplysninger om forskjellige andre D3.js-metoder og APIer, ta en titt på den offisielle dokumentasjonen.

Kildekode fra denne opplæringen er tilgjengelig på GitHub.

Gi oss beskjed om dine tanker i kommentarene nedenfor!