Created
January 10, 2017 21:41
-
-
Save josgraha/fd5561637b8fc608cff76573269204ac to your computer and use it in GitHub Desktop.
D3 visualization of daily revenue through calendar format looping through the months continuously
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>Calendar Loop</title> | |
| <script type="text/javascript" src="https://d3js.org/d3.v4.js"></script> | |
| <!-- <link rel="stylesheet" href="base.css"> | |
| <link rel="stylesheet" href="style.css"> --> | |
| </head> | |
| <body> | |
| <script> | |
| // sample dataset | |
| dataset=[{time:'1/1/16', revenue:738251}, | |
| {time:'1/2/16', revenue:176666}, | |
| {time:'1/3/16', revenue:981598}, | |
| {time:'1/4/16', revenue:940014}, | |
| {time:'1/5/16', revenue:155114}, | |
| {time:'1/6/16', revenue:92946}, | |
| {time:'1/7/16', revenue:164241}, | |
| {time:'1/8/16', revenue:74864}, | |
| {time:'1/9/16', revenue:816534}, | |
| {time:'1/10/16', revenue:402629}, | |
| {time:'1/11/16', revenue:208664}, | |
| {time:'1/12/16', revenue:943698}, | |
| {time:'1/13/16', revenue:331839}, | |
| {time:'1/14/16', revenue:955321}, | |
| {time:'1/15/16', revenue:292867}, | |
| {time:'1/16/16', revenue:933068}, | |
| {time:'1/17/16', revenue:145300}, | |
| {time:'1/18/16', revenue:764398}, | |
| {time:'1/19/16', revenue:930748}, | |
| {time:'1/20/16', revenue:28477}, | |
| {time:'1/21/16', revenue:385772}, | |
| {time:'1/22/16', revenue:943665}, | |
| {time:'1/23/16', revenue:52877}, | |
| {time:'1/24/16', revenue:865589}, | |
| {time:'1/25/16', revenue:81742}, | |
| {time:'1/26/16', revenue:921995}, | |
| {time:'1/27/16', revenue:794117}, | |
| {time:'1/28/16', revenue:665286}, | |
| {time:'1/29/16', revenue:158451}, | |
| {time:'1/30/16', revenue:875790}, | |
| {time:'1/31/16', revenue:517332}, | |
| {time:'2/1/16', revenue:377979}, | |
| {time:'2/2/16', revenue:255429}, | |
| {time:'2/3/16', revenue:22072}, | |
| {time:'2/4/16', revenue:774488}, | |
| {time:'2/5/16', revenue:596900}, | |
| {time:'2/6/16', revenue:656863}, | |
| {time:'2/7/16', revenue:764316}, | |
| {time:'2/8/16', revenue:744247}, | |
| {time:'2/9/16', revenue:914986}, | |
| {time:'2/10/16', revenue:608282}, | |
| {time:'2/11/16', revenue:117472}, | |
| {time:'2/12/16', revenue:672084}, | |
| {time:'2/13/16', revenue:238065}, | |
| {time:'2/14/16', revenue:949978}, | |
| {time:'2/15/16', revenue:190303}, | |
| {time:'2/16/16', revenue:873319}, | |
| {time:'2/17/16', revenue:721328}, | |
| {time:'2/18/16', revenue:377353}, | |
| {time:'2/19/16', revenue:793956}, | |
| {time:'2/20/16', revenue:209175}, | |
| {time:'2/21/16', revenue:979669}, | |
| {time:'2/22/16', revenue:963573}, | |
| {time:'2/23/16', revenue:715392}, | |
| {time:'2/24/16', revenue:941266}, | |
| {time:'2/25/16', revenue:433058}, | |
| {time:'2/26/16', revenue:770800}, | |
| {time:'2/27/16', revenue:810024}, | |
| {time:'2/28/16', revenue:616143}, | |
| {time:'2/29/16', revenue:623793}, | |
| {time:'3/1/16', revenue:22537}, | |
| {time:'3/2/16', revenue:865633}, | |
| {time:'3/3/16', revenue:524138}, | |
| {time:'3/4/16', revenue:612863}, | |
| {time:'3/5/16', revenue:967549}, | |
| {time:'3/6/16', revenue:949763}, | |
| {time:'3/7/16', revenue:482934}, | |
| {time:'3/8/16', revenue:561899}, | |
| {time:'3/9/16', revenue:666190}, | |
| {time:'3/10/16', revenue:974152}, | |
| {time:'3/11/16', revenue:736493}, | |
| {time:'3/12/16', revenue:20337}, | |
| {time:'3/13/16', revenue:104660}, | |
| {time:'3/14/16', revenue:831515}, | |
| {time:'3/15/16', revenue:951525}, | |
| {time:'3/16/16', revenue:340619}, | |
| {time:'3/17/16', revenue:556653}, | |
| {time:'3/18/16', revenue:311635}, | |
| {time:'3/19/16', revenue:555567}, | |
| {time:'3/20/16', revenue:152332}, | |
| {time:'3/21/16', revenue:154463}, | |
| {time:'3/22/16', revenue:753992}, | |
| {time:'3/23/16', revenue:681520}, | |
| {time:'3/24/16', revenue:697921}, | |
| {time:'3/25/16', revenue:481529}, | |
| {time:'3/26/16', revenue:94319}, | |
| {time:'3/27/16', revenue:718204}, | |
| {time:'3/28/16', revenue:498336}, | |
| {time:'3/29/16', revenue:991652}, | |
| {time:'3/30/16', revenue:66115}, | |
| {time:'3/31/16', revenue:940791}, | |
| {time:'4/1/16', revenue:446457}, | |
| {time:'4/2/16', revenue:390213}, | |
| {time:'4/3/16', revenue:975697}, | |
| {time:'4/4/16', revenue:307949}, | |
| {time:'4/5/16', revenue:205956}, | |
| {time:'4/6/16', revenue:616999}, | |
| {time:'4/7/16', revenue:863406}, | |
| {time:'4/8/16', revenue:417095}, | |
| {time:'4/9/16', revenue:598231}, | |
| {time:'4/10/16', revenue:941310}, | |
| {time:'4/11/16', revenue:623650}, | |
| {time:'4/12/16', revenue:94719}, | |
| {time:'4/13/16', revenue:846489}, | |
| {time:'4/14/16', revenue:991970}, | |
| {time:'4/15/16', revenue:110875}, | |
| {time:'4/16/16', revenue:221482}, | |
| {time:'4/17/16', revenue:979643}, | |
| {time:'4/18/16', revenue:602309}, | |
| {time:'4/19/16', revenue:285629}, | |
| {time:'4/20/16', revenue:228733}, | |
| {time:'4/21/16', revenue:71529}, | |
| {time:'4/22/16', revenue:291220}, | |
| {time:'4/23/16', revenue:274211}, | |
| {time:'4/24/16', revenue:528953}, | |
| {time:'4/25/16', revenue:452873}, | |
| {time:'4/26/16', revenue:894844}, | |
| {time:'4/27/16', revenue:127166}, | |
| {time:'4/28/16', revenue:331723}, | |
| {time:'4/29/16', revenue:211088}, | |
| {time:'4/30/16', revenue:568942}, | |
| {time:'5/1/16', revenue:626670}, | |
| {time:'5/2/16', revenue:458067}, | |
| {time:'5/3/16', revenue:928443}, | |
| {time:'5/4/16', revenue:241011}, | |
| {time:'5/5/16', revenue:487654}, | |
| {time:'5/6/16', revenue:586159}, | |
| {time:'5/7/16', revenue:262760}, | |
| {time:'5/8/16', revenue:67742}, | |
| {time:'5/9/16', revenue:741180}, | |
| {time:'5/10/16', revenue:754710}, | |
| {time:'5/11/16', revenue:913180}, | |
| {time:'5/12/16', revenue:481184}, | |
| {time:'5/13/16', revenue:337293}, | |
| {time:'5/14/16', revenue:958300}, | |
| {time:'5/15/16', revenue:260906}, | |
| {time:'5/16/16', revenue:656560}, | |
| {time:'5/17/16', revenue:151047}, | |
| {time:'5/18/16', revenue:780417}, | |
| {time:'5/19/16', revenue:824098}, | |
| {time:'5/20/16', revenue:101498}, | |
| {time:'5/21/16', revenue:175695}, | |
| {time:'5/22/16', revenue:374409}, | |
| {time:'5/23/16', revenue:927245}, | |
| {time:'5/24/16', revenue:936455}, | |
| {time:'5/25/16', revenue:193717}, | |
| {time:'5/26/16', revenue:937953}, | |
| {time:'5/27/16', revenue:66424}, | |
| {time:'5/28/16', revenue:519510}, | |
| {time:'5/29/16', revenue:490741}, | |
| {time:'5/30/16', revenue:902849}, | |
| {time:'5/31/16', revenue:216214}, | |
| {time:'6/1/16', revenue:936577}, | |
| {time:'6/2/16', revenue:231896}, | |
| {time:'6/3/16', revenue:581985}, | |
| {time:'6/4/16', revenue:531625}, | |
| {time:'6/5/16', revenue:562692}, | |
| {time:'6/6/16', revenue:549144}, | |
| {time:'6/7/16', revenue:575602}, | |
| {time:'6/8/16', revenue:473149}, | |
| {time:'6/9/16', revenue:529353}, | |
| {time:'6/10/16', revenue:82629}, | |
| {time:'6/11/16', revenue:303673}, | |
| {time:'6/12/16', revenue:597425}, | |
| {time:'6/13/16', revenue:417307}, | |
| {time:'6/14/16', revenue:384729}, | |
| {time:'6/15/16', revenue:377988}, | |
| {time:'6/16/16', revenue:785500}, | |
| {time:'6/17/16', revenue:393117}, | |
| {time:'6/18/16', revenue:90107}, | |
| {time:'6/19/16', revenue:325468}, | |
| {time:'6/20/16', revenue:872399}, | |
| {time:'6/21/16', revenue:70144}, | |
| {time:'6/22/16', revenue:613340}, | |
| {time:'6/23/16', revenue:395407}, | |
| {time:'6/24/16', revenue:569693}, | |
| {time:'6/25/16', revenue:39714}, | |
| {time:'6/26/16', revenue:949966}, | |
| {time:'6/27/16', revenue:360049}, | |
| {time:'6/28/16', revenue:872097}, | |
| {time:'6/29/16', revenue:911655}, | |
| {time:'6/30/16', revenue:476573}, | |
| {time:'7/1/16', revenue:534728}, | |
| {time:'7/2/16', revenue:902530}, | |
| {time:'7/3/16', revenue:975753}, | |
| {time:'7/4/16', revenue:410728}, | |
| {time:'7/5/16', revenue:296888}, | |
| {time:'7/6/16', revenue:322720}, | |
| {time:'7/7/16', revenue:400918}, | |
| {time:'7/8/16', revenue:828363}, | |
| {time:'7/9/16', revenue:990571}, | |
| {time:'7/10/16', revenue:455204}, | |
| {time:'7/11/16', revenue:504322}, | |
| {time:'7/12/16', revenue:931756}, | |
| {time:'7/13/16', revenue:827505}, | |
| {time:'7/14/16', revenue:949474}, | |
| {time:'7/15/16', revenue:268032}, | |
| {time:'7/16/16', revenue:932666}, | |
| {time:'7/17/16', revenue:668930}, | |
| {time:'7/18/16', revenue:215059}, | |
| {time:'7/19/16', revenue:842514}, | |
| {time:'7/20/16', revenue:922340}, | |
| {time:'7/21/16', revenue:800845}, | |
| {time:'7/22/16', revenue:936609}, | |
| {time:'7/23/16', revenue:956740}, | |
| {time:'7/24/16', revenue:887883}, | |
| {time:'7/25/16', revenue:778195}, | |
| {time:'7/26/16', revenue:385177}, | |
| {time:'7/27/16', revenue:210917}, | |
| {time:'7/28/16', revenue:132211}, | |
| {time:'7/29/16', revenue:368271}, | |
| {time:'7/30/16', revenue:244940}, | |
| {time:'7/31/16', revenue:486528}, | |
| {time:'8/1/16', revenue:679686}, | |
| {time:'8/2/16', revenue:718174}, | |
| {time:'8/3/16', revenue:332904}, | |
| {time:'8/4/16', revenue:756420}, | |
| {time:'8/5/16', revenue:615744}, | |
| {time:'8/6/16', revenue:786459}, | |
| {time:'8/7/16', revenue:455415}, | |
| {time:'8/8/16', revenue:581611}, | |
| {time:'8/9/16', revenue:457828}, | |
| {time:'8/10/16', revenue:451281}, | |
| {time:'8/11/16', revenue:680526}, | |
| {time:'8/12/16', revenue:28968}, | |
| {time:'8/13/16', revenue:985913}, | |
| {time:'8/14/16', revenue:82304}, | |
| {time:'8/15/16', revenue:735944}, | |
| {time:'8/16/16', revenue:491310}, | |
| {time:'8/17/16', revenue:710963}, | |
| {time:'8/18/16', revenue:899071}, | |
| {time:'8/19/16', revenue:569518}, | |
| {time:'8/20/16', revenue:994888}, | |
| {time:'8/21/16', revenue:931846}, | |
| {time:'8/22/16', revenue:686598}, | |
| {time:'8/23/16', revenue:717134}, | |
| {time:'8/24/16', revenue:992618}, | |
| {time:'8/25/16', revenue:384297}, | |
| {time:'8/26/16', revenue:435279}, | |
| {time:'8/27/16', revenue:652782}, | |
| {time:'8/28/16', revenue:304881}, | |
| {time:'8/29/16', revenue:829466}, | |
| {time:'8/30/16', revenue:509682}, | |
| {time:'8/31/16', revenue:425330}, | |
| {time:'9/1/16', revenue:475036}, | |
| {time:'9/2/16', revenue:543812}, | |
| {time:'9/3/16', revenue:687647}, | |
| {time:'9/4/16', revenue:448435}, | |
| {time:'9/5/16', revenue:879107}, | |
| {time:'9/6/16', revenue:542273}, | |
| {time:'9/7/16', revenue:750866}, | |
| {time:'9/8/16', revenue:766552}, | |
| {time:'9/9/16', revenue:498417}, | |
| {time:'9/10/16', revenue:767572}, | |
| {time:'9/11/16', revenue:159672}, | |
| {time:'9/12/16', revenue:598079}, | |
| {time:'9/13/16', revenue:856823}, | |
| {time:'9/14/16', revenue:599436}, | |
| {time:'9/15/16', revenue:178906}, | |
| {time:'9/16/16', revenue:180669}, | |
| {time:'9/17/16', revenue:633115}, | |
| {time:'9/18/16', revenue:29776}, | |
| {time:'9/19/16', revenue:34041}, | |
| {time:'9/20/16', revenue:224349}, | |
| {time:'9/21/16', revenue:812679}, | |
| {time:'9/22/16', revenue:414616}, | |
| {time:'9/23/16', revenue:631253}, | |
| {time:'9/24/16', revenue:939951}, | |
| {time:'9/25/16', revenue:612443}, | |
| {time:'9/26/16', revenue:925348}, | |
| {time:'9/27/16', revenue:243595}, | |
| {time:'9/28/16', revenue:314031}, | |
| {time:'9/29/16', revenue:880216}, | |
| {time:'9/30/16', revenue:59595}, | |
| {time:'10/1/16', revenue:153718}, | |
| {time:'10/2/16', revenue:708395}, | |
| {time:'10/3/16', revenue:203333}, | |
| {time:'10/4/16', revenue:568552}, | |
| {time:'10/5/16', revenue:934268}, | |
| {time:'10/6/16', revenue:524942}, | |
| {time:'10/7/16', revenue:964981}, | |
| {time:'10/8/16', revenue:51998}, | |
| {time:'10/9/16', revenue:481533}, | |
| {time:'10/10/16', revenue:488400}, | |
| {time:'10/11/16', revenue:992404}, | |
| {time:'10/12/16', revenue:668943}, | |
| {time:'10/13/16', revenue:341168}, | |
| {time:'10/14/16', revenue:925242}, | |
| {time:'10/15/16', revenue:567979}, | |
| {time:'10/16/16', revenue:637481}, | |
| {time:'10/17/16', revenue:81960}, | |
| {time:'10/18/16', revenue:652543}, | |
| {time:'10/19/16', revenue:736521}, | |
| {time:'10/20/16', revenue:27986}, | |
| {time:'10/21/16', revenue:184557}, | |
| {time:'10/22/16', revenue:509971}, | |
| {time:'10/23/16', revenue:712998}, | |
| {time:'10/24/16', revenue:436299}, | |
| {time:'10/25/16', revenue:266856}, | |
| {time:'10/26/16', revenue:787272}, | |
| {time:'10/27/16', revenue:867274}, | |
| {time:'10/28/16', revenue:613515}, | |
| {time:'10/29/16', revenue:431457}, | |
| {time:'10/30/16', revenue:243858}, | |
| {time:'10/31/16', revenue:457192}, | |
| {time:'11/1/16', revenue:78329}, | |
| {time:'11/2/16', revenue:826848}, | |
| {time:'11/3/16', revenue:841233}, | |
| {time:'11/4/16', revenue:30802}, | |
| {time:'11/5/16', revenue:754270}, | |
| {time:'11/6/16', revenue:658480}, | |
| {time:'11/7/16', revenue:530319}, | |
| {time:'11/8/16', revenue:163579}, | |
| {time:'11/9/16', revenue:790321}, | |
| {time:'11/10/16', revenue:448840}, | |
| {time:'11/11/16', revenue:501691}, | |
| {time:'11/12/16', revenue:664552}, | |
| {time:'11/13/16', revenue:22180}, | |
| {time:'11/14/16', revenue:895207}, | |
| {time:'11/15/16', revenue:163246}, | |
| {time:'11/16/16', revenue:608326}, | |
| {time:'11/17/16', revenue:484224}, | |
| {time:'11/18/16', revenue:51022}, | |
| {time:'11/19/16', revenue:953079}, | |
| {time:'11/20/16', revenue:277111}, | |
| {time:'11/21/16', revenue:146463}, | |
| {time:'11/22/16', revenue:667508}, | |
| {time:'11/23/16', revenue:166010}, | |
| {time:'11/24/16', revenue:971692}, | |
| {time:'11/25/16', revenue:702040}, | |
| {time:'11/26/16', revenue:991647}, | |
| {time:'11/27/16', revenue:440256}, | |
| {time:'11/28/16', revenue:445926}, | |
| {time:'11/29/16', revenue:311525}, | |
| {time:'11/30/16', revenue:792526}, | |
| {time:'12/1/16', revenue:162233}, | |
| {time:'12/2/16', revenue:984744}, | |
| {time:'12/3/16', revenue:732519}, | |
| {time:'12/4/16', revenue:394681}, | |
| {time:'12/5/16', revenue:795696}, | |
| {time:'12/6/16', revenue:557133}, | |
| {time:'12/7/16', revenue:425811}, | |
| {time:'12/8/16', revenue:795549}, | |
| {time:'12/9/16', revenue:274184}, | |
| {time:'12/10/16', revenue:799808}, | |
| {time:'12/11/16', revenue:661068}, | |
| {time:'12/12/16', revenue:882735}, | |
| {time:'12/13/16', revenue:766780}, | |
| {time:'12/14/16', revenue:176658}, | |
| {time:'12/15/16', revenue:404362}, | |
| {time:'12/16/16', revenue:232720}, | |
| {time:'12/17/16', revenue:54779}, | |
| {time:'12/18/16', revenue:654595}, | |
| {time:'12/19/16', revenue:176170}, | |
| {time:'12/20/16', revenue:675108}, | |
| {time:'12/21/16', revenue:647650}, | |
| {time:'12/22/16', revenue:377867}, | |
| {time:'12/23/16', revenue:768627}, | |
| {time:'12/24/16', revenue:44403}, | |
| {time:'12/25/16', revenue:622183}, | |
| {time:'12/26/16', revenue:966509}, | |
| {time:'12/27/16', revenue:940023}, | |
| {time:'12/28/16', revenue:47700}, | |
| {time:'12/29/16', revenue:295924}, | |
| {time:'12/30/16', revenue:232779}, | |
| {time:'12/31/16', revenue:85859}]; | |
| // set variables | |
| var h = 600; | |
| var w = 1000; | |
| var padding=100; | |
| var ds; //global variable | |
| var datasets=[]; | |
| var minDate; | |
| var maxDate; | |
| var DaysOfTheWeek = ["Sunday", "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]; | |
| var buckets = 9; | |
| var colors = ["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"]; | |
| var calendar_box=[]; | |
| var days = [0, 1,2,3,4,5,6]; | |
| var weeks = [0,1,2,3,4,5]; | |
| var bucket_thresholds=[]; | |
| // create array for calendar boxes | |
| for(j=0;j<weeks.length;j++){ | |
| for (i=0;i<days.length;i++){ | |
| index_num = i + (j*7); | |
| calendar_box.push({Days:days[i], Weeks:weeks[j]}); | |
| } | |
| }; | |
| // takes string from data input and converts it into a date | |
| function getDate(d){ | |
| var strDate=new String(d); | |
| var bracket_one = strDate.indexOf("/"); | |
| var month = strDate.substr(0,bracket_one)-1; | |
| var Str1 = strDate.substr(bracket_one+1,strDate.length-bracket_one); | |
| var bracket_two = Str1.indexOf("/"); | |
| var day = Str1.substr(0,bracket_two); | |
| var Str2 = Str1.substr(bracket_two+1,2); | |
| var year="20"+Str2; | |
| return new Date (year, month,day); | |
| }; | |
| function calendar_chart(ds_curr){ | |
| // clear out stuff for each iteration of the loop | |
| d3.select("div").remove(); | |
| d3.select("svg").selectAll("rect").remove(); | |
| d3.select("svg").selectAll(".calendar-text").remove(); | |
| d3.select("svg").selectAll(".legend").remove(); | |
| // set min and maxes for scales | |
| // use "+" to make sure value is evaluated as a number and not a string | |
| var minDate = d3.min(ds_curr,function(d){return d['Date']}); | |
| var maxDate = d3.max(ds_curr,function(d){return d['Date']}); | |
| //var minRev = d3.min(ds_curr,function(d){return +d['Revenue']}); | |
| //var maxRev = d3.max(ds_curr,function(d){return +d['Revenue']}); | |
| var colorScale = d3.scaleQuantize() | |
| .domain([global_minRev,global_maxRev]) | |
| .range(colors); | |
| var bucket_thresholds=[]; | |
| var bucket_increment = (global_maxRev - global_minRev)/9; | |
| for (i=0;i<colors.length;i++){ | |
| bucket_thresholds.push({Min:global_minRev+(i*bucket_increment), Max:global_minRev+(i+1)*bucket_increment}); | |
| }; | |
| var gridWidth= (w -padding*2)/7; | |
| var gridHeight = (h - padding*2)/6; | |
| //toolip | |
| var tooltip = d3.select("body").append("div") | |
| .attr("class","tooltip") | |
| .style("opacity",0); | |
| // clear out SVG for each iteration of the loop | |
| d3.select("body").select("svg").remove(); | |
| var svg_obj = d3.select("body").append("svg") | |
| .attr("width",w) | |
| .attr("height",h) | |
| .style("background","#E5E4E2"); | |
| var dayLabels = svg_obj.selectAll(".dayLabel") | |
| .data(DaysOfTheWeek) | |
| .enter().append("text") | |
| .text(function (d) { return d; }) | |
| .attr("x", function (d, i) { return (i+1)*gridWidth - gridWidth/4 ; }) | |
| .attr("y", padding-5) | |
| .style("text-align", "left") | |
| .style("font-size",14); | |
| var monthTitle = svg_obj | |
| .append("text") | |
| .text(d3.timeFormat('%B %Y')(minDate)) | |
| .attr("x",w/2) | |
| .attr("y",padding/2) | |
| .style("text-align", "center") | |
| .attr("class","monthTitle") | |
| .style("font-weight","bold"); | |
| // fill rectangles with data | |
| var calendar = svg_obj.selectAll("rect") | |
| .data(ds_curr) | |
| .enter() | |
| .append("rect") | |
| .attr("x",function(d,i){ | |
| curr_day = d['Date'].getDay(); | |
| return curr_day*gridWidth + padding}) | |
| .attr("y",function(d,i){ | |
| // shift all the days of the month based on the day of the first of the month | |
| shift = minDate.getDay(); | |
| curr_week = Math.floor((d['Date'].getDate()-minDate.getDate()+ shift)/7); | |
| return h - padding - (6-curr_week)*gridHeight}) | |
| .attr("width",gridWidth) | |
| .attr("height",gridHeight) | |
| .attr("fill",function(d){ | |
| return colorScale(+d['revenue'])}) | |
| .style("stroke", "black") | |
| .style("stroke-width", 1); | |
| var textOnRect = svg_obj.selectAll(".calendar-text") | |
| .data(ds_curr) | |
| .enter() | |
| .append("text") | |
| .attr("x",function(d,i){ | |
| curr_day = d['Date'].getDay(); | |
| return curr_day*gridWidth + padding+(9*gridWidth/10)}) | |
| .attr("y",function(d,i){ | |
| // shift all the days of the month based on the day of the first of the month | |
| shift = minDate.getDay(); | |
| curr_week = Math.floor((d['Date'].getDate()-minDate.getDate()+ shift)/7); | |
| return h - padding - (6-curr_week)*gridHeight+(gridHeight/5)}) | |
| .attr("class","calendar-text") | |
| .attr("fill","#696969") | |
| .attr("font-size",10) | |
| .text(function(d){return d['Date'].getDate();}); | |
| // add legend to the bottom of the chart | |
| var legend = svg_obj.selectAll("legend") | |
| .data(bucket_thresholds) | |
| .enter(); | |
| legend.enter().append("g") | |
| .attr("class", "legend"); | |
| legend.append("rect") | |
| .attr("x", function(d, i) { return (gridWidth/2) * i+padding*3; }) | |
| .attr("y", h-gridHeight*6+padding*3.5) | |
| .attr("width", gridWidth/2) | |
| .attr("height", gridHeight / 2) | |
| .style("fill", function(d, i) { return colors[i]; }) | |
| legend.append("text") | |
| .text("Legend") | |
| .attr("x", w/2) | |
| .attr("y", h-gridHeight*6+padding*3.45) | |
| .attr("font-size",12) | |
| .attr("fill","#black") | |
| .attr("text-align","center"); | |
| legend.append("text") | |
| .html(function(d,i) {return d3.format("($,.0f")(d.Min)}) | |
| .attr("x", function(d, i) { return (gridWidth/2) * i+padding*3; }) | |
| .attr("y", h-gridHeight*6+padding*3.6) | |
| .attr("font-size",10) | |
| .attr("fill","#696969"); | |
| legend.append("text") | |
| .html("-") | |
| .attr("x", function(d, i) { return (gridWidth/2) * i+padding*3; }) | |
| .attr("y", h-gridHeight*6+padding*3.7) | |
| .attr("font-size",10) | |
| .attr("fill","#696969"); | |
| legend.append("text") | |
| .html(function(d,i) {return d3.format("($,.0f")(d.Max)}) | |
| .attr("x", function(d, i) { return (gridWidth/2) * i+padding*3; }) | |
| .attr("y", h-gridHeight*6+padding*3.8) | |
| .attr("font-size",10) | |
| .attr("fill","#696969"); | |
| }; | |
| function data_chart(){ | |
| ds=dataset; | |
| for (i=0;i<ds.length;i++){ | |
| // create new fields in the array as either calculations or date transfomration | |
| ds[i]['Date']=getDate(ds[i]['time']); | |
| }; | |
| // calculate min & max dates in the dataset and use a numberic index of year*12+month to iterate through the data | |
| min_array_date=d3.min(ds,function(d){return d['Date']}); | |
| max_array_date=d3.max(ds,function(d){return d['Date']}); | |
| global_minRev = d3.min(ds,function(d){return +d['revenue']}); | |
| global_maxRev = d3.max(ds,function(d){return +d['revenue']}); | |
| min_array_i = min_array_date.getMonth() + (min_array_date.getFullYear()*12); | |
| max_array_i = max_array_date.getMonth() + (max_array_date.getFullYear()*12); | |
| //console.log(min_array_date); | |
| //console.log(min_array_i); | |
| //console.log(max_array_date); | |
| //console.log(max_array_i); | |
| for(i=min_array_i; i < max_array_i + 1; i++){ | |
| // use setTimeout to pause through each visual due to asynchronous nature of JavaScripts | |
| // pause amount is 2.5 seconds | |
| window.setTimeout( | |
| (function (i){ | |
| return function() { | |
| curr_year = Math.floor(i/12); | |
| //console.log(curr_year); | |
| curr_month = i % 12; | |
| //console.log(curr_month); | |
| var ds_curr=ds.filter(function(el){ | |
| return el['Date'].getMonth()== curr_month && el['Date'].getFullYear()==curr_year; | |
| }); | |
| //console.log(ds_curr); | |
| calendar_chart(ds_curr); | |
| } | |
| })(i) | |
| ,(i-min_array_i) * 2000) | |
| }; | |
| }; | |
| // create the chart once (without this nothing happens for the first 12 seconds as setInterval executes after the delay time) | |
| data_chart(); | |
| // create the chart in an infinite leeop after a delay of 12 seconds | |
| window.setInterval(data_chart,24000); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment