A 2d function plotter powered by d3
Function Plot is a small library built on top of D3.js whose purpose is to render functions with little configuration (think of it as a little clone of Google's plotting utility: y = x * x
The library currently supports interactive line charts and scatterplots, whenever the graph scale is modified the function is evaluated again with the new bounds, result: infinite graphs!
Have a look at the homepage for a detailed explanation on what the library is capable of
$ npm install --save function-plot
var d3 = window.d3
var functionPlot = require('function-plot');
functionPlot({
// options below
})
All the available options are described in the homepage
var functionPlot = require('function-plot');
params, All the params are optional unless otherwise stated
options
options.target
{string} the selector of the parent element to render the graph tooptions.title
{string} If set the chart will have it as a title on the topoptions.xDomain
{array} domain of the linear scale (used in the x axis)options.yDomain
{array} domain of the linear scale (used in the y axis)options.xLabel
{string} x axis labeloptions.yLabel
{string} y axis labeloptions.disableZoom
{boolean} true to disable drag and zoom on the graphoptions.tip
{object} configuration passed tolib/tip
, it's the helper shown on mouseover on the closest function to the current mose positionoptions.tip.xLine
{boolean} true to show a line parallel to the X axis on mouseoveroptions.tip.yLine
{boolean} true to show a line parallel to the Y axis on mouseoveroptions.tip.renderer
{function} Function to be called to define custom rendering on mouseover, called with thex
andf(x)
of the function which is closest to the mouse position (args:x, y
)
options.annotations
{array} An array defining parallel lines to the y-axis or the x-axisoptions.annotations[i].x
{number} x-coordinate of the line parallel to the y-axisoptions.annotations[i].y
{number} y-coordinate of the line parallel to the x-axisoptions.annotations[i].text
{string} text shown next to the parallel line
options.data
{array} required An array defining the functions to be renderedoptions.data[i].title
{string} title of the functionoptions.data[i].skipTip
{boolean} true to avoid this function from being a target of the tipoptions.data[i].fn
required {string} the function that represents the curve, this function is evaluated with values which are inrange
limiting the values to the screen min/max coordinates forx
, i.e. at any given time the graph min/max x coordinates will limit the range of values to be plottedoptions.data[i].range
{number[]} if given the function will only be evaluated with multiple values from this rangeoptions.data[i].samples
{number} the fixed number of samples to be computed within the current domain endsoptions.data[i].implicit
{boolean} true to creates samples for the function considering it implicit, it assumes that the function depends on the variables x and yoptions.data[i].secants
{Object[]} Secants ofoptions.data[i].fn
options.data[i].secants[j].x0
{number} The abscissa of the first pointoptions.data[i].secants[j].x1
{number} (optional ifupdateOnMouseMove
is set) The abscissa of the second pointoptions.data[i].secants[j].updateOnMouseMove
{boolean} (optional) True to update the secant line by evaluatingoptions.data[i].fn
with the current mouse position (x0
is the fixed point andx1
is computed dynamically based on the current mouse position)
options.data[i].derivative
{Object} Info of the instantaneous rate of change of y with respect to xoptions.data[i].derivative.fn
{string} The derivative ofoptions.data[i].fn
options.data[i].derivative.x0
{number} The abscissa of the point which belongs to the curve represented byoptions.data[i].fn
whose tangent will be computed (i.e. the tangent line to the pointx0, fn(x0)
)options.data[i].derivative.updateOnMouseMove
{boolean} True to compute the tangent line by evaluatingoptions.data[i].derivative.fn
with the current mouse position (i.e. letx0
be the abscissa of the mouse position transformed to local coordinates, the tangent line to the pointx0, fn(x0)
)
options.data[i].graphOptions
{Object} options passed to the the files located inlib/type/
which plot the data generated by the library, the most useful property of this object istype
which is used to determine the type of graph to be rendered for a function
options
{Object}options.type
{string} type of graph, currentlyline
,scatter
andinterval
are supported,interval
is the default option
Depending on the type option:
options.closed
{boolean} True to close the path, for any segment of the closed area graphy0
will be 0 andy1
will bef(x)
instance.id
{string} equal tooptions.target
instance.linkedGraphs
{array} array of function-plot instances linked to the events of this instance, i.e. when the zoom event is dispatched on this instance it's also dispatched on all the instances of this arrayinstance.meta
{object}instance.meta.margin
{object} graph's left,right,top,bottom marginsinstance.meta.width
{number} width of the canvas (minus the margins)instance.meta.height
{number} height of the canvas (minus the margins)instance.meta.xScale
{d3.scale.linear} graph's x-scaleinstance.meta.yScale
{d3.scale.linear} graph's y-scaleinstance.meta.xAxis
{d3.svg.axis} graph's x-axisinstance.meta.yAxis
{d3.svg.axis} graph's y-axis
instance.root
{d3.selection}svg
element that holds the graph (canvas + title + axes)instance.canvas
{d3.selection}g.canvas
element that holds the area where the graphs are plotted (clipped with a mask)
Events
An instance can subscribe to any of the following events by doing instance.on([eventName], callback)
,
events can be triggered by doing instance.emit([eventName][, params])
mouseover
fired whenever the mouse is over the canvasmousemove
fired whenever the mouse is moved inside the canvas, callback paramsx
,y
(in canvas space coordinates)mouseout
fired whenever the mouse is moved outside the canvasdraw
emit this event to redraw the contents of the canvaszoom:scaleUpdate
fired whenever the scale of another graph is updated, callback paramsxScale
,yScale
(x-scale and y-scale of another graph whose scales were updated)tip:update
fired whenever the tip position is updated, callback paramsx
,y
,index
(in canvas space coordinates,index
is the index of the graph where the tip is on top of)all:mousemove
same asmousemove
but it's dispatched for all the linked graphsall:zoom
fired whenever there's scaling/translation on the graph, dispatched on all the linked graphs
After cloning the repo and running npm install
node site.js // generate the examples shown on index.html
npm start
Open 127.0.0.1:5555
and that's it! Local development server powered beefy
Plain demo: 127.0.0.1:5555/demo.html
2015 MIT © Mauricio Poppe