/* 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