# d3fc-annotation A collection of components for rendering plot area annotations (bands, crosshairs, gridlines and lines) onto Cartesian charts using SVG and canvas.
[Main D3FC package](https://github.com/d3fc/d3fc) # Installation ```bash npm install @d3fc/d3fc-annotation ``` # API ## Gridline Annotation The gridline component renders horizontal and vertical gridlines. ### SVG Rendering # *fc*.**annotationSvgGridline**() Constructs a new SVG gridline annotation component. Once constructed, configure the component with scales and call it on a selection - ```js const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const gridline = fc.annotationSvgGridline() .xScale(xScale) .yScale(yScale); d3.select('svg') .call(gridline); ``` ### Canvas Rendering # *fc*.**annotationCanvasGridline**() Constructs a new canvas gridline annotation component. Once constructed, configure the component with scales and call it - ```js var ctx = canvas.getContext('2d'); const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const gridline = fc.annotationCanvasGridline() .xScale(xScale) .yScale(yScale) .context(ctx); gridline(); ``` ### Common Properties # *gridline*.**xScale**(*[scale]*) If *scale* is specified, sets the scale used for the vertical gridline positions (combined with [xTicks](#gridline_xTicks)). Additionally, its [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the horizontal gridlines. If *scale* is not specified, returns the current xScale. # *gridline*.**yScale**(*[scale]*) If *scale* is specified, sets the scale used for the horizontal gridline positions (combined with [yTicks](#gridline_yTicks)). Additionally, its [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the vertical gridlines. If *scale* is not specified, returns the current yScale. # *gridline*.**xTicks**(*[count]*) # *gridline*.**xTicks**(*[interval]*) If *count* is specified, sets the count passed to [ticks](https://github.com/d3/d3-scale#continuous_ticks) when requesting the horizontal gridline positions when [xScale](#gridline_xScale) is a continuous scale. For other scales, this value is ignored and the [domain](https://github.com/d3/d3-scale#ordinal_domain) is used directly. If *count* is not specified, returns the current count. When [xScale](#gridline_xScale) is a [time scale](https://github.com/d3/d3-scale#scaleTime) this method can be passed a [time interval](https://github.com/d3/d3-time) to specify the position of the gridlines. For example to generate gridlines every fifteen minutes: ``` gridline.xTicks(d3.timeMinute.every(15)); ``` # *gridline*.**xTickValues**(*[values]*) Manually specify the vertical gridline positions. Overrides [xTicks](#gridline_xTicks). # *gridline*.**yTicks**(*[count]*) # *gridline*.**yTicks**(*[interval]*) If *count* is specified, sets the count passed to [ticks](https://github.com/d3/d3-scale#continuous_ticks) when requesting the vertical gridline positions when [yScale](#gridline_yScale) is a continuous scale. For other scales, this value is ignored and the [domain](https://github.com/d3/d3-scale#ordinal_domain) is used directly. If *count* is not specified, returns the current count. When [yScale](#gridline_yScale) is a [time scale](https://github.com/d3/d3-scale#scaleTime) this method can be passed a [time interval](https://github.com/d3/d3-time) to specify the position of the gridlines. For example to generate gridlines every fifteen minutes: ``` gridline.yTicks(d3.timeMinute.every(15)); ``` # *gridline*.**yTickValues**(*[args]*) Manually specify the vertical gridline positions. Overrides [yTicks](#gridline_yTicks). # *gridline*.**xDecorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when joining the vertical gridlines to SVG elements or drawing canvas gridlines. If not specified, returns the current decorate function. # *gridline*.**yDecorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when joining the horizontal gridlines to SVG elements or drawing canvas gridlines. If not specified, returns the current decorate function. ### SVG Specific Properties # *svgGridline*.**xKey**(*[keyFunc]*) If *keyFunc* is specified, sets the key function used when joining the vertical gridlines to SVG elements. If not specified, returns the current key function. # *svgGridline*.**yKey**(*[keyFunc]*) If *keyFunc* is specified, sets the key function used when joining the horizontal gridlines to SVG elements. If not specified, returns the current key function. ### Canvas Specific Properties # *canvasGridline*.**context**(*ctx*) If *ctx* is specified, sets the canvas context and returns this series. If *ctx* is not specified, returns the current context. ## Band Annotation The band component renders horizontal and vertical bands. ### SVG Rendering # *fc*.**annotationSvgBand**() Constructs a new band annotation component. Once constructed, configure the component with scales, associate a selection with some data representing the band locations and call it on the selection - ```js const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const band = fc.annotationSvgBand() .xScale(xScale) .yScale(yScale); d3.select('svg') .datum([{ from: 45, to: 55 }]) .call(band); ``` ### Canvas Rendering # *fc*.**annotationCanvasBand**() Constructs a new band annotation component. Once constructed, configure the component with scales and call with some data representing the band locations - ```js var ctx = canvas.getContext('2d'); const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const band = fc.annotationCanvasBand() .xScale(xScale) .yScale(yScale) .context(ctx); band([{ from: 45, to: 55 }]); ``` ### Common Properties # *band*.**xScale**(*[scale]*) If *scale* is specified, sets the scale used for transforming the [fromValue](#band_fromValue)/[toValue](#band_toValue) positions of vertical bands. Additionally, its [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the horizontal bands. If *scale* is not specified, returns the current xScale. # *band*.**yScale**(*[scale]*) If *scale* is specified, sets the scale used for transforming the [fromValue](#band_fromValue)/[toValue](#band_toValue) positions of horizontal bands. Additionally, its [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the vertical bands. If *scale* is not specified, returns the current yScale. # *band*.**orient**(*[orientation]*) If *orientation* is specified, sets the orientation of the bars to either `horizontal` or `vertical`. If *orientation* is not specified, returns the current orientation. # *band*.**fromValue**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the start value for bands. This value will be passed through the appropriate scale. If not specified, returns the current start value. # *band*.**toValue**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the end value for bands. This value will be passed through the appropriate scale. If not specified, returns the current end value. # *band*.**decorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when joining the bands to SVG elements or drawing the canvas. If not specified, returns the current decorate function. ### Canvas Specific Properties # *canvasBand*.**context**(*ctx*) If *ctx* is specified, sets the canvas context and returns this series. If *ctx* is not specified, returns the current context. ## Line Annotation The line component renders horizontal and vertical lines. ### SVG Rendering # *fc*.**annotationSvgLine**() Constructs a new line annotation component. Once constructed, configure the component with scales, associate a selection with some data representing the line locations and call it on the selection - ```js const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const line = fc.annotationSvgLine() .xScale(xScale) .yScale(yScale); d3.select('svg') .datum([50]) .call(line); ``` ### Canvas Rendering # *fc*.**annotationCanvasLine**() Constructs a new line annotation component. Once constructed, configure the component with scales and call it with some data representing the line locations - ```js var ctx = canvas.getContext('2d'); const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const line = fc.annotationCanvasLine() .xScale(xScale) .yScale(yScale) .context(ctx); line([50]); ``` ### Shared Components # *line*.**xScale**(*[scale]*) If *scale* is specified, sets the scale used for transforming the [value](#line_value) of the line. Additionally, its [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the horizontal lines. If *scale* is not specified, returns the current xScale. # *line*.**yScale**(*[scale]*) If *scale* is specified, sets the scale used for transforming the [value](#line_value) of the line. Additionally, its [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the vertical lines. If *scale* is not specified, returns the current yScale. # *line*.**orient**(*[orientation]*) If *orientation* is specified, sets the orientation of the lines to either `horizontal` or `vertical`. If *orientation* is not specified, returns the current orientation. # *line*.**value**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the value for lines. This value will be passed through the appropriate scale. If not specified, returns the current value. # *line*.**label**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the label for lines. If not specified, returns the current label. # *line*.**decorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when joining the lines to SVG elements or drawing the lines on the canvas. If not specified, returns the current decorate function. ### Canvas Specific Properties # *canvasLine*.**context**(*ctx*) If *ctx* is specified, sets the canvas context and returns this series. If *ctx* is not specified, returns the current context. ## Crosshair Annotation The crosshair component renders a pair of vertical and horizontal lines with a point at their center. ### SVG Rendering # *fc*.**annotationSvgCrosshair**() Constructs a new crosshair annotation component. Once constructed, configure the component with scales, associate a selection with some data representing the crosshair locations and call it on the selection - ```js const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const crosshair = fc.annotationSvgCrosshair() .xScale(xScale) .yScale(yScale); d3.select('svg') .datum([{x: 50, y: 50}]) .call(crosshair); ``` ### Canvas Rendering # *fc*.**annotationCanvasCrosshair**() Constructs a new crosshair annotation component. Once constructed, configure the component with scales and call with some data representing the crosshair locations - ```js var ctx = canvas.getContext('2d'); const xScale = d3.scaleLinear() .range([0, 100]); const yScale = d3.scaleLinear() .range([0, 100]); const crosshair = fc.annotationCanvasCrosshair() .xScale(xScale) .yScale(yScale) .context(ctx); crosshair([{x: 50, y: 50}]); ``` ### Common Properties # *crosshair*.**xScale**(*[scale]*) If *scale* is specified, sets the scale whose [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the horizontal lines. If *scale* is not specified, returns the current xScale. # *crosshair*.**yScale**(*[scale]*) If *scale* is specified, sets the scale whose [range](https://github.com/d3/d3-scale#continuous_range) is taken as the bounds of the vertical lines. If *scale* is not specified, returns the current yScale. # *crosshair*.**x**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the x position of the crosshair. N.B. this value will **not** be passed through the appropriate scale. If not specified, returns the current value. # *crosshair*.**y**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the y position of the crosshair. N.B. this value will **not** be passed through the appropriate scale. If not specified, returns the current value. # *crosshair*.**xLabel**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the label for vertical lines. If not specified, returns the current label. # *crosshair*.**yLabel**(*[accessorFunc]*) If *accessorFunc* is specified, sets the function used to retrieve the label for horizontal lines. If not specified, returns the current label. ### SVG Specific Properties # *svgCrosshair*.**decorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when joining the crosshairs to SVG elements. If not specified, returns the current decorate function. ### Canvas Specific Properties # *canvasCrosshair*.**decorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when drawing the point of the crosshair. If not specified, returns the current decorate function. # *canvasCrosshair*.**xDecorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when drawing the vertical line of the crosshair. If not specified, returns the current decorate function. # *canvasCrosshair*.**yDecorate**(*[decorateFunc]*) If *decorateFunc* is specified, sets the decorate function used when drawing the horizontal line of the crosshair. If not specified, returns the current decorate function. # *canvasCrosshair*.**context**(*ctx*) If *ctx* is specified, sets the canvas context and returns this series. If *ctx* is not specified, returns the current context.