From b13c33d83ceef29361a584ae53fef57e86e3ad81 Mon Sep 17 00:00:00 2001 From: Eric Hulburd Date: Fri, 12 Feb 2016 15:51:06 -0600 Subject: [PATCH] add d3 calendar grid --- client/d3/bar/base.js | 2 +- client/d3/base.d3.js | 1 - client/d3/base.js | 47 ++++++++++++ client/d3/composite.d3.js | 1 - client/d3/grid.d3.js | 0 client/d3/grid/calendar_grid.js | 122 ++++++++++++++++++++++++++++++++ client/d3/line.d3.js | 1 - client/d3/line/line.js | 8 ++- client/d3/line/spline.js | 7 ++ client/d3/pie.d3.js | 1 - 10 files changed, 184 insertions(+), 6 deletions(-) delete mode 100644 client/d3/base.d3.js create mode 100644 client/d3/base.js delete mode 100644 client/d3/composite.d3.js delete mode 100644 client/d3/grid.d3.js create mode 100644 client/d3/grid/calendar_grid.js delete mode 100644 client/d3/line.d3.js delete mode 100644 client/d3/pie.d3.js diff --git a/client/d3/bar/base.js b/client/d3/bar/base.js index 8e356ad..94ee48e 100644 --- a/client/d3/bar/base.js +++ b/client/d3/bar/base.js @@ -29,7 +29,7 @@ class BarChart { constructor(options){ var bar_chart = this; - bar_chart = extend(bar_chart, DEFAULTS, options); + bar_chart = extend(bar_chart, DEFAULTS, bar_chart.chart_options, options); bar_chart.height = bar_chart.outer_height - bar_chart.margin.top - bar_chart.margin.bottom; bar_chart.width = bar_chart.outer_width - bar_chart.margin.left - bar_chart.margin.right; diff --git a/client/d3/base.d3.js b/client/d3/base.d3.js deleted file mode 100644 index 8adbe50..0000000 --- a/client/d3/base.d3.js +++ /dev/null @@ -1 +0,0 @@ -base.d3.js diff --git a/client/d3/base.js b/client/d3/base.js new file mode 100644 index 0000000..093e65e --- /dev/null +++ b/client/d3/base.js @@ -0,0 +1,47 @@ +const DEFAULTS = { + outer_width: 500, + outer_height: 300, + margin: {top: 0, left: 70, bottom: 50, right: 20}, + domain_ticks: 10, + range_ticks: 8, + container: "container", + time_series: false, + range_label: undefined, + domain_attr: undefined, + range_attr: undefined, + titleize: function(series, datum){ + var s = datum ? datum.name : series.name, + words = s.split(' '), + array = []; + for (var i=0; i{ return grid_chart.parseDate(d[grid_chart.date_attr]); } : (d)=>{ return d[grid_chart.date_attr] }; + + var min_range = grid_chart.extent[0] || 0, + max_range = grid_chart.extent[1] || 0; + serialized_data.months = []; + series.values.forEach((value)=>{ + var date = toDate(value), + date_s = grid_chart.monthFormat(value); + + min_range = Math.min(0, min_range, value[grid_chart.range_attr]); + max_range = Math.max(max_range, value[grid_chart.range_attr]); + if (serialized_data.months.indexOf(date_s) < 0) serialized_data.months.push(date_s); + }); + serialized_data.range ={ + min: min_range, + max: max_range, + diff: max_range - min_range }; + + serialized_data.months = serialized_data.months.sort((date_s1, date_s2)=>{ + var date1 = grid_chart.monthFormat(date_s1), + date2 = grid_chart.monthFormat(date_s2); + return date1.toTime() - date2.toTime(); + }); + return serialized_data; + }; + + drawData(data){ + var grid_chart = this; + data = grid_chart.serializeData(data); + + // calibrate axes + grid_chart.y_scale.domain(data.months); + grid_chart.svg.select(".d3-chart-range") + .call(grid_chart.y_axis); + + grid_chart.x_scale.domain([1, 31]); + grid_chart.svg.select(".d3-chart-domain").call(grid_chart.x_axis); + + var grid_units = grid_chart.svg.selectAll(".d3-chart-grid-unit" + series.css_class) + .data(data.series.values); + grid_chart.applyData(data.series, grid_units.enter().append("rect")); + grid_chart.applyData(data.series, grid_units.transition()); + grid_units.exit().remove(); + } + + // helper method for drawData. + applyData(series, elements){ + var grid_chart = this, + series_class = "d3-chart-grid-unit " + series.css_class; + elements + .attr("class", function(d){ return series_class + " " + d.css_class; }) + .attr("y", function(d) { return grid_chart.y_scale(grid_chart.monthFormat(d[grid_chart.date_attr])); }) + .attr("height", grid_chart.y_scale.rangeBand()) + .attr("x", function(d) { return d[grid_chart.date_attr].getDate(); }) + .attr("width", function(d) { return grid_chart.x_scale.rangeBand(); }) + .attr("opacity", function(d) { return grid_chart.applyOpacity(d[grid_chart.range_attr], series.range); }) + } + + applyOpacity(value, range){ + return (value - range.max) / range.diff; + }; + +} + +export default CalendarGridChart; diff --git a/client/d3/line.d3.js b/client/d3/line.d3.js deleted file mode 100644 index ec6493c..0000000 --- a/client/d3/line.d3.js +++ /dev/null @@ -1 +0,0 @@ -line.d3.js diff --git a/client/d3/line/line.js b/client/d3/line/line.js index 418a7d8..dc3f0d4 100644 --- a/client/d3/line/line.js +++ b/client/d3/line/line.js @@ -38,6 +38,12 @@ class LineChart { line_chart.init(); } + get chart_options(){ + return { + interpolation: 'basis' + }; + } + init(){ var line_chart = this; @@ -49,7 +55,7 @@ class LineChart { // function that draws the lines. line_chart.line = d3.svg.line() - .interpolate("basis") + .interpolate(line_chart.chart_options.interpolation) .x(function(d){ return x(d[line_chart.domain_attr]); }) .y(function(d){ return y(d[line_chart.range_attr]); }); diff --git a/client/d3/line/spline.js b/client/d3/line/spline.js index e6dd7cb..e4f6bab 100644 --- a/client/d3/line/spline.js +++ b/client/d3/line/spline.js @@ -1,6 +1,13 @@ import LineChart from './line'; +const INTEPOLATION = 'cardinal'; + class SplineChart extends LineChart { + get chart_options(){ + return { + interpolation: INTEPOLATION + } + } } diff --git a/client/d3/pie.d3.js b/client/d3/pie.d3.js deleted file mode 100644 index 23c32ce..0000000 --- a/client/d3/pie.d3.js +++ /dev/null @@ -1 +0,0 @@ -pie.d3.js