Line chart API reference
Line chart
, there isn't an option to have a scale on the x-axis
.
For this, you'll need a Scatter chart
with
the line
option set to true. You can either use labels across
the x-axis
, an x-scale
or you can
also use the X-axis drawing object.
- Example
- Properties
- Methods
- Errorbars
- Combining the Line and Bar charts
- Alternative colors
- Accumulative filled Line charts
- Custom tickmarks
- The coordinates properties
- The __index2__ property on tooltips
- Note about the data_arr array
- How to make trendline/dual-color Line charts
- Events
- Effects
Example
<script> data = [ [8,7,6,4,9,5,6,7,9], [1,3,4,2,5,0,3,1,1] ]; xaxisLabels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep']; // // Configure and make the first draw of the Line chart // myLine = new RGraph.Line({ id: 'cvs', data: data, options: { tooltips: '%{key}', tooltipsFormattedUnitsPost: '%', tooltipsFormattedKeyColors: ['red','blue','#0f0'], tooltipsFormattedKeyLabels: ['John','Richard','Luis'], tooltipsCss: { fontSize: '16pt', textAlign: 'left' }, backgroundGridVlines: false, backgroundGridBorder: false, colors: ['red','blue','green'], linewidth: 2, spline: true, tickmarksStyle: 'dot', tickmarksSize: 6, xaxisLabels: xaxisLabels, xaxis: false, yaxis: false, marginLeft: 40, marginInner: 15, shadow: false, labelsAbove: true, labelsAboveSize: 10, labelsAboveUnitsPost: '%', labelsAboveOffsety: -5, textSize: 16 } }).draw(); // // This function switches the dataset. It uses the reverse: // option of the trace() and wave() effects to hide the // lines, switches the data and then animates the lines // back in // function change () { var butChange = document.getElementById('changeData'); // Because this is a composite animation - turn // off the labelsAbove option ourselves myLine.set('labelsAbove', false); // If the chart is currently animating - don't do // anything if (!myLine.animating) { myLine.animating = true; butChange.disabled = true; butChange.style.cursor = 'default'; // Call the reverse wave() function myLine.trace({frames: 75, reverse: true}) .wave({frames: 90, reverse: true}, function () { // Change the data myLine.original_data = [ RGraph.arrayRandom(9, 0, 10), RGraph.arrayRandom(9, 0, 10) ]; // Show the new data by animating with the // wave() effect setTimeout(function () { myLine.trace({frames: 90}) myLine.wave({frames: 150}, function () { myLine.animating = false; butChange.disabled = false; butChange.style.cursor = 'pointer'; // Re-enable labelsAbove myLine.set('labelsAbove', true); RGraph.redraw(); }); }, 500); }); } } </script>
Properties
You can use these properties to control how the chart appears. You can set them by including them in the options section of the configuration as shown above.
- Background properties
- X-axis properties
- Y-axis properties
- Labels and text properties
- Margin properties
- Colors properties
- Shadow properties
- Interactive features properties
- Title properties
- Trendline properties
- Null value properties
- Key properties
- Miscellaneous properties
Background properties
array
of information stipulating horizontal colored bars. You can use these to indicate limits. Eg: obj.set('backgroundHbars', [[75, 10, 'yellow'], [85, 15, 'red']]);
This would give you two bars, one red and a lower yellow bar. The units correspond to your scale and are the starting point and the height.marginInner
set then the alignment will be thrown out.true
.true
. This takes precedence over dashed lines.array
to this property. It should be an array
of two or more numbers that specifies the size of dashes and gaps like this: [5, 10]draw
event may mean that the event fires twice. There is a property that you can check though that is set when the image has loaded: obj.__rgraph_background_image_loaded__
Simply check this flag in your draw
event. If it's true then the background image has loaded.canvas
with many charts - you may need to specify this.canvas
with many charts - you may need to specify this.top left
bottom right
bottom
right
linewidth
of the border that goes around the chart area.array
of two or more elements that specify the dashes and spaces - for example: backgroundBorderDashArray: [5,10],
X-axis properties
x-axis
is positioned. If you wish to show negative values then you should set this to center
or you can now (Jul 2016) use an offset x-axis
by leaving this property at the default bottom
and using the yaxisScaleMax
and yaxisScaleMin
properties.linewidth
used for the x-axis
and the x-axis
tickmarks.x-axis
.array
of the labels to be used on the chart. You can also give this option a string if you prefer and use formatted labels.%{value_formatted}
macro.%{value_formatted}
macro.%{value_formatted}
macro.%{value_formatted}
macro.%{value_formatted}
macro.x-axis
labels. For example, you could set this to 45 to get angled labels.section
for most chart types and edge
for Line charts
. You probably won't need to change this.css
class to the x-axis
labels which you can then use for styling purposes or to make retrieving the span
tags easier (the dom
elements). If you inspect the labels in your browser's javascript
console (you will first need to enable the textAccessiblePointerevents
property) you will be able to see the other css
classes that are assigned to the labels.[none]
x-axis
title.x-axis
title.x-axis
title is bold or not.x-axis
title is italic or not.x-axis
title.Y-axis properties
y-axis
tickmarks there are.x-axis
position warrants it)x-axis
position warrants it)y-axis
labels (eg ['Low', 'Medium', 'High']
. Note: Since March 2013 you may now need to add an extra (optionally) empty element to the array
of labels to achieve your desired result.y-axis
. It does not affect a scale.y-axis
title.y-axis
title.y-axis
title is bold or not.y-axis
title is italic or not.y-axis
title.y-axis
titles X coordinate.y-axis
titles Y coordinate.y-axis
title.y-axis
title.y-axis
title is accessible or not.y-axis
is measured in. This string is displayed before the actual number, allowing you to specify values such as $50
.y-axis
is measured in. This string is displayed after the actual number, allowing you to specify values such as 50ms
.function myFormatter(opt) { var num = Number(opt.number) * 5; return String(num) } obj.set('yaxisScaleFormatter', myFormatter);
Labels and text properties
labelsAbove
labels are bold or not.textBold
setting)labelsAbove
labels are italic or not.textItalic
setting)textColor
settingarray
of (text) labels that you want to appear above the line instead of the values.labelsAboveFormatter: function (opt) { var obj = opt.object, value = opt.value, index = opt.index, dataset = opt.dataset; return value; }
array
of labels for the chart that are drawn "inside" the chart. If you have 5 data points then this should have a corresponding number of elements, though there is a shorthand available.dom
text in place of canvas
text. It makes for a much higher quality text that you can also select if desired (for copy/paste operations). It won't fit all situations and you can read more about the DOM text feature here. A good way to control borders/margins/padding etc is not to set them on the canvas
but to wrap the canvas
in a div
and set them on that like this:
<div style="margin-left: 50px; display: inline-block"> <canvas id="cvs" width="650" height="250"></canvas> </div>
visible
or hidden
and it controls whether the text is clipped to the edges of the canvas
. It defaults to be visible and means you can set small margins if you wish.dom
text responds to mouse-based events or not (it sets the pointer-events
css
property to none
).text*
text styles. The property should be an array
that contains three strings - the label for up, the label for down and the label for level, like this: labelsAngled: ["Up label", "Down label", "Level label"]
However, if you're also setting the labelsAngledSpecific
property then this can simply be set to true.labelsAngled
property can be just set to true
.labelsAbove
labels should be drawn using accessible text (the default) or by using native canvas
text. When the chart has the adjustable
property enabled the labelsAngled
labels are always drawn using native canvas
text.labelsAngled
labels. If not specified this falls back to the textFont
property. labelsAngled
labels. If not specified this falls back to the textColor
property. labelsAngled
labels. If not specified this falls back to the textSize
property. labelsAbove
labels are bold or not. If not specified this falls back to the textBold
property. labelsAbove
labels are italic or not. If not specified this falls back to the textItalic
property.labelsAngled
labels that have an upward direction. If not specified this falls back to the labelsAngledFont
property. labelsAngled
labels that have an upward direction. If not specified this falls back to the labelsAngledColor
property. labelsAngled
labels that have an upward direction. If not specified this falls back to the labelsAngledSize
property. labelsAbove
labels are bold or not when the labels have an upward direction. If not specified this falls back to the labelsAngledBold
property. labelsAbove
labels are italic or not when the labels have an upward direction. If not specified this falls back to the labelsAngledItalic
property. labelsAngled
labels that have a downward direction. If not specified this falls back to the labelsAngledFont
property. labelsAngled
labels that have a downward direction. If not specified this falls back to the labelsAngledColor
property. labelsAngled
labels that have a downward direction. If not specified this falls back to the labelsAngledSize
property. labelsAbove
labels are bold or not when the labels have a downward direction. If not specified this falls back to the labelsAngledBold
property. labelsAbove
labels are italic or not when the labels have a downward direction. If not specified this falls back to the labelsAngledItalic
property. labelsAngled
labels that are level (not upward and not downward). If not specified this falls back to the labelsAngledFont
property. labelsAngled
labels that are level (not upward and not downward). If not specified this falls back to the labelsAngledColor
property. labelsAngled
labels that are level (not upward and not downward). If not specified this falls back to the labelsAngledSize
property. labelsAbove
labels are bold or not when the labels are level (not upward and not downward). If not specified this falls back to the labelsAngledBold
property. labelsAbove
labels are italic or not when the labels are level (not upward and not downward). If not specified this falls back to the labelsAngledItalic
property. Margin properties
Color properties
array
of line colors.Note: When showing multiple lines the values are additive by default. This means that if you have two lines they will be "stacked" on top of each other. If this is not the desired behaviour then you can set the option below to
false
.array
of colors that filled Line charts
will use.Important: This used to be a string, and still can be, but can now also be an array.
false
to have them drawn "non-accumulatively".Note: If you use fully opaque colors in conjunction with this option set to false it's feasible that you might not see one or more of the lines or parts of the line. If you want to see all of the lines you should leave this option set to its default
true
setting. You can see an example of this setting here.array
that defines the colors when using a dual-color range chart. There's an example of the dual-color range chart in the download archive (line-dual-color-range.html
).Shadow properties
Interactive features properties
array
of tooltips that are shown when a bar is clicked. These can contain html
.slide
fade
or none
.true
to get this behaviour. Keep in mind that if you have a lot of bars/segments/points/etc then it's possible for the chart to become quite crowded. If you need to subsequently clear all of the tooltips there's an api
function available to do that for you and it's called: RGraph.tooltip.persistent.clear()
If you want to access any (or all) of the tooltip div
tags then you can do so using the RGraph.tooltip.persistent
object. This option works when you have the tooltipsEvent
property set to mousemove
pie-tooltipshotspotignore.html
. You can use the transparent
color to allow the rear chart to be seen in such a case. It can be:
- A single
boolean
value (ietrue
orfalse
) to enable or disable all of the hotspots -true
means the hotspot will be ignored - A single number (the zero-indexed number corresponding to the hotspot to ignore)
- An
array
of numbers (the numbers are the indexes of hotspots to ignore) - An
array
ofboolean
true
orfalse
values - the position of these values correspond to the index(es) of the segments to ignore (for example[false, false, true, false, false]
-true
means the corresponding hotspot will be ignored)
%{value_formatted}
option.%{value_formatted}
option.%{value_formatted}
option.%{value_formatted}
option.%{value_formatted}
option.%{key}
option to use.square
or circle
css
values to the key color shape that appears in the tooltip key. Note the property name is "color" and not "colors" like previous properties. It should be an object of css
properties like this: tooltipsFormattedKeyColorsCss : { border: "1px solid #ddd"; }
ul
and ol
.array
of the list items that are to be shown for all of the tooltips. An example of this property is:tooltipsFormattedListItems: [ ['Bill','Jerry','Berty'], // First tooltip ['Gill','Carrie','Lucy'], // Second tooltip ['Pob','Nobby','Hilda'] // Third tooltip ]You can use
css
to style this list - for example:.RGraph_tooltip ul#rgraph_formatted_tooltips_list li { text-align: left; color: yellow; }
array
of headers for the table. These are added to the tooltip using th
tags.array
so it's easy to make a mistake. See the example, copy the code from it and then modify it suit. You'll create fewer bugs this way.css
values applied to the tooltips pointer (a css
border, for example) then specify an object containing those values to this property. For example: tooltipsPointerCss: { borderLeft: 'gray 2px solid', borderBottom: 'gray 2px solid' }
false
tooltips are positioned next to the mouse pointer.css
that gets applied to all of the tooltips, but don't want to use the RGraph.tooltips.style
object (which gets applied to all of the tooltips on the page for every chart) you can use this property to give some per-object css
for the tooltips. These are css
styles that get applied to all of the tooltips for the specific object only. It should look like this:tooltipsCss: { fontFamily: 'Verdana', fontSize: '20pt' }
css
class the chart uses.array
of one tooltip per line (you can also set this to a string and use tooltip templates - the demo in the download archive shows this). So if you have four lines you can set this to an array
of four strings - one for each line. You can click anywhere on the line to see it. There's a demo in the download archive called line-tooltips-dataset.html
If you have multiple lines on your chart and want to get the index of the dataset that has been clicked, you can do so with the property obj.tooltipsDatasetIndex
- this is also shown in the demo in the download archive.click
or mousemove
and determines which event causes the tooltip to be shown.true
the horizontal grid line will snap to the scale values.array
of context menu items. More information about context menus is here.false
, this determines whether your Line chart
will be adjustable.array
of values that determine whether a point is adjustable or not. A truthy
value for when it is, a falsey
value for when it's not.tooltipsHotspotSize
is used to determine the size of the touch hotspot. Due to how things work - only a single dataset is supported with one-touch adjusting.Title properties
textFont
setting is used (usually Arial
).4pt
bigger than the textSize
setting."-5"
- in which case it's converted to a number and added to the calculated coordinate - allowing you to adjust the calculated coordinate."-5"
- in which case it's converted to a number and added to the calculated coordinate - allowing you to adjust the calculated coordinate.marginTop
value.Trend line properties
array
of boolean values for when you have multiple datasets.array
of colors for the trend line(s).linewidth
of the trend line(s). It can be a single number or an array
of numbers if you have multiple datasets.array
of numbers if you have multiple datasets.true
then the trend lines on the chart will be dashed. It can be a single boolean or an array
of booleans if you have multiple datasets.true
then the trend lines on the chart will be dotted. It can be a single boolean or an array
of booleans if you have multiple datasets.array
containing numbers - alternating between the length of the dash and the length of the gap after the dash. It can also be an array
of these two value arrays, for when you have multiple trend lines on your chart and you want them to have different styles of dots/dashes. For example, you could set this property to: [ [5,5], [2,2] ]
Null value properties
null
values in your data.linewidth
of the null
value connector lines you can use this property. It should be a number. If left at the default null
value it will use the same linewidth
that the linewidth
property sets.Key properties
key properties are documented on the key documentation page.Miscellaneous properties
circle
filledcircle
endcircle
filledendcircle
square
endsquare
filledsquare
filledendsquare
diamond
enddiamond
filleddiamond
filledenddiamond
tick
halftick
endtick
cross
dot
borderedcircle
(same asdot
)arrow
filledarrow
triangle
filledtriangle
Note that arrow
and filledarrow
look better with a thinner (1 or 2) linewidth
setting.
Also note that as well as a string, this can be an array
of different tickmark styles.
This can be a function in case you want to draw your own style of tickmark or, as in the example shown here, to only draw certain tickmarks. The function shown below only draws every other tickmark (which may be useful on smaller displays).
// Add a custom tickmark - just a regular circle // but only drawn on every second point tickmarksStyle: function (obj, dataset, value, index, x, y, color, prevX, prevY) { if (index % 2 === 0) { obj.path( "b a % % % % % false f red", x, y, 7, 0, 6.29 ); } }
As of August 2014, this can be a location/URL of an image file to use as the tickmarks or a data: URL. See below for details.
null
then it will default to the same color as the line.dot
/borderedcircle
style tickmarks.dot
/borderedcircle
style tickmarks.left
right
or center
and determines the horizontal alignment of the tickmark.top
bottom
or center
and determines the vertical alignment of the tickmark.context.lineCap
setting. It can be butt
round
or square
This can also be an array
of those strings for when you have multiple lines on your chart and you want different styles for each. NB When the linejoin
property is set to bevel
you will need to set this to butt
.context.lineJoin
setting. It can be bevel
round
or miter
This can also be an array
of those strings for when you have multiple lines on your chart and you want different styles for each.unfold
Line chart
animation and dictates whether the X value is unfolded.unfold
Line chart
animation and dictates whether the Y value is unfolded.unfold
animation. Setting this to a value less than one will cause the line to expand outwards, whilst a value greater than one will cause the line to contract towards the correct values.null
but you can set it to a function if you wish so that function is called to do the chart highlighting. It's passed the shape object as an argument. As of June 2016, you can also set this to halo
to get a new style of highlighting. As of version 5.23 you can also set this to invert
. If you do this on a dark background you may find that you need to change the highlightFill
color setting as well.line-highlight-dataset1.html
line-highlight-dataset2.html
line-highlight-dataset3.html
line-highlight-dataset4.html
line-highlight-dataset5.html
line-highlight-dataset6.html
line-highlight-dataset7.html
line-nvd.html
line-nvd-single-object.html
array
of colors for when you have multiple datasets and want to use a different highlight for each one.array
of colors for when you have multiple datasets and want to use a different highlight for each one.true
in order to use the same colors as the colors
property.true
in order to use the same colors as the colors
property.alpha
value (the opacity
) for the stroke color.alpha
value (the opacity
) for the fill color.linewidth
of the highlight stroke. By default this will match the linewidth
of the line.array
of two numbers it will be used as the linedash
setting.dataset
- which is the index of the dataset that has been clicked.array
of numbers.click
but can also be mousemove
.spline
- ie curvy. Not all options will work with the spline
option - however, the introduction of real spline
curves over the previous curvy
option is a significant improvement. There are numerous examples of this in the demos that are included in the download file. null
values will not work with the spline
option.canvas
.grow
) and the CombinedChart
object will use that effect to draw the chart instead of the regular draw
function.javascript
object of options for the effect function like this: combinedchartEffectOptions: '{frames: 300}'It has to be a string because of a quirk of the option parsing system.
true
you can change this behaviour.outofbounds
option but you're not interested in seeing the bits which fall outside of the chart area (eg in the margins) then you can enable this option. There's a demo of the outofboundsClip option in the download archive (line-overflow-clipped.html
).array
of objects and each object can consist of the
following:
- value: The value you want the line positioned at or the keyword average (default: average)
- color: The color of the line (default: #666)
- dashed: Whether the line is dashed or not (default: true)
- dotted: Whether the line is dotted or not (default: false)
- linewidth: The
linewidth
of the line (default: 1) - label: this is The label that appears above (by default) the line. If you don't want a label you can set this to an empty string. default: Average (%{value})
- labelPosition: This can be a string that consists of the following keywords: left/center/right/left-margin/right-margin top/bottom (default: top right)
- labelFont: The font that the label is drawn in (default: [the same as the textFont property])
- labelColor: The color that the label is drawn in (default: #666)
- labelSize: The size of the label (in points) (default: 4 points less than the textSize setting)
- labelBold: Whether the label is bold or not (default: null [falls back to the textBold setting])
- labelItalic: Whether the label is italic or not (default: null [falls back to the textItalic setting])
- labelValueDecimals: How many decimals are shown on the number. (default: 2)
- labelValuePoint: The character used as the decimal point. (default: .)
- labelValueThousand: The character used as the thousand separator charactor.(default: ,)
- labelValueUnitsPre: This string is prended to the number. (default: [an empty string])
- labelValueUnitsPost: This string is appended to the number. (default: [an empty string])
- labelOffsetx: The horizontal offset that's applied to the X coordinate. (default: 0)
- labelOffsety: The vertical offset that's applied to the Y coordinate. (default: 0)
- labelValueFormatter: This function handles ALL of the formatting of the number. (default: null)
obj.set('horizontalLines', [ { value: 'average', dashed: true, labelPosition:'left bottom' }, { value: 10.48, label:'Value (%{value})', labelValueDecimals: 2, labelValueThousand: ',', labelValuePoint:'.', labelValueUnitsPre:'', labelValueUnitsPost:'' //labelValueFormatter: function (opt) //{ // return opt.number; //} } ]);
Methods
obj.get(name)
An accessor that you can use to retrieve the values of properties.
obj.set(name, value)
An accessor that you can use to set the values of properties.
obj.getShape(event)
This method makes it easy to get hold of which point has been clicked on or hovered over. It returns an object which has the following indexes available:
object |
The chart object |
x |
This is the X coordinate for the point. |
y |
This is the Y coordinate for the point. |
dataset |
The zero-indexed dataset index that the point belongs to.
|
index |
The zero-indexed index of the point in the particular dataset. |
sequentialIndex |
The sequentialIndex is the zero-indexed sequential index of the point across all of
the datasets.
|
tooltip |
If a tooltip is associated with this point this will be it.id:
strings are expanded for you (where the tooltip text is retrieved from the html
tag with the matching ID).
|
<script> line.canvas.onclick = function (e) { RGraph.redraw(); var canvas = e.target, obj = canvas.__object__, shape = obj.getShape(e); if (shape) { var x = shape.x, y = shape.y; obj.path( 'b a % % 5 0 6.28 false s black f red', x, y ); } } </script>
obj.getValue(mixed)
This method can be used to get the value at a particular point or at the
mouse coordinates based on the scale that is in use -
not simply the coordinates of the mouse. The argument can either be an event
object (for use in event listener functions) or a two-element
array
consisting of the X and Y coordinates (ie when you're not
in an event listener). It returns null
if the mouse
or coordinates are in the margin areas. An example:
line.canvas.onclick = function (e)
{
var obj = e.target.__object__;
var value = obj.getValue(e);
// ...
}
obj.getYCoord(value)
This method can be used to get an appropriate Y coordinate for a value when you're doing custom drawing on the chart. It returns the coordinate for the maximum/minimum value if the given number is out of range.
obj.closest(event)
obj.closest({event: event, tolerance: 25})
obj.closest({event: event, tolerance: 25, xonly: false})
This method returns an object containing the
dataset
and index
of
the first point that it comes across thats within
the tolerance
distance from the mouse click.
You can pass
it either the event object or a custom object
containing the indexes: event
(the event
object), tolerance
(the allowable
distance from a point that you want to permit)
and xonly
which is whether you want
to only consider the X
coordinate when calculating the closest point (it
defaults to false
).
obj.growPoint(index, value)
This method animates a single point to the given value.
It doesn't take a dataset
due to the nature
of the how the function works - only the first dataset
is accommodated. There's a demo of this function being
used to implement a touch-device-friendly version of an
adjustable line in
the download archive
called line-adjustable-onetouch.html
.
obj.on(event, function)
This method can be used to set an event listener on an object. It
operates similarly to the jquery
on
function.
The first argument is the event that you wish to attach to and the
second is the handler function. For example:
obj.on('draw', function (obj)
{
// Put your event code here
});
obj.exec(function)
The exec function is documented here.
obj.responsive(configuration)
The responsive
function helps your charts
respond to different browser window sizes and screen
resolutions. For example, for smaller screens, you
might want to have angled labels or show shorter
versions of them completely.
Update: There is now the responsive configuration option available to you and this is now the preferred method of configuration.
The responsive function and configuration option are documented on their own page here.
obj.hide([index])
The hide function hides a line by setting the color to rgba(0,0,0,0)
.
Tooltips and other interactive features still work even though the line
is not visible. You can give an integer (the index of the relevant
line), an array
of line indexes, or no argument at all in which case all
of the lines on the chart are hidden
obj.show([index])
This function is the reverse of the above.
obj.hidden(index)
This function returns true or false as to whether the given line index is hidden or not.
obj.over(x, y)
This function returns whether the cursor is over one of
the lines that is drawn on the chart. If there is a line
being hovered over you'll get back an object containing
the index of that line
(the indexing begins at zero remember). There's also an easy
way to add highlighting - the highlightDataset
properties which are detailed above in
the Miscellaneous section.
obj.highlightDataset(opt)
If you want to programmatically highlight one of your
datasets then you can do so using this function. It
takes an object
of options as its only argument and that
object can look like this:
line.highlightDataset({
dataset: 1, // Required
stroke: 'red',
fill: '#fcc',
linewidth: 4,
linedash: [10,10]
});
The only required option to the function is the
zero-indexed dataset:
which naturally
has to be given to highlight the correct dataset. Other
options are optional.
Errorbars
Errorbars can allow you to show an upper and lower range for a particular point like the example page line-errorbars.html in the download archive shows. You can specify errorbars like this:
var line = new RGraph.Line({
id: 'cvs',
data: [12,18,10,8,5,4,3,2,14,5,6,9],
options: {
yaxisScaleMin: 5,
errorbars: [1, [1,5],[5,1,'red',10],3,3,3,3,3,3,3,3,3,3],
//errorbarsLinewidth: 10,
//errorbarsColor: 'red',
//errorbarsCapped: false,
//errorbarsCappedWidth: 50,
marginInner: 15,
tickmarksStyle: 'circle',
xaxis: false
}
}).draw();
This would give you errorbars for each point and the elements of each
errorbar array
are (each one is optional - specify null
if you want to
give no value):
- The upper extent of the errorbar
- The lower extent of the errorbar
- The color of this errorbar
- The
linewidth
of this errorbar - The (total) width of the cap at the end of this errorbar
Combining the Line and Bar charts
You can combine the Bar charts
and Line charts
.
Find out more here.
In the same vein, you can have Y axes on both the left and right sides.
Alternative colors
Instead of a string stipulating the color, each element of the colors
array
can be a two element array
stipulating the up color, and the down color. To use alternating colors
you must also stipulate the alternate property:
myLine.set('colors.alternate', true); myLine.set('colors', ['red', ['blue', 'yellow'], 'green]);
Accumulative filled Line charts
The default behaviour of filled Line charts
is to "stack" the lines on
top of each other. This allows them all
to be totally visible, no matter what (unless a line has a zero value of
course). If this is not desired, then there is an
option (filledAccumulative
- true
or false
) to change this
behaviour so that the lines are plotted "as-is".
Keep in mind that if you set this option to false
(ie the Lines are
plotted as-is) it may be wiser to use
semi-transparent colors or some parts of data sets (or even entire data
sets) may be hidden by others. There's a
comparison of the different modes here.
Custom tickmarks
If none of the available tickmark styles are suitable, you can instead specify a function object that draws the tickmark, enabling you to make the tickmark yourself. For example:
<script> line.set('tickmarksStyle', myTick); // // The function that is called once per tickmark, to draw it // // @param object obj The chart object // @param array data The entire line data // @param number value The individual point's value // @param number index The current index in the data array // @param number x The X coordinate // @param number y The Y coordinate // @param string color The color of the line // @param number prevX The previous X coordinate // @param number prevY The previous Y coordinate // function myTick (obj, data, value, index, x, y, color, prevX, prevY) { // Draw your custom tickmark here } </script>
As of August 2014 you can also specify an image to use as a tickmark. Various styles of URL are supported:
obj.set({tickmarksStyle: 'image:foo.png'}); // Starts with image: prefix obj.set({tickmarksStyle: '/images/foo.png'}); // Starts with a / obj.set({tickmarksStyle: '../images/foo.png'}); // Starts with ../ obj.set({tickmarksStyle: 'data: ...'}); // Starts with data: (for inline images) obj.set({tickmarksStyle: 'images/foo.png'}); // Starts with images/
The coordinates properties
As with the majority of the RGraph objects the
coordinates of the various shapes are recorded and
stored in various properties on the RGraph chart object.
The Line chart
is no different and has
these properties available to you:
-
obj.coords
A straight-forward single dimensionarray
of all of the coordinates of all of the points that are drawn on the chart.
-
obj.coords2
A multi-dimensionalarray
that indexes the coordinates slightly differently to theobj.coords
array
. With thisarray
the coordinates are grouped by dataset. So the first three points of the Line would be stored as:obj.coords2[0]
// First datasets coordinatesobj.coords2[0][0]
// First point on the first datasetobj.coords2[0][0][0]
// X coordinate of the first point on the first datasetobj.coords2[0][0][1]
// Y coordinate of the first point on the first datasetobj.coords2[1]
// Second datasets coordinatesobj.coords2[1][0]
// First point on the second datasetobj.coords2[1][0][0]
// X coordinate of the first point on the second datasetobj.coords2[1][0][1]
// Y coordinate of the first point on the second dataset
-
obj.coordsSpline
If you've configured your line to be aspline
then this holds all of the coordinates that make it up. This is a multi-dimensionalarray
- onearray
for each line that's drawn on the chart. Similar to the above property, the coordinates for three points on aspline
would look like this:obj.coordsSpline[0]
(all of the coordinates of the firstspline
)obj.coordsSpline[0][0]
(thex
andy
coordinates of the first point on the firstspline
)obj.coordsSpline[0][0][0]
(thex
coordinate of the first point on the firstspline
)obj.coordsSpline[0][0][1]
(they
coordinate of the first point on the firstspline
)obj.coordsSpline[0][1][0]
(thex
coordinate of the second point on the firstspline
)obj.coordsSpline[0][1][1]
(they
coordinate of the second point on the firstspline
)obj.coordsSpline[0][2][0]
(thex
coordinate of the third point on the firstspline
)obj.coordsSpline[0][2][1]
(they
coordinate of the third point on the firstspline
)obj.coordsSpline[1]
(all of the coordinates of the secondspline
)obj.coordsSpline[1][0]
(thex
andy
coordinates of the first point on the secondspline
)obj.coordsSpline[1][0][0]
(thex
coordinate of the first point on the secondspline
)obj.coordsSpline[1][0][1]
(they
coordinate of the first point on the secondspline
)obj.coordsSpline[1][1][0]
(thex
coordinate of the second point on the secondspline
)obj.coordsSpline[1][1][1]
(they
coordinate of the second point on the secondspline
)obj.coordsSpline[1][2][0]
(thex
coordinate of the third point on the secondspline
)obj.coordsSpline[1][2][1]
(they
coordinate of the third point on the secondspline
)
spline
is made up of many points in order to appear curved - so if you want just the coordinates of the points that represent the values you should use either theobj.coords
orobj.coords2
variables instead.
-
obj.coordsText
This holds the coordinates of all of the text that has been added to the chart. Even if the text is blank (ie no text) then the coordinates will be added to this variable.
The __index2__ property on tooltips
When showing tooltips, one property of the tooltip is __index2__
. This is the index that pertains to the
individual dataset. In a function called from the tooltip
event you can access it like this:
function myFunc (obj) { var idx = RGraph.Registry.get('tooltip').__index2__; } RGraph.addCustomEventListener(obj, 'ontooltip', myFunc );
Note about the data_arr array
Sometimes you may wish to view your data as one big array, instead of onearray
per dataset. In this case, the
obj.data_arr
is available. This is one long array
containing all of
the individual data points.
How to make trendline/dual-color Line charts
This type of chart has been made far easier thanks to
the clip
property which was introduced in version 6.17
It was perfectly possible before this feature was
introduced - it's just been made easier. Also, it's made
easy to implement because all of the necessary
configuration is hidden away in a new function which
does the hard parts for you. Here's some example code
for the canvas
Line chart
.
You can see this code in the download archive in a demo
called line-trendline-dual-color.html
<script> // Data for the Line chart data = [1,3,2,5,4,4,7,8,8,6,7,9]; // Configuration options that are given to both Line charts options = { trendline: true, trendlineMargin: 15, trendlineDashed: true, xaxisLabels: RGraph.MONTHS_SHORT, linewidth: 1, spline: true, shadow: false, marginInner: 25, tickmarksStyle: 'cross', tickmarksStyle: 'dot', tickmarksSize: 6, backgroundGridVlines: false, backgroundGridBorder: false, backgroundColor: 'white', xaxisLinewidth: 2, yaxisLinewidth: 2, xaxisTickmarksLength: 5, yaxisTickmarksLength: 5, yaxisTickmarksLastBottom: true, xaxisTickmarksLastLeft: true, textSize: 16, colors: ['black'] }; // // This is all the code that's necessary to produce the // dual-color Line chart // [line1, line2] = RGraph.Line.dualColorTrendline({ id: 'cvs', data: data, options: options, // The configuration options for both of the charts optionsTop: {colors: ['black']}, // Configuration options for just the top chart optionsBottom: {colors: ['red']}, // Configuration options for just the bottom chart animationEffect: 'trace', // The animation effect to use (for both charts) animationEffectOptions: {frames: 60}, // Any options to give to the animation effect animationEffectCallback: function () {alert('Finished!');} // Optional callback function }); </script>
Events
RGraph supports custom events that allow you to easily add interactivity to your charts if required. The following events are available:
adjustbegin
This event fires at the start of adjusting - like the standardmousedown
event.adjust
This event fires (repeatedly) during adjusting - like the standardmousemove
event.adjustend
This event fires at the end of adjusting - like the standardmouseup
event.annotatebegin
This event fires at the start of annotating - like the standardmousedown
event.annotate
This event fires (repeatedly) during annotating - like the standardmousemove
event.annotateend
This event fires at the end of annotating - like the standardmouseup
event.annotateclear
This event fires at the end of theRGraph.clearAnnotations
function.beforeclear
This event fires at the start of theRGraph.clear
function.clear
This event fires at the end of theRGraph.clear
function.click
This is similar to the standardcanvas
click
event but this only fires when you click on a bar - not the wholecanvas
.crosshairs
This event fires when you have the crosshairs feature enabled and you move the mouse.beforecontextmenu
This event fires when you have the contextmenu enabled and it is about to appear.contextmenu
This event fires when you have the contextmenu enabled and it has been displayed.beforedraw
This event fires at the start of thedraw
method before anything has been done.firstdraw
This event fires at the end of thedraw
function - but only the first time that thedraw
function is called.draw
This event fires at the end of thedraw
function.beforeinteractivekey
When you're using the interactive key this event fires just before the key and chart are highlighted.afterinteractivekey
When you're using the interactive key this event fires just after the key and chart are highlighted.keyclick
This event fires when you click on the key - you don't have to be using the interactive key, however.mousemove
This event is similar to the standardmousemove
event but only fires when you move the mouse over a bar on the chart.mouseover
This event is similar to the standardmouseover
event but only fires when you move the mouse over a bar on the chart.mouseout
This event is similar to the standardmouseout
event but only fires when you move the mouse away from a bar on the chart that you've previously hovered over.beforetooltip
This event fires at the start of the tooltip showing process.tooltip
This event fires after a tooltip has been shown.beforebackground
This event fires before the background (grid, image, bars etc) has been drawn.background
This event fires after the background (grid, image, bars etc) has been drawn.
new RGraph.Line({ id: 'cvs', data: [4,8,6,3,5,8,9], options: { } }).on('draw', function (obj) { console.log('The draw event has fired'); }).draw();
Effects
These effects are available and can be used instead of thedraw
function. There are also generic effects available which
you can see here: Generic effects and transitions
There's a stopAnimation()
function that you can
use to stop an animation immediately if you need to.
There's a line chart demo called
demos/line-effects-stop-animation.html
in
the download archive
that demonstrates the use of this function.
- The
unfold
effect (effects-line-unfold.html
in the download archive) - The
unfoldfromcenter
effect (effects-line-unfoldfromcenter.html
in the download archive) - The
Unfoldfromcentertrace
effect (effects-line-unfoldfromcentertrace.html
in the download archive) - The
foldtocenter
effect (effects-line-foldtocenter.html
in the download archive) - The
trace
effect (effects-line-trace.html
in the download archive) - The
grow
effect (effects-line-grow.html
in the download archive) - The
wave
effect (effects-line-wave.html
in the download archive)
<script> // // Optional callback function that's called when the effect is complete // function myCallback (obj) { // ... } var obj = new RGraph.Line({ id: 'cvs', min: 0, max: 100, value: 56, options: { marginLeft: 35, marginInner: 5 } // All of these arguments are optional }).trace({frames: 60, reverse: false}, myCallback) // .grow({frames: 60}, myCallback) // .unfold({frames: 60}, myCallback) // .unfoldFromCenter({frames: 60}, myCallback) // .unfoldFromCenterTace({frames: 60}, myCallback) // .foldToCenter({frames: 60}, myCallback) // .trace({frames: 60}, myCallback) (shown in the example above) // .wave({frames: 60, reverse: false}, myCallback) (shown in the example above </script>
The growPoint() function
If you want to use adjusting on a touch-based device (eg a
tablet) then the default Line chart
adjusting won't work
because it really requires a mouse to function.
The obj.growPoint
function can therefore be
used to skirt this limitation and facilitate adjusting on
these devices. There follows some sample code for an
adjustable Line chart
that uses this function instead
of the built-in adjusting feature. You can also find a
demo in
the download archive
that employs this function.
<script>
line = new RGraph.Line({
id: "cvs",
data: [4,8,5,2,6,7,9,1,5,4,3,8],
options: {
xaxisLabels: ["Alf","Bob","Cal","Dug","Edd","Fay","Gof","Hal","Ind","Jay","Kev","Lou"],
textSize: 14,
spline: true,
xaxis: false,
yaxis: false,
backgroundGridBorder: false,
backgroundGridVlines: false,
marginInner: 10,
tickmarksStyle: "filledcircle",
tickmarksSize: 3,
shadow: false
}
}).draw();
line.canvas.onclick = function (e)
{
var indexes = line.closest({
event: e,
tolerance: 25, // Optional - defaults to 25
xonly: true // Optional - defaults to false
});
if (!indexes) {
return;
}
var value = line.getValue(e);
line.growPoint({
index: indexes.index,
value: value,
dataset: 0, // Optional - defaults to 0
frames: 15 // Optional - defaults to 15
});
}
</script>