mirror of
https://github.com/chartjs/Chart.js.git
synced 2026-03-07 00:36:50 +01:00
4.1 KiB
4.1 KiB
title
| title |
|---|
| New Charts |
Chart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be written as needed.
class MyType extends Chart.DatasetController {
}
Chart.controllers.MyType = MyType;
// Now we can create a new instance of our chart, using the Chart.js API
new Chart(ctx, {
// this is the string the constructor was registered at, ie Chart.controllers.MyType
type: 'MyType',
data: data,
options: options
});
Dataset Controller Interface
Dataset controllers must implement the following interface.
{
// Create elements for each piece of data in the dataset. Store elements in an array on the dataset as dataset.metaData
addElements: function() {},
// Draw the representation of the dataset
draw: function() {},
// Remove hover styling from the given element
removeHoverStyle: function(element, datasetIndex, index) {},
// Add hover styling to the given element
setHoverStyle: function(element, datasetIndex, index) {},
// Update the elements in response to new data
// @param mode : update mode, core calls this method using any of `'active'`, `'hide'`, `'reset'`, `'resize'`, `'show'` or `undefined`
update: function(mode) {}
}
The following methods may optionally be overridden by derived dataset controllers.
{
// Initializes the controller
initialize: function() {},
// Ensures that the dataset represented by this controller is linked to a scale. Overridden to helpers.noop in the polar area and doughnut controllers as these
// chart types using a single scale
linkScales: function() {},
// Called by the main chart controller when an update is triggered. The default implementation handles the number of data points changing and creating elements appropriately.
buildOrUpdateElements: function() {}
}
Extending Existing Chart Types
Extending or replacing an existing controller type is easy. Simply replace the constructor for one of the built in types with your own.
The built in controller types are:
Chart.controllers.lineChart.controllers.barChart.controllers.radarChart.controllers.doughnutChart.controllers.polarAreaChart.controllers.bubble
For example, to derive a new chart type that extends from a bubble chart, you would do the following.
class Custom extends Chart.controllers.bubble {
draw() {
// Call super method first
super.draw(arguments);
// Now we can do some custom drawing for this dataset. Here we'll draw a red box around the first point in each dataset
var meta = this.getMeta();
var pt0 = meta.data[0];
var radius = pt0.radius;
var ctx = this.chart.chart.ctx;
ctx.save();
ctx.strokeStyle = 'red';
ctx.lineWidth = 1;
ctx.strokeRect(pt0.x - radius, pt0.y - radius, 2 * radius, 2 * radius);
ctx.restore();
}
});
Custom.id = 'derivedBubble';
Custom.defaults = Chart.defaults.bubble;
// Stores the controller so that the chart initialization routine can look it up
Chart.register(Custom);
// Now we can create and use our new chart type
new Chart(ctx, {
type: 'derivedBubble',
data: data,
options: options
});
Same example in classic style
function Custom() {
Chart.controllers.bubble.apply(this, arguments);
// constructor stuff
}
Custom.prototype = Object.create(Chart.controllers.bubble.prototype);
Custom.prototype.constructor = Custom;
Custom.prototype.draw = function(ctx) {
Chart.controllers.bubble.prototype.draw.apply(this, arguments);
var meta = this.getMeta();
var pt0 = meta.data[0];
var radius = pt0.radius;
var ctx = this.chart.chart.ctx;
ctx.save();
ctx.strokeStyle = 'red';
ctx.lineWidth = 1;
ctx.strokeRect(pt0.x - radius, pt0.y - radius, 2 * radius, 2 * radius);
ctx.restore();}
}
Custom.id = 'derivedBubble';
Custom.defaults = Chart.defaults.bubble;
Chart.register(Custom);
// Now we can create and use our new chart type
new Chart(ctx, {
type: 'derivedBubble',
data: data,
options: options
});