jQuery plugin for creating line, bar and candlestick charts.
Should work in all browsers that support the canvas element (tested in newest versions of Chrome, Firefox and Internet Explorer).
Support for Internet Explorer 8 and below should be possible using polyfill and an older version of jQuery. See https://code.google.com/p/explorercanvas for polyfill.
- Support for non-date x-axis
- Update data dynamically
- Fix x-axis
Include jQuery, jqCandlestick JavaScript and jqCandlestick CSS:
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.jqcandlestick.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/jqcandlestick.css" />
It is important that you include jQuery before jqCandlestick.
Create a container for your chart and use the jqCandlestick()
function on it to create the chart:
<div id="my-chart" style="width: 640px; height: 480px;"></div>
<script type="text/javascript">
$(function() {
var data = [/* ... */];
$('#my-chart').jqCandlestick({
data: data,
});
});
</script>
Where data
should be a variable containing a multi-dimensional array of data. The expected format of the data-array depends on the number of data series in the chart. The first element of each row is the x-value (as a UNIX timestamp) (this can be changed in the options).
Many configuration options are available. The default options are defined in $.fn.jqCandlestick.defaults
.
Multiple data series can be defined for a chart:
<script type="text/javascript">
$(function() {
$('#my-chart').jqCandlestick({
data: data,
series: [{
type: 'line',
name: 'Series #1',
}, {
type: 'point',
name: 'Series #2',
dataOffset: 2
}],
});
});
</script>
Each series inherits its settings from $.fn.jqCandlestick.defaults.seriesDefaults
, which is defined as:
seriesDefaults: {
type: 'point',
name: null,
names: [],
dataOffset: 1,
yAxis: 0,
color: '#fff',
}
Four built-in types are available (defined in $.fn.jqCandlestick.types
): 'point'
, 'line'
, 'column'
and 'candlestick'
. The name-option defines the name of the series (shown when hovering over the chart) while the names-option, which is only used by type 'candlestick'
, defines the labels for "open", "high", "low" and "close".
The dataOffset-option defines at which offset the values for the series start. The default is 1
which means that a default point-chart will expect a data-array of the format:
[
[1391697000000, 23], // timestamp, value (offsets 0 and 1)
[1391696100000, 14],
[1391695200000, 5],
// etc...
]
The 'candlestick'
type is a bit different, in that it expects 4 values at the offset, e.g. with dataOffset: 1
:
[
[1391697000000, 23, 25, 12, 20], // timestamp, open, high, low, close (offsets 0, 1, 2, 3, 4)
[1391696100000, 20, 21, 10, 14],
[1391695200000, 14, 20, 5, 7],
// etc...
]
The yAxis-option specifies which y-axis to use (if multiple y-axes are defined, as explained in a later section).
The xaxis-option can be used to customize the format of the x-axis:
xAxis: {
name: 'DATE',
months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
dataOffset: 0,
// ...
labels: {
// ...
format: 'date',
},
}
The name-option is used to set the name of the axis while the months-option defines a list of months (for translation-purposes). As with data series, the dataOffset-option specifies the location of x-values in the data array.
The default format for the x-axis is 'date'
, which is currently the only supported value.
Several y-axes can be defined in the yAxis-option, e.g.:
yAxis: [{
height: 3,
}, {
height: 2,
format: { fixed: 2 },
}]
The above example will result in two chart-areas within the chart sharing the same x-axis. The height of the first area will be 60% (3/5) of the total height, while the height of the second area will be 40% (2/5) of the total height.
Each y-axis inherits its options from $.fn.jqCandlestick.defaults.yAxisDefaults
which contains the following:
yAxisDefaults: {
height: 1,
// ...
labels: {
// ...
format: null, // possible values: a function(x) or an object {fixed: y) where y is number of decimals
},
}
The height-option defines the height of the axis as the numerator of the fraction height / total_height
where the total height is the sum of all height-options. E.g. in the above example the total height is 3 + 2 = 5
.
The format of the labels of the y-axis can be defined using the labels.format-option. The default is null
which means that the raw numbers will be printed. It is possible to print the number with a specific number of decimals by setting format: { fixed: n }
, where n
is the number of decimals. It is also possible to define a custom formatting function such as format: function(x) { return Math.round(x); }
.
There are two built-in themes available: 'light'
and 'dark'
, optimized for white and black backgrounds respectively. The built-in themes are defined in $.fn.jqCandlestick.themes
.
Colors, fonts and spacings can also be changed manually. The following options are available for customizing the appearance of charts:
{
theme: 'light', // imports default colors from a theme defined in $.fn.jqCandlestick.themes
font: '8pt sans-serif', // default font for all text
padding: { // distances between the boundaries of the chart-container and the chart itself
top: 0,
left: 10,
bottom: 0,
right: 0,
},
plot: {
spacing: 5, // vertical space between chart areas
padding: { // distances between plot area and axes
top: 0,
left: 15,
bottom: 0,
right: 15,
},
},
xAxis: {
color: '#333', // color of x-axis
strokeWidth: 1.0, // width x-axis
tickSize: 5, // length of each tick (can be negative)
labels: {
font: null, // font to use for labels
color: '#999', // color for labels
},
},
yAxisDefaults: {
color: '#222', // default color of y-axes
strokeWidth: 1.0, // default width of y-axes
tickDistance: 40, // minimum distance between ticks
labels: {
font: null, // font for labels
color: '#999', // color for labels
},
},
seriesDefaults: {
color: '#fff', // default color for series
},
info: {
color: '#999', // color for info
font: null, // font
spacing: 20, // distance between values
position: 'left', // 'left', 'right' or 'auto'
wrap: 'auto', // 'auto', 'yes' or 'no'
},
cross: {
color: 'rgba(255, 255, 255, 0.5)', // color of cursor-cross
strokeWidth: 1.0, // width cursor-cross lines
text: {
background: '#000', // background color for text
font: null, // font for text
color: '#999', // color for text
},
},
containerClass: 'jqcandlestick-container', // class for chart container
chartCanvasAttrs: { // additional attributes to add to chart canvas element
class: 'jqcandlestick-canvas',
},
crossCanvasAttrs: { // additional attributes to add to cross canvas element
class: 'jqcandlestick-canvas',
},
}
Each series type has additional options available:
Series with type: 'point'
has the following additional options:
{
radius: 3, // Radius of points
stroke: null, // Color of stroke (null for no stroke)
strokeWidth: 2.0, // Width of stroke
}
Series with type: 'line'
has the following additional options:
{
strokeWidth: 2.0, // Width of line
}
Series with type: 'column'
has the following additional options:
{
width: 5, // Width of each bar/column
stroke: null, // Color of stroke (null for no stroke)
strokeWidth: 1.0, // Width of stroke
}
Series with type: 'candlestick
' has the following addtional options:
{
names: ['OPEN', 'HIGH', 'LOW', 'CLOSE'], // Value names
width: 5, // Width of each candlestick
downColor: null, // Color of decreasing candlestick
downStroke: null, // Stroke color of decreasing candlestick
downStrokeWidth: 1.0, // Stroke width of decreasing candlestick
upColor: null, // Color of increasing candlestick
upStroke: null, // Stroke color of increasing candlestick
upStrokeWidth: 1.0, // Stroke width of increasing candlestick
}
Currently jqCandlestick only has support for 4 different types of series. You can manually add custom types to the $.fn.jqCandlestick.types
-object. As an example, the 'point'
-type is defined as:
point: {
dataSize: 1, // defines expected number of values in data-array (would be 4 for candlestick)
radius: 3, // additional options (default values)
stroke: null, // ...
strokeWidth: 2.0, // ...
// The draw function is called in order to draw a data series of this type.
// It takes the following parameters:
// ctx - Canvas context for drawing
// settings - The entire settings object
// plot - An object containing some information about the plot area, such as:
// min, max - minimum and maximum values for plot area
// minY, maxY - top and bottom of plot area
// series - series settings
// data - entire data array
// getX - a function, getX(value), that returns the x-value in pixels for a given value
// getY - a function, getY(plot, value), that returns the y-value in pxiels for a given plot area and value
draw: function(ctx, settings, plot, series, data, getX, getY) {
ctx.fillStyle = series.color;
ctx.lineWidth = series.strokeWidth;
// Iterate over each row in the dataset
data.forEach(function(row) {
// Find x- and y-values using the provided functions
var x = getX(row[settings.xAxis.dataOffset]); // x-axis data offset from settings
var y = getY(plot, row[series.dataOffset]); // series data offset from settings
ctx.beginPath();
// Draw circle
ctx.arc(x, y, series.radius, 0, Math.PI * 2, true);
ctx.fill();
// Draw stroke if set
if (series.stroke) {
ctx.strokeStyle = series.stroke;
ctx.lineWidth = series.strokeWidth;
ctx.stroke();
}
});
},
},