/* Function : loadDayHourHeatmap * called from loadDayHourHeatGraph, all the params are passed from the parent function taken from the 'dom_elements' array of object * with the corresponding index of object according to which the graph has to be plotted, * css of the graph is included int the 'css/calendarView.css ' */ function loadDayHourHeatmap (dom_elements,inputData, totalDaysInMonth, index, month, cellSize, defaultWidth, timeTicksInDay,containsDataFlag, monthsFullName){ var dom_element_to_append_to = dom_elements[index].secondary; var colorScheme = dom_elements[index].colorSchemeDayHourMap; var margin = { top: 50, right: 0, bottom: 150, left: 120 }, width = defaultWidth, //$(dom_element_to_append_to).parent().width() - margin.left - margin.right, gridSize = Math.floor(width / 40), height = (gridSize * 24) + margin.top + margin.bottom - 170, legendElementWidth = gridSize*2.5, padding = 150, buckets = 9, colors = colorScheme, yAxis = [], xAxis = timeTicksInDay; for(var i=1; i<=totalDaysInMonth; ++i) yAxis.push(i.toString()); if(!containsDataFlag) colors = ["white", "white"]; var svg = d3.select(dom_element_to_append_to).append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom) .append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var dayLabels = svg.selectAll(".dayLabel") .data(xAxis) .enter().append("text") .text(function (d) { return d; }) .attr("x", 0) .attr("y", function (d, i) { return i * gridSize; }) .style("text-anchor", "end") .attr("transform", "translate(-6," + gridSize / 1.5 + ")") .attr("class", function (d, i) { return ((i >= 0 && i <= 4) ? "dayLabel mono axis axis-workweek" : "dayLabel mono axis"); }); var timeLabels = svg.selectAll(".timeLabel") .data(yAxis) .enter().append("text") .text(function(d) { return d; }) .attr("x", function(d, i) { return i * gridSize; }) .attr("y", 0) .style("text-anchor", "middle") .attr("transform", "translate(" + gridSize / 2 + ", -6)") .attr("class", function(d, i) { return ((i >= 7 && i <= 16) ? "timeLabel mono axis axis-worktime" : "timeLabel mono axis"); }); var tip = d3.tip() .attr('class', 'd3-tip') .offset([-10, 0]) .html(function(d) { if(dom_elements[index]['isForwardUnit']) return "
Day: " + d.day + " Hour: " + d.hour + "
" + "
Value: " + dom_elements[index]['unitName'] + "" + d3.format(",")(d.value) + "
"; else return "
Day: " + d.day + " Hour: " + d.hour + "
" + "
Value: " + d3.format(",")(d.value) + " " + dom_elements[index]['unitName'] + "" + "
"; }) svg.call(tip); svg.append("text") .attr("transform", "translate(" + (width/3) + " ," + (0-margin.top/2) + ")") .style("text-anchor", "middle") .style("font-size", gridSize) .text(monthsFullName[month-1]); svg.append("text") .attr("transform", "rotate(-90)") .attr("y", 0 - 90) .attr("x",0 - (height / 2)) .attr("dy", "1em") .style("text-anchor", "middle") .style("font-size", gridSize) .text("Time of Day"); var heatmapChart = function(data) { var colorScale = d3.scale.quantile() .domain([0, buckets - 1, d3.max(data, function (d) { return d.value; })]) .range(colors); var cards = svg.selectAll(".hour") .data(data, function(d) {return d.day+':'+d.hour;}); cards.append("title"); cards.enter().append("rect") .attr("y", 0) .attr("x", 0) .attr("height", gridSize * 24) .attr("width", gridSize * totalDaysInMonth) .attr("class", "border") .style("stroke","#000") .style("stroke-width", "4.5px") .style("z-index", -10); cards.enter().append("rect") .attr("y", function(d) { return (d.hour - 1) * gridSize; }) .attr("x", function(d) { return (d.day - 1) * gridSize; }) .attr("class", "hour ") .attr("width", gridSize) .attr("height", gridSize) .style("fill", colors[0]) .style("stroke", "#000") .style("stroke-width", "1px") .on('mouseover', tip.show) .on('mouseout', tip.hide); cards.transition().duration(1000) .style("fill", function(d) { return colorScale(d.value); }); cards.select("title").text(function(d) { return d.value; }); cards.exit().remove(); var legend = svg.selectAll(".legend") .data([0].concat(colorScale.quantiles()), function(d) { return d; }); legend.enter().append("g") .attr("class", "legend"); legend.append("rect") .attr("x", function(d, i) { return legendElementWidth * i; }) .attr("y", height + 30) .attr("width", legendElementWidth) .attr("height", gridSize / 2) .style("fill", function(d, i) { return colors[i]; }); legend.append("text") .attr("class", "mono") .text(function(d) { return "≥ " + Math.round(d); }) .attr("x", function(d, i) { return legendElementWidth * i; }) .attr("y", height + gridSize*1.3); legend.exit().remove(); }; heatmapChart(inputData); }; /* Function : loadDayHourHeatGraph * Variables : * * year and month:- year and month selected by the user for the calendarView graph * * val :- index position of the objects placed in the 'dom_elements' which is currently used for plotting the graph * * containsDataFlag :- variable is used as a flag, set it 'true' when there is no data in the object passed, * Description : * Internally called by loadMonthWeekHeatMap function when a particular month path is clicked, to plot heatMap corresponding to data related to month */ function loadDayHourHeatGraph (dom_elements, year, month, val, cellSize, defaultWidth, timeTicksInDay, monthsFullName) { $(dom_elements[val].secondary).empty(); var totalDays = parseInt(new Date(year, month, 0).getDate()); var obj = {containsDataFlag: false}; var convertedDataMonthly = convertDataMonthly(dom_elements[val].data,month,year, dom_elements[val]['data'][0]['meta_numsegs_month'], dom_elements[val]['data'][0]['meta_numsegs_day'], totalDays , dom_elements[val].categoryName,obj, true); var containsDataFlag = obj.containsDataFlag; loadDayHourHeatmap(dom_elements, convertedDataMonthly,totalDays, val, month, cellSize, defaultWidth, timeTicksInDay, containsDataFlag, monthsFullName); }; /* Function : convertDataYearly * Expected Input: Array of objects with properties of whole year selected by user {month: , year: , day_segment_id: , month_segment_id: ,weekday_id: ,categoryName: } * Variables passed * * inputData: contains array of objects as shown above, * * valueCategoryName: it is the name of the object property which is plotted on the graph * * convertedDataYearly : it is an array which contains the output of the function * Expected Output : Array of objects with properties like { date: , value: }. * This function is only used for converting data passed from user to format accepted by the loadDayHourHeatMap function and loadMonthWeekHeatMap Function */ function convertDataYearly (inputData, valueCategoryName, year, monthSegments, daySegments) { var convertedDataYearly = []; var convertedDataMonthly = []; //var year = $rootScope.queryYearSelected['name']; var totalDays; if((year%4==0 && year%100!=0) || year%400==0) totalDays = 366; else totalDays = 365; var date; for(var i=1; i<=totalDays; ++i) { date = new Date(year,0); date = new Date(date.setDate(i)); var day = date.getDate(); var month = date.getMonth() + 1; if (month< 10) month = '0' + month; if (day < 10) day = '0' + day; date = year + "" + month + "" + day; date = parseInt(date); convertedDataYearly.push({Date: date, value: 0}); } var count = -1; var extraVariable = {containsDataFlag:false}; //Not required in calendar View Graph for(var i=1; i<=12; ++i) { var totalDaysInMonth = parseInt(new Date(year, i, 0).getDate()); convertedDataMonthly = convertDataMonthly(inputData, i,year, monthSegments, daySegments,totalDaysInMonth , valueCategoryName , extraVariable, false); for(var j=0; jDate: " + day + "/" + month + "/" + year + "" + "
Value: " + dom_element['unitName'] + "" + d3.format(",")(data[d]) + "
"; else return "
Date: " + day + "/" + month + "/" + year + "
" + "
Value: " + d3.format(",")(data[d]) + " " + dom_element['unitName'] + "" + "
"; }); svg.call(tip); var currentPathId; rect.filter(function(d) { return d in data; }) .on("click", function(d){ var year = d/10000; year = Math.floor(year); var monthInt = d/100; var val = 0,id; for(var itr=0; itr