diff --git a/src/web/arr/trove/chart.arr b/src/web/arr/trove/chart.arr index 0c910d027..11abad979 100644 --- a/src/web/arr/trove/chart.arr +++ b/src/web/arr/trove/chart.arr @@ -843,6 +843,15 @@ default-function-plot-series = { legend: '', } +type GeoChartSeries = { + tab :: TableIntern, + region :: String, +} + +default-geochart-series = { + region: "world", +} + ########### type ChartWindowObject = { @@ -949,6 +958,15 @@ default-plot-chart-window-object :: PlotChartWindowObject = default-chart-window num-samples: 1000, } +type GeoChartWindowObject = { + title :: String, + width :: Number, + height :: Number, + render :: ( -> IM.Image), +} + +default-geo-chart-window-object :: GeoChartWindowObject = default-chart-window-object + ################################################################################ # DATA DEFINITIONS ################################################################################ @@ -1043,6 +1061,13 @@ data DataSeries: max-num-bins: some(num-bins) }) end, + | geochart-series(obj :: GeoChartSeries) with: + is-single: true, + contr: {(): geochart-series}, + method region(self, region :: String): + geochart-series(self.obj.{ + region: region}) + end sharing: method _output(self): cases (E.Either) run-task({(): get-vs-from-img("DataSeries", render-chart(self).get-image())}): @@ -1098,6 +1123,8 @@ data ChartWindow: end plot-chart-window(self.obj.{num-samples: num-samples}) end, + | geochart-window(obj :: GeoChartWindowObject) with: + constr: {(): geochart-window}, sharing: method display(self): _ = check-chart-window(self.obj) @@ -1481,6 +1508,19 @@ fun labeled-histogram-from-list(labels :: P.LoS, values :: P.LoN) -> DataSeries } ^ histogram-series end +fun geochart-from-list( + region-labels :: P.LoS, + values :: P.LoN) -> DataSeries block: + region-length = region-labels.length() + values-length = values.length() + when region-length <> values-length: + raise("geochart: region-labels and values should have the same length") + end + default-geochart-series.{ + tab: to-table2(region-labels, values) + } ^ geochart-series +end + ################################################################################ # PLOTS ################################################################################ @@ -1556,6 +1596,11 @@ fun render-chart(s :: DataSeries) -> ChartWindow: P.histogram(self, obj) end } ^ histogram-chart-window + | geochart-series(obj) => + default-geo-chart-window-object.{ + method render(self): + P.geochart(self, obj) end + } ^ geochart-window end where: render-now = {(x): render-chart(x).get-image()} @@ -1952,4 +1997,5 @@ from-list = { freq-bar-chart: freq-bar-chart-from-list, labeled-box-plot: labeled-box-plot-from-list, box-plot: box-plot-from-list, -} + geochart: geochart-from-list, +} \ No newline at end of file diff --git a/src/web/js/trove/chart-lib.js b/src/web/js/trove/chart-lib.js index 7abc623f8..cb74ec3ae 100644 --- a/src/web/js/trove/chart-lib.js +++ b/src/web/js/trove/chart-lib.js @@ -13,7 +13,8 @@ 'multi-bar-chart': "tany", 'histogram': "tany", 'box-plot': "tany", - 'plot': "tany" + 'plot': "tany", + 'geochart': "tany" } }, theModule: function (RUNTIME, NAMESPACE, uri, IMAGELIB, jsnums , google) { @@ -63,7 +64,7 @@ } } - google.charts.load('current', {'packages' : ['corechart']}); + google.charts.load('current', {'packages' : ['corechart', 'geochart']}); ////////////////////////////////////////////////////////////////////////////// @@ -884,6 +885,26 @@ }; } + function geoChart(globalOptions, rawData) { + const table = get(rawData, 'tab'); + const data = new google.visualization.DataTable(); + const region = get(rawData, 'region'); + data.addColumn('string', 'Region'); + data.addColumn('number', "Value"); + data.addRows(table.map(row => [row[0], toFixnum(row[1])])); + console.log("test123"); + console.log(region); + const options = {region: region}; + + return { + data: data, + options: options, + chartType: google.visualization.GeoChart, + onExit: defaultImageReturn, + }; + } + + function plot(globalOptions, rawData) { const scatters = get(rawData, 'scatters'); const lines = get(rawData, 'lines'); @@ -1245,6 +1266,7 @@ ${labelRow}`; 'histogram': makeFunction(histogram), 'box-plot': makeFunction(boxPlot), 'plot': makeFunction(plot), + 'geochart': makeFunction(geoChart), }, { "LoC": ann("List", checkListWith(IMAGE.isColorOrColorString)), diff --git a/src/web/js/trove/cpo-builtins.js b/src/web/js/trove/cpo-builtins.js index ada82e6b5..dc8a7e600 100644 --- a/src/web/js/trove/cpo-builtins.js +++ b/src/web/js/trove/cpo-builtins.js @@ -22,4 +22,4 @@ theModule: function(runtime, namespace, _ /* intentionally unused */ ) { return runtime.makeJSModuleReturn({cpoBuiltins: true}); } -} +} \ No newline at end of file