Introduction to Chart.js
This page walks through the US County Map examples of using Chart.js with CanvasMap.
The first step is to create a container for the chart and any other information you'd like to display:
<table border="0" style="padding:10px;margin:10px"> <tr> <td> <div id="CM_MapContainer_0"></div> </td> <td> <div id="CountyInfo" style='width:300px;height:30px;border:1px solid #000000;padding:10px'>State: None</div> <div style="width:300px"> <!-- Note that here we have to set the height and width as attributes separate from the style for Canvas elements ---> <canvas id="TheChartCanvas" height='320' width='300' style="border:1px solid #000000;padding:10px;bottom:0px"></canvas> </div> </td> </tr> </table>
The next step is to override the onload function for the county layer so we can colorize the features based on an attribute and setup the legend.
var TheColors=['#d7191c','#fdae61','#ffffbf','#abd9e9','#2c7bb6'];
var TheDataset=Layer_Counties.GetDataset();
// get the feature values into an array
var AttributeIndex=TheDataset.GetAttributeIndexFromHeading("AGE010210D");
var FeatureValues=TheDataset.GetAttributeArray(AttributeIndex);
// get colors to match the values
var Intervals=[0,10000,20000,50000,100000,200000];
var Result=CMUtilities.GetColorsFromArrays(FeatureValues,TheColors,Intervals); // get the feature colors and legend labels
// setup an array with styles based on the colors
var FeatureColors=Result.FeatureColors;
for (var i=0;i<TheDataset.GetNumAttributeRows();i++)
{
Layer_Counties.SetFeatureSetting("Style","strokeStyle",i,"rgba(220,220,200,0.8)");
Layer_Counties.SetFeatureSetting("Style","fillStyle",i,FeatureColors[i]);
};
// make a black outline for the selected style
Layer_Counties.SetSetting("SelectedStyle","fillStyle","rgba(0,0,0,0)");
Layer_Counties.SetSetting("SelectedStyle","strokeStyle","#000000");
Layer_Counties.SetSetting("SelectedStyle","lineWidth",2);
// add a legend
var TheCanvasElement=TheMainContainer.GetElement(CMMainContainer.CANVAS_CONTAINER);
var TheLegend=CMUtilities.AddLegend(TheCanvasElement,TheColors,Result.LegendLabels,10,302,190,115);
Next, we override the MouseDown function to update the chart and other information.
Layer_Counties.MouseDown=function(TheView,RefX,RefY)
{
var Used=false; // flag to indicate if we have used the event
// get the feature selected, if any
var FeatureIndex=this.In(TheView,RefX,RefY);
if (FeatureIndex!=-1) // -1 indicates no feature selected
{
var TheDataset=this.GetDataset();
this.SetSelectedFeature(FeatureIndex);
// update the DIV tag over the chart to contain the name of the selected county
var TheCountyInfo=document.getElementById("CountyInfo");
TheCountyInfo.innerHTML="County: "+TheDataset.GetAttributeCellByHeading("NAME",FeatureIndex);
// Setup the labels and "buckets" for the chart
var AttributeHeaders=["AGE010180D","AGE010190D","AGE010200D","AGE010210D"];
var Labels=["1980","1990","2000","2010"];
var Buckets=[]; // the buckets (values) for each cateogory
for (var i=0;i<Labels.length;i++)
{
var TheHeading=AttributeHeaders[i];
Buckets[i]=TheDataset.GetAttributeCellByHeading(TheHeading,FeatureIndex);
}
UpdateChart(Labels,Buckets);
Used=true; // let the caller know we've used the event so no one else uses it
}
return(Used);
};
The UpdateChart() function takes care of updating the chart based on the attributes for the selected feature.
/**
* Updates the chart with new data and labels
*/
var TheChart=null; // global with the existing chart, if any
function UpdateChart(Labels,Buckets)
{
// Setup the data for the chart library
var Color="rgba(20,20,20,1)";
var TheBarChartData={
type: 'line',
data: {
labels : Labels,
datasets : [{
label: 'population',
data : Buckets,
borderColor : Color
}]
}
}
Chart.defaults.global.legend.display = false;
// Get the canvas element for the chart and set its data
var TheChartCanvas=document.getElementById("TheChartCanvas"); // canvas
var TheContext=TheChartCanvas.getContext("2d");
if (TheChart!=null) TheChart.destroy();
TheChart=new Chart(TheContext,TheBarChartData);
};