- <!DOCTYPE html>
- <html>
-
- <head>
- <meta charset="utf-8">
- <title>ZingSoft Demo</title>
- <script nonce="undefined" src="https://cdn.zingchart.com/zingchart.min.js"></script>
- <style>
- .chart--container {
- min-height: 530px;
- width: 100%;
- height: 100%;
- }
-
- .zc-ref {
- display: none;
- }
- </style>
- </head>
-
- <body>
- <div id="myChart" class="chart--container">
- <a class="zc-ref" href="https://www.zingchart.com/">Powered by ZingChart</a>
- </div>
- <script>
- ZC.LICENSE = ["569d52cefae586f634c54f86dc99e6a9", "b55b025e438fa8a98e32482b5f768ff5"];
- let aColorRange = ['#D36A67', '#E5896C', '#F9BC7F', '#F9DEA7', '#9CD8B1', '#91BAA0', '#389B96', '#425B5E'];
- let aDomain = [100000, 40000000]; // [mix,max]
-
- let chartItems = {
- CA: {
- value: 38332521
- },
- OR: {
- value: 3930065
- },
- WA: {
- value: 6971406
- },
- NV: {
- value: 2790136
- },
- ID: {
- value: 1612136
- },
- UT: {
- value: 2900872
- },
- AZ: {
- value: 6626624
- },
- MT: {
- value: 1015165
- },
- WY: {
- value: 582658
- },
- CO: {
- value: 5268367
- },
- NM: {
- value: 2085287
- },
- AK: {
- value: 735132
- },
- HI: {
- value: 1404054
- },
- TX: {
- value: 26448193
- },
- OK: {
- value: 3850568
- },
- KS: {
- value: 2893957
- },
- NE: {
- value: 1868516
- },
- SD: {
- value: 844877
- },
- ND: {
- value: 723393
- },
- MN: {
- value: 5420380
- },
- IA: {
- value: 3090416
- },
- MO: {
- value: 6044171
- },
- AR: {
- value: 2959373
- },
- LA: {
- value: 4625470
- },
- MS: {
- value: 2991207
- },
- TN: {
- value: 6495978
- },
- KY: {
- value: 4395295
- },
- IL: {
- value: 12882135
- },
- WI: {
- value: 5742713
- },
- MI: {
- value: 9895622
- },
- IN: {
- value: 6570902
- },
- AL: {
- value: 4833722
- },
- GA: {
- value: 9992167
- },
- FL: {
- value: 19552860
- },
- SC: {
- value: 4774839
- },
- NC: {
- value: 9848060
- },
- VA: {
- value: 8260405
- },
- WV: {
- value: 1854304
- },
- OH: {
- value: 11570808
- },
- PA: {
- value: 12773801
- },
- DC: {
- value: 681170
- },
- MD: {
- value: 5928814
- },
- DE: {
- value: 925749
- },
- NJ: {
- value: 8899339
- },
- NY: {
- value: 19651127
- },
- CT: {
- value: 3596080
- },
- RI: {
- value: 1051511
- },
- MA: {
- value: 6692824
- },
- VT: {
- value: 626630
- },
- NH: {
- value: 1323459
- },
- ME: {
- value: 1328302
- }
- };
-
- let chartConfig = {
- title: {
- text: 'Population By Province',
- align: 'left',
- fontSize: '14px'
- },
- shapes: [{
- type: 'zingchart.maps',
- options: {
- name: 'usa',
- scale: {
- type: 'quantize', // if you define threshold here your domain length must match your range length
- domain: aDomain, // [min,max]
- range: aColorRange
- },
- style: {
- tooltip: {
- backgroundColor: 'inherit',
- borderColor: '#FFF',
- borderWidth: '2px',
- fontColor: '#000',
- fontSize: '15px'
- },
- controls: {
- placement: 'br'
- },
- hoverState: {
- backgroundColor: 'transparent',
- borderColor: '#000',
- borderWidth: '2px'
- },
- items: chartItems,
- label: { // text displaying. Like valueBox
- fontSize: '8px',
- visible: true
- }
- },
- zoom: 1.1
- }
- }],
- choropleth: {
- legend: {
- align: 'left',
- verticalAlign: 'bottom',
- header: {
- text: 'Population Range'
- },
- item: {
- cursor: 'pointer',
- },
- items: [{
- text: ' > 100,000'
- }],
- marker: {
- cursor: 'pointer'
- }
- }
- }
- };
-
- zingchart.loadModules('maps,maps-usa');
- zingchart.render({
- id: 'myChart',
- modules: 'choropleth',
- data: chartConfig,
- height: '100%',
- width: '100%',
- });
-
- // Used to only bind events once. When the window re-sizes we don't need to overwrite the events
- let firstTimeLoad = true;
-
- let leftOrRight = (value, left, right) => {
- let leftDiff = Math.abs(value - left);
- let rightDiff = Math.abs(value - right);
- return leftDiff < rightDiff ? true : false
- };
-
- let isBetween = (value, left, right) => {
- return value > left && value < right;
- };
-
- let thresholdIndex = (value, scale) => {
- for (let i = 0; i < scale.length; i++) {
- if (value < scale[i]) {
- return i;
- }
- }
- return scale.length;
- };
-
- let quantizeIndex = (value, scale) => {
- let first = scale[0];
- let last = scale[scale.length - 1];
- for (let i = 0; i < scale.length; i++) {
- if (value <= first) {
- return 0;
- } else if (value >= last) {
- return scale.length - 1;
- } else if (i < scale.length - 1) {
- if (value == scale[i]) {
- return i;
- } else {
- let current = scale[i];
- let next = scale[i + 1];
- if (isBetween(value, current, next)) {
- return leftOrRight(value, current, next) ? i : i + 1;
- }
- }
- }
- }
- };
-
- // define mix max for domain
- let quantize = (value, domain, range) => {
- let index = quantizeIndex(value, domain);
- return {
- range: range[index],
- domain: domain[index],
- group: index
- };
- };
-
- let quantizeDomain = (aDomain, aRange) => {
- let iMin = aDomain[0];
- let iMax = aDomain[1];
- let iSlope = (iMax - iMin) / (aRange.length - 1);
- let aScale = [];
- for (let i = 0; i < aRange.length; i++) {
- aScale[i] = (iSlope * i + iMin);
- }
- return aScale;
- };
-
- let generateDomain = (sType, aDomain, aRange) => {
- let aScale = aDomain;
- if (sType == 'quantize') {
- aScale = quantizeDomain(aDomain, aRange)
- }
- return aScale;
- };
-
- let drawLegend = (domain, range, json) => {
- if (!json.series)
- json.series = [];
-
- json.legend = json.choropleth.legend || {};
- for (let i = 0; i < domain.length; i++) {
- json.series[i] = {
- /*
- * merge text if user wants to define new text.
- * else format thousands separator
- */
- text: (json.legend.items && json.legend.items[i] && json.legend.items[i].text) ? json.legend.items[i].text : Math.round(domain[i]).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','),
- lineColor: range[i],
- backgroundColor: range,
- dataDomain: domain[i],
- dataVisible: true
- };
- }
- };
-
- let legendClickForMaps = (e) => {
- let clickedDomain = e.xdata.domain;
- let plotIsVisible = e.xdata.visible;
- let plotIndex = e.plotindex;
- let json = zingchart.exec(e.id, 'getdata');
- json = json.graphset ? json.graphset[0] : json;
- let items = json.shapes;
- let toggleOffColor = '#c3c3c3';
- e.xdata.visible = !e.xdata.visible;
-
- for (let i = 0; i < items.length; i++) {
- if (clickedDomain == items[i].domain) {
- if (plotIsVisible) {
- items[i]['background-color'] = toggleOffColor;
- } else {
- items[i]['background-color'] = items[i]['original-background-color'];
- }
- zingchart.exec(e.id, 'updateobject', {
- type: 'shape',
- data: items[i]
- });
- }
- }
- };
-
- // define a range of thresholds for domain
- let threshold = (value, domain, range) => {
- let index = thresholdIndex(value, domain);
- return {
- range: range[index],
- domain: domain[index],
- group: index
- };
- };
-
- /* custom module for choropleth charts */
- zingchart.defineModule('choropleth', 'plugin', (originalJson) => {
- if (originalJson.shapes[0].options) {
- let options = originalJson.shapes[0].options;
- let mapType = options.name;
- let scaleType = options.scale.type;
- let range = options.scale.range;
- let domain = generateDomain(scaleType, options.scale.domain, range);
- let scaleFunction = (scaleType == 'quantize' ? quantize : threshold);
-
- // Initialize items object
- let items = {};
- // Iterate over options items
- for (let key in options.style.items) {
- let item = options.style.items[key];
- let name = item.name;
- let value = item.value;
- let rangeIndex = scaleFunction(value, domain, range);
- let keyInfo = zingchart.maps.getItemInfo(options.name, key)
- item['background-color'] = rangeIndex.range;
- item['original-background-color'] = rangeIndex.range;
- item['domain'] = rangeIndex.domain;
- item['tooltip'] = options.style.tooltip ? JSON.parse(JSON.stringify(options.style.tooltip)) : {};
- item['tooltip']['text'] = keyInfo.tooltip.text + ' <br>' + item.value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
- item['group'] = rangeIndex.group + 1;
-
- // border color, font-color and background color can inherit
- if (item['tooltip']['border-color'] == 'inherit')
- item['tooltip']['border-color'] = rangeIndex.range;
- if (item['tooltip']['backgroundColor'] == 'inherit')
- item['tooltip']['backgroundColor'] = rangeIndex.range;
- if (item['tooltip']['background-color'] == 'inherit')
- item['tooltip']['background-color'] = rangeIndex.range;
- if (item['tooltip']['font-color'] == 'inherit')
- item['tooltip']['font-color'] = rangeIndex.range;
- }
-
- // Draw the legend
- if (originalJson.choropleth.legend) {
- drawLegend(domain, range, originalJson);
-
- // only bind events on first load
- if (firstTimeLoad) {
- zingchart.bind(null, 'legend_item_click', legendClickForMaps);
- zingchart.bind(null, 'legend_marker_click', legendClickForMaps);
- firstTimeLoad = false;
- }
- }
-
- return originalJson;
- } else {
- console.error('Whoa there... You need an `options` object to set the styles.');
- }
- });
- </script>
- </body>
-
- </html>
- <!DOCTYPE html>
- <html>
-
- <head>
- <meta charset="utf-8">
- <title>ZingSoft Demo</title>
- <script src="https://cdn.zingchart.com/zingchart.min.js"></script>
- </head>
-
- <body>
- <div id="myChart" class="chart--container">
- <a class="zc-ref" href="https://www.zingchart.com/">Powered by ZingChart</a>
- </div>
- </body>
-
- </html>
- .chart--container {
- min-height: 530px;
- width: 100%;
- height: 100%;
- }
-
- .zc-ref {
- display: none;
- }
- let aColorRange = ['#D36A67', '#E5896C', '#F9BC7F', '#F9DEA7', '#9CD8B1', '#91BAA0', '#389B96', '#425B5E'];
- let aDomain = [100000, 40000000]; // [mix,max]
-
- let chartItems = {
- CA: {
- value: 38332521
- },
- OR: {
- value: 3930065
- },
- WA: {
- value: 6971406
- },
- NV: {
- value: 2790136
- },
- ID: {
- value: 1612136
- },
- UT: {
- value: 2900872
- },
- AZ: {
- value: 6626624
- },
- MT: {
- value: 1015165
- },
- WY: {
- value: 582658
- },
- CO: {
- value: 5268367
- },
- NM: {
- value: 2085287
- },
- AK: {
- value: 735132
- },
- HI: {
- value: 1404054
- },
- TX: {
- value: 26448193
- },
- OK: {
- value: 3850568
- },
- KS: {
- value: 2893957
- },
- NE: {
- value: 1868516
- },
- SD: {
- value: 844877
- },
- ND: {
- value: 723393
- },
- MN: {
- value: 5420380
- },
- IA: {
- value: 3090416
- },
- MO: {
- value: 6044171
- },
- AR: {
- value: 2959373
- },
- LA: {
- value: 4625470
- },
- MS: {
- value: 2991207
- },
- TN: {
- value: 6495978
- },
- KY: {
- value: 4395295
- },
- IL: {
- value: 12882135
- },
- WI: {
- value: 5742713
- },
- MI: {
- value: 9895622
- },
- IN: {
- value: 6570902
- },
- AL: {
- value: 4833722
- },
- GA: {
- value: 9992167
- },
- FL: {
- value: 19552860
- },
- SC: {
- value: 4774839
- },
- NC: {
- value: 9848060
- },
- VA: {
- value: 8260405
- },
- WV: {
- value: 1854304
- },
- OH: {
- value: 11570808
- },
- PA: {
- value: 12773801
- },
- DC: {
- value: 681170
- },
- MD: {
- value: 5928814
- },
- DE: {
- value: 925749
- },
- NJ: {
- value: 8899339
- },
- NY: {
- value: 19651127
- },
- CT: {
- value: 3596080
- },
- RI: {
- value: 1051511
- },
- MA: {
- value: 6692824
- },
- VT: {
- value: 626630
- },
- NH: {
- value: 1323459
- },
- ME: {
- value: 1328302
- }
- };
-
- let chartConfig = {
- title: {
- text: 'Population By Province',
- align: 'left',
- fontSize: '14px'
- },
- shapes: [{
- type: 'zingchart.maps',
- options: {
- name: 'usa',
- scale: {
- type: 'quantize', // if you define threshold here your domain length must match your range length
- domain: aDomain, // [min,max]
- range: aColorRange
- },
- style: {
- tooltip: {
- backgroundColor: 'inherit',
- borderColor: '#FFF',
- borderWidth: '2px',
- fontColor: '#000',
- fontSize: '15px'
- },
- controls: {
- placement: 'br'
- },
- hoverState: {
- backgroundColor: 'transparent',
- borderColor: '#000',
- borderWidth: '2px'
- },
- items: chartItems,
- label: { // text displaying. Like valueBox
- fontSize: '8px',
- visible: true
- }
- },
- zoom: 1.1
- }
- }],
- choropleth: {
- legend: {
- align: 'left',
- verticalAlign: 'bottom',
- header: {
- text: 'Population Range'
- },
- item: {
- cursor: 'pointer',
- },
- items: [{
- text: ' > 100,000'
- }],
- marker: {
- cursor: 'pointer'
- }
- }
- }
- };
-
- zingchart.loadModules('maps,maps-usa');
- zingchart.render({
- id: 'myChart',
- modules: 'choropleth',
- data: chartConfig,
- height: '100%',
- width: '100%',
- });
-
- // Used to only bind events once. When the window re-sizes we don't need to overwrite the events
- let firstTimeLoad = true;
-
- let leftOrRight = (value, left, right) => {
- let leftDiff = Math.abs(value - left);
- let rightDiff = Math.abs(value - right);
- return leftDiff < rightDiff ? true : false
- };
-
- let isBetween = (value, left, right) => {
- return value > left && value < right;
- };
-
- let thresholdIndex = (value, scale) => {
- for (let i = 0; i < scale.length; i++) {
- if (value < scale[i]) {
- return i;
- }
- }
- return scale.length;
- };
-
- let quantizeIndex = (value, scale) => {
- let first = scale[0];
- let last = scale[scale.length - 1];
- for (let i = 0; i < scale.length; i++) {
- if (value <= first) {
- return 0;
- } else if (value >= last) {
- return scale.length - 1;
- } else if (i < scale.length - 1) {
- if (value == scale[i]) {
- return i;
- } else {
- let current = scale[i];
- let next = scale[i + 1];
- if (isBetween(value, current, next)) {
- return leftOrRight(value, current, next) ? i : i + 1;
- }
- }
- }
- }
- };
-
- // define mix max for domain
- let quantize = (value, domain, range) => {
- let index = quantizeIndex(value, domain);
- return {
- range: range[index],
- domain: domain[index],
- group: index
- };
- };
-
- let quantizeDomain = (aDomain, aRange) => {
- let iMin = aDomain[0];
- let iMax = aDomain[1];
- let iSlope = (iMax - iMin) / (aRange.length - 1);
- let aScale = [];
- for (let i = 0; i < aRange.length; i++) {
- aScale[i] = (iSlope * i + iMin);
- }
- return aScale;
- };
-
- let generateDomain = (sType, aDomain, aRange) => {
- let aScale = aDomain;
- if (sType == 'quantize') {
- aScale = quantizeDomain(aDomain, aRange)
- }
- return aScale;
- };
-
- let drawLegend = (domain, range, json) => {
- if (!json.series)
- json.series = [];
-
- json.legend = json.choropleth.legend || {};
- for (let i = 0; i < domain.length; i++) {
- json.series[i] = {
- /*
- * merge text if user wants to define new text.
- * else format thousands separator
- */
- text: (json.legend.items && json.legend.items[i] && json.legend.items[i].text) ? json.legend.items[i].text : Math.round(domain[i]).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','),
- lineColor: range[i],
- backgroundColor: range,
- dataDomain: domain[i],
- dataVisible: true
- };
- }
- };
-
- let legendClickForMaps = (e) => {
- let clickedDomain = e.xdata.domain;
- let plotIsVisible = e.xdata.visible;
- let plotIndex = e.plotindex;
- let json = zingchart.exec(e.id, 'getdata');
- json = json.graphset ? json.graphset[0] : json;
- let items = json.shapes;
- let toggleOffColor = '#c3c3c3';
- e.xdata.visible = !e.xdata.visible;
-
- for (let i = 0; i < items.length; i++) {
- if (clickedDomain == items[i].domain) {
- if (plotIsVisible) {
- items[i]['background-color'] = toggleOffColor;
- } else {
- items[i]['background-color'] = items[i]['original-background-color'];
- }
- zingchart.exec(e.id, 'updateobject', {
- type: 'shape',
- data: items[i]
- });
- }
- }
- };
-
- // define a range of thresholds for domain
- let threshold = (value, domain, range) => {
- let index = thresholdIndex(value, domain);
- return {
- range: range[index],
- domain: domain[index],
- group: index
- };
- };
-
- /* custom module for choropleth charts */
- zingchart.defineModule('choropleth', 'plugin', (originalJson) => {
- if (originalJson.shapes[0].options) {
- let options = originalJson.shapes[0].options;
- let mapType = options.name;
- let scaleType = options.scale.type;
- let range = options.scale.range;
- let domain = generateDomain(scaleType, options.scale.domain, range);
- let scaleFunction = (scaleType == 'quantize' ? quantize : threshold);
-
- // Initialize items object
- let items = {};
- // Iterate over options items
- for (let key in options.style.items) {
- let item = options.style.items[key];
- let name = item.name;
- let value = item.value;
- let rangeIndex = scaleFunction(value, domain, range);
- let keyInfo = zingchart.maps.getItemInfo(options.name, key)
- item['background-color'] = rangeIndex.range;
- item['original-background-color'] = rangeIndex.range;
- item['domain'] = rangeIndex.domain;
- item['tooltip'] = options.style.tooltip ? JSON.parse(JSON.stringify(options.style.tooltip)) : {};
- item['tooltip']['text'] = keyInfo.tooltip.text + ' <br>' + item.value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
- item['group'] = rangeIndex.group + 1;
-
- // border color, font-color and background color can inherit
- if (item['tooltip']['border-color'] == 'inherit')
- item['tooltip']['border-color'] = rangeIndex.range;
- if (item['tooltip']['backgroundColor'] == 'inherit')
- item['tooltip']['backgroundColor'] = rangeIndex.range;
- if (item['tooltip']['background-color'] == 'inherit')
- item['tooltip']['background-color'] = rangeIndex.range;
- if (item['tooltip']['font-color'] == 'inherit')
- item['tooltip']['font-color'] = rangeIndex.range;
- }
-
- // Draw the legend
- if (originalJson.choropleth.legend) {
- drawLegend(domain, range, originalJson);
-
- // only bind events on first load
- if (firstTimeLoad) {
- zingchart.bind(null, 'legend_item_click', legendClickForMaps);
- zingchart.bind(null, 'legend_marker_click', legendClickForMaps);
- firstTimeLoad = false;
- }
- }
-
- return originalJson;
- } else {
- console.error('Whoa there... You need an `options` object to set the styles.');
- }
- });