Giter VIP home page Giter VIP logo

react-timeseries-charts's Introduction

logo

React Timeseries Charts

Build Status npm version

Zooming

This library contains a set of modular charting components used for building flexible interactive charts. It was built for React from the ground up, specifically to visualize timeseries data and network traffic data in particular. Low level elements are constructed using d3, while higher level composability is provided by React. Charts can be stacked as rows, overlaid on top of each other, or any combination, all in a highly declarative manner.

The library is used throughout the public facing ESnet Portal.

Current features of the library include:

  • Declarative layout of charts using JSX
  • Interactivity, including pan and zoom
  • Add new chart types or overlays
  • Multiple axis, multiple rows
  • Line, area, scatter, bar and boxplot charts
  • Brushing
  • Legends
  • Overlay markers

Please browse the examples for a feel for the library.

Getting started

This charts library is intended to be installed with npm and the built into your project with a tool like Webpack. It expects React to be present, as well as our TimeSeries abstraction library, pond.js. More on this below. To install:

npm install react-timeseries-charts pondjs --save

Once installed, you can import the necessary components from the library:

import { Charts, ChartContainer, ChartRow, YAxis, LineChart } from "react-timeseries-charts";

Then we construct our chart in the render() function of our component. For a simple example we create a chart with two line charts on it, specified in JSX:

<ChartContainer timeRange={series1.timerange()} width={800}>
    <ChartRow height="200">
        <YAxis id="axis1" label="AUD" min={0.5} max={1.5} width="60" type="linear" format="$,.2f"/>
        <Charts>
            <LineChart axis="axis1" series={series1}/>
            <LineChart axis="axis2" series={series2}/>
        </Charts>
        <YAxis id="axis2" label="Euro" min={0.5} max={1.5} width="80" type="linear" format="$,.2f"/>
    </ChartRow>
</ChartContainer>

At the outer most layer, we add a <ChartContainer> which contains our time range for the x-axis. All charts within a ChartContainer share the same x-axis. In this case we get the TimeRange from the TimeSeries itself, but you could specify one yourself. You also need to provide a width for the chart, or wrap the chart in a <Resizable> component and that will inject a width for you.

For the next layer of the layout we make a <ChartRow>. We can have multiple charts stacked on top of each other by using more than one row. In this case we just have one row. Each row has a specific height in the layout, so we specify that as 200px high here.

Next up we want to put something in our row. Rows contain two parts:

  1. a central flexible sized area in which charts can be added and
  2. axes on either the left or right of the central area.

This central area is surrounded in the JSX by the <Charts> tag. Each chart in this area is composited on top of each other. In this case we are adding two <LineChart>s, one for each of our timeseries. As a result they will be drawn on top of each other. (Note that as of v0.9, it is also possible to draw multiple channels of a TimeSeries as multiple line charts). For scaling each chart will reference an axis that will define the scale as well as display that scale visually as the y-axis.

Finally, we specify the axes that the charts reference. These go either before or after the <Charts> group, depending on if you want the axis before (to the left) or after the charts (to the right). You can specify any number of axes on either side. For each <YAxis> you specify the id so that a chart can reference it, the label you want displayed alongside the axis and, importantly, the scale using min and max. You can also specify the type of the axis (linear, log, etc), a non-default width and the format.

For more details, please see the API docs.

Data format

This charting library is built on the ESnet timeseries library called pond.js. Pond.js was created to provide a common representation for things like time series, time ranges, events and other structures as well as to implement common operations on those structures.

For the purpose of using the charting library, you need to create a TimeSeries object as your time series, which will be rendered by the chart code. Constructing a TimeSeries is pretty simple. You just need to pass it an object that contains, at a minimum, the column names as an array, and a list of points.

For example:

import { TimeSeries, TimeRange } from "pondjs";

const data = {
    name: "traffic",
    columns: ["time", "in", "out"],
    points: [
        [1400425947000, 52, 41],
        [1400425948000, 18, 45],
        [1400425949000, 26, 49],
        [1400425950000, 93, 81],
        ...
    ]
};

const timeseries = new TimeSeries(data);

Generally columns must have 'time' as the first column (see the Pond.js docs for other options), and points is of the format:

[[time, value], [time, value], ...]

Note that there are several ways to construct a TimeSeries. The above is what we call our wire format.

To specify a ChartContainer you also need to provide the time range to plot on the x-axis. This is done with a pond.js TimeRange. You could either get the TimeRange from the TimeSeries directly:

var timerange = timeseries.timerange()

Or construct a new one:

var timerange = new TimeRange([begin, end]);

where begin and end are times (Javascript Dates, usually).

How you manage this is application specific. We often have pages where the current time range being shown is kept in the this.state of the component and is updated during pan and zoom, both via interaction with the charts or via other controls on the page.

Developing

The repo contains the examples website. This is very helpful in developing new functionality. Within a cloned repo, you first need to run:

yarn install

This will install the development dependencies into your node_modules directory.

You can then start up the test server:

npm run start-website

Then, point your browser to:

http://localhost:3000/

Before submitting a Pull Request, run:

npm run build

In case you want to demonstrate an issue with the library via an example, you can use CodeSandBox.

A simple BarChart example has been built here - https://codesandbox.io/s/3j0540mo5

Supported Browsers

The most recent release of Firefox or Chrome is recommended.

Thanks

Thanks to Chromatic for providing the visual testing platform that help us catch unexpected changes on time.

License

This code is distributed under a BSD style license, see the LICENSE file for complete information.

Copyright

ESnet's React Timeseries Charts, Copyright (c) 2015 - present, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from the U.S. Dept. of Energy). All rights reserved.

If you have questions about your rights to use or distribute this software, please contact Berkeley Lab's Technology Transfer Department at [email protected].

NOTICE. This software is owned by the U.S. Department of Energy. As such, the U.S. Government has been granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, worldwide license in the Software to reproduce, prepare derivative works, and perform publicly and display publicly. Beginning five (5) years after the date permission to assert copyright is obtained from the U.S. Department of Energy, and subject to any subsequent five (5) year renewals, the U.S. Government is granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, worldwide license in the Software to reproduce, prepare derivative works, distribute copies to the public, perform publicly and display publicly, and to permit others to do so.

react-timeseries-charts's People

Contributors

albertcarrete avatar antonycourtney avatar aruntk avatar barbaragomes avatar brandly avatar camflan avatar christian-acuna avatar dawsbot avatar ethanroday avatar guillaume avatar iabw avatar igozali avatar iwilsonv avatar jason-rovitracker avatar jdugan1024 avatar jfremy avatar joshuaball avatar jverhoeven avatar kradical avatar pazqo avatar phonglk avatar pjm17971 avatar psykar avatar samford100 avatar sartaj10 avatar siavelis avatar spiralman avatar thecentury avatar therealtbs avatar webmoods avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-timeseries-charts's Issues

Boxplot feature

Hi, are you considering adding boxplot to library by any chance?

Tracker time inconsistent with time axis tick marks

See screenshot below. The time shown above the chart is the tracker time. The tracker is fairly directly above a tick mark, but the tracker time differs from the tick mark by about 45 seconds. Becomes more pronounced as we zoom in.

image

Unify styling across API

The aim of this item is to unify the styling of the charts and other components across the API. Particular chart styles have special requirements, for instance a scatter chart might want to style per-element, while this doesn't make sense for a line chart.

TODO:

  • Scatter charts
  • Area charts
  • Line charts
  • Bar charts
  • Legends
  • Baselines
  • Markers
  • Docs page for styling based on this issue

In general we should follow these guidelines:

  1. Where possible, chart entities can be in four states:
  • normal
  • highlighted - most likely if they are hovered over, but maybe because something in the rest of the page UI refers to that item (hovering over a table of values, for instance)
  • selected - most likely because it was clicked, but it might be selected elsewhere in the UI like the highlight
  • muted
  1. A chart will take a single TimeSeries, but be able to specify multiple columns of the series. The series is passed in with the series prop and is a Pond TimeSeries object. The columns are passed in with the columns prop, and is an array of strings (the column names).

  2. A chart takes a style prop, which may be a style object (see 4 below) or a style function.

  3. The style object is a mapping from a column name to the style for that column. Each style object should specify each state (see 1 above) mapped to the CSS specification for that column, in that state. For example:

const scatterStyles = {
    gust: {
        normal: {
            fill: "red",
            opacity: 0.5
        }
    }
};

Maps the column named "gust" to one state ("normal"). For that state, the entity will be filled red, with opacity 0.5. In addition to normal we could also add other states (which should be optional and default to normal): highlighted, selected and muted.

  1. The style function will be called with either each column, or each event/column, depending on the chart itself. i.e. a line chart and area chart will call the function with the column only. A scatter chart and bar chart would call the function for each event and column. For example:
style={(event, column) => ({
    normal: {
        fill: column === "station1" ? "green" : "orange",
        opacity: 0.7
    },
    highlighted: {
        fill: column === "station1" ? "green" : "orange",
        stroke: column === "station1" ? "#2db3d1" : "#2db3d1",
        opacity: 1.0
    },
    selected: {
        fill: "#2db3d1",
        stroke: "#2db3d1",
        strokeWidth: 3,
        opacity: 1.0
    }
})}
  1. Some parts of the API have additional styles, for example legends, baselines etc. If possible these should use a subset of the above convention. If multiple styles are needed, you should use separate properties for those. For example "swatchStyle" and "labelStyle" for the legend's swatch and label. Then each of these should follow the above convention, if possible.

  2. Sensible defaults should be provided so that the charts work without needing to specify a style. This should be clearly defined in each component as defaultStyle. The base style for this should be:

const defaultStyle = {
    normal: {fill: "steelblue", opacity: 0.8},
    highlighted: {fill: "#5a98cb", opacity: 1.0},
    selected: {fill: "orange", opacity: 1.0},
    muted: {fill: "steelblue", opacity: 0.4},
    text: {fill: "#333", stroke: "none"}
};
  1. The main description of each component should have a header called Styling and provide a high level description of how to customize the styling of the component. More detailed information can be added to the props docs which are built to the API docs.

Finalize new example pages

Part of upgrading to React 15 is getting the examples to work. This involves an upgrade to React Router as well. It also adds the catalog of examples and builds examples, docs and api pages semi-automatically based on the route. This part is mostly complete.

Mouse position on tracker position change

Hi,

is it possibile to get/track the current mouse position (inside the chart) on tracker position change?
I need the [x,y] coordinates inside chart rect..

Thanks

LineChart doesn't work with breakLine=false

This code doesn't work since underscore doesn't understand for..of iterators.

 _.each(this.props.series.collection().events(), d => {

(in the non-breakLine case of LineChart renderLine())

It should iterate the same as the breakLine=true case above it.
Also, in [email protected] you should be able to use this.props.series.events() directly.

Brush examples

Hi all,

are there any examples that use the Brush feature?

Thanks

Errors when attempting to use Y-Axis type other than "linear"

I've been trying to create a LineChart with Y-Axis "log" scale type. I am charting owamp latency data, which often has a broad range of values (and loss, which I'll be plotting soon, even moreso).

However, I'm getting errors such as:
createNodesFromMarkup.js:61 Error: Invalid value for attribute d="M 1058.942027 NaN L 1057.469805 NaN L 1055.997582 NaN L 1054.52536 NaN L 1053.053138 NaN L 1051.580916 NaN L 1050.108693 NaN L 1048.636471 NaN L 1047.164249 NaN L 1045.692027 NaN L 1044.219805 NaN L 1042.747582 NaN L 1041.27536 NaN L 1039.803138 NaN L 1038.330916 NaN L 1036.858693 NaN L 1035.386471 NaN L 1033.914249 NaN L 1032.442027 NaN L 1030.969805 NaN L 1029.497582 NaN L 1028.02536 NaN L 1026.553138 NaN L 1025.080916 NaN L 1023.608693 NaN L 1
...

Trace:

createNodesFromMarkup @ createNodesFromMarkup.js:61
dangerouslyRenderMarkup @ Danger.js:89
processUpdates @ DOMChildrenOperations.js:89
dangerouslyProcessChildrenUpdates @ ReactDOMIDOperations.js:85
ReactDOMIDOperations_dangerouslyProcessChildrenUpdates @ ReactPerf.js:66
processQueue @ ReactMultiChild.js:160
updateChildren @ ReactMultiChild.js:334
_updateDOMChildren @ ReactDOMComponent.js:871
updateComponent @ ReactDOMComponent.js:700
receiveComponent @ ReactDOMComponent.js:645
receiveComponent @ ReactReconciler.js:87
_updateRenderedComponent @ ReactCompositeComponent.js:562
_performComponentUpdate @ ReactCompositeComponent.js:544
updateComponent @ ReactCompositeComponent.js:473
ReactCompositeComponent_updateComponent @ ReactPerf.js:66
performUpdateIfNecessary @ ReactCompositeComponent.js:421
performUpdateIfNecessary @ ReactReconciler.js:102
runBatchedUpdates @ ReactUpdates.js:129
perform @ Transaction.js:136
perform @ Transaction.js:136
perform @ ReactUpdates.js:86
flushBatchedUpdates @ ReactUpdates.js:147
ReactUpdates_flushBatchedUpdates @ ReactPerf.js:66
closeAll @ Transaction.js:202
perform @ Transaction.js:149
batchedUpdates @ ReactDefaultBatchingStrategy.js:62
enqueueUpdate @ ReactUpdates.js:176
enqueueUpdate @ ReactUpdateQueue.js:24
enqueueForceUpdate @ ReactUpdateQueue.js:143
ReactComponent.forceUpdate @ ReactComponent.js:86
(anonymous function) @ chart1.jsx:225
l @ jquery.min.js:4
c.fireWith @ jquery.min.js:4
k @ jquery.min.js:6
(anonymous function) @ jquery.min.js:6

Peter suggested trying "Log" rather than "log," but that didn't work, either (though I got a different error). FWIW, I'm attempting to set the Log type when I create the charts, not change it on the fly.

Warning: Main: `key` is not a prop. Trying to access it will result in `undefined`

I was just experimenting with the react-time-series charts, they look really nice. Is there a way we can fix this warning issue.

warning.js:44Warning: ChartRow: key is not a prop. Trying to access it will result in undefined being returned. If you need to access the same value within the child component, you should pass it as a different prop.

Using "react-dom": "^15.1.0",

Tracker should support displaying points and labels

While the tracker works well for indicating the currently hovered time, it would be nice if you could mark points on the data as well. Perhaps it should support showing the line, showing a list of points, and/or showing a list of points and labels. The calling code would be responsible for deciding what to show, what points to add, what labels to apply etc. It could also snap the marker to the data is necessary.

We could pass all this in as props on the ChartRow.

Support for Event timelines (EventChart)

The EventChart would be able to be inserted within a ChartRow and show horizontal boxes of markers for events that come out of a TimeSeries or perhaps an array of Events.

It would be passed a series prop, which would be a Pond TimeSeries. This would be extracted for events. Supported events are IndexedEvents, TimeRangeEvents and normal timestamped Events. We'd need a prop for defining what the label is of each event. This could be a function or a column name. There's similarities with the new hbarchart code, so the APIs should be similar.

For layout, since there would be a fixed height for the ChartRow container, we should define a number of rows the events should layout in. Events would be cycled between the rows. For colors or styles of the event boxes, we'd want another prop which could be a style object or a function that returns a style object.

You would be able to pan and zoom the view. You would be able to select events.

Charts need to have a clipping rect

Currently if you pan and zoom, the area chart will draw over the axes. In the old areachart code this was done with this def:

this.clipper = this.svg.append("defs")
  .append("clipPath")
    .attr("id", this.clipperId)
      .append("rect")
        .attr("width", this.size.width)
        .attr("height", this.size.height);

and then used later like this:

var clipURL = "url(#" + this.clipperId + ")";

upChart.append("path")
  .attr("class", "area")
  .attr("d", function(d) {
    return upArea(d.values);
  })
  .attr("clip-path", clipURL)
  .style("fill", function(d, i) {
    return self.options.colorMap[0][i];
  })
  .style("fill-opacity", 0.85);

Warn when using a log scale with min set to 0

Currently if you try to create a chart with a Y axis with a log scale and the minimum is set to 0, (min=0 property), it bombs out with an SVG error. It would be more helpful to provide an error message when this happens.

Support tooltips in barcharts

It would be nice if you could hover over points on a line chart or bars on a bar chart and get information about that element. Unfortunately the tracker/eventrect code is eating those events. We need to look at the event handling code and make a distinction between pan/zoom and tracker code, and hover over element handling.

Better scale transitions

Currently the y-axis can transition from one scale to another. However, now that much of the drawing is done with react and not d3, most charts themselves no longer transition. The solution to this is to take control of the scale interpolation at the ChartRow level and drive the y-axis scales from there. This would involve keeping y-axis scales as state on the ChartRow, then using that state as props passed to both the charts and the YAxis themselves.

Support React 15

The charts library generally works with React 15, but spits out several warning messages. Also, I think for the examples to work we need to upgrade React Router. And, as usual, there's probably other issues with the upgrade.

The goal would be to make it work on React 0.14 as well.

Transitions don't support scale type or range changes

We should support transitions for both changes in range/domain or the type of the scale (log to linear, for example). The current code interpolates the domain of the scale. This clearly doesn't account for a scale type changing and the current approach has no way of doing that.

LineCharts update too often

If anything changes, the LineChart tries to rerender. While react reconciles this, with repeated attempts to generate a whole lot of SVG, this is itself quite slow. We should implement shouldComponentUpdate() and actually test that something important has changed.

Add general support for styles to LineCharts

Currently the LineChart accepts a style object with a width and color to be used when drawing the path itself. However, there are other styles you might want to apply, such as dashed lines.

Roll in react-axis

The current implementation of both the yaxis and timeaxis are build using d3-axis. This has resulted in numerous problems in this libraries (short) life. In response the proposal is to develop react-axis to have all the functionality we need and then integrate that instead. This would still use d3 for format and scale, but would build the SVG with React instead. This would remove the last such piece of code from this library.

YAxis ticks should to chart heights

When the chart height is small, like < 150px or so, the ticks bunch up. The old code had a switch so that if it went below a certain height it only showed the max and min.

        if (this.size.height > 100) {
            this.yAxis = d3.svg.axis()
                .scale(self.y)
                .tickFormat(function(d) {
                    return yformat(Math.abs(d));
                }).orient("right");
        } else {
            this.yAxis = d3.svg.axis()
                .scale(self.y)
                .tickValues(function() {
                    return [self.y.domain()[0], 0, self.y.domain()[1]];
                })
                .tickFormat(function(d) {
                    return yformat(Math.abs(d));
                }).orient("right");
        }

Add general styling support for legends

To go with better styling support within the charts library, we should support better styling of legends. This would mean allowing the user fill or stroke styling on the legend swatch, dot, or line which would match that passed to the chart itself.

Update charts code to use d3-brush

There is now a released version of d3-brush, which is the last d3 3.x api left. If we update this we can remove the whole of d3 3.x from our dependencies.

https://github.com/d3/d3-brush

Unfortunately the API looks different and there's no examples or tests around it, so this might not be simple.

Building with Brunch

Hi,
I'm fairly new to Javascript/React/Brunch etc. and I wanted to try out the time series charts. However, when I build the app using Brunch, the CSS gets compiled into a vendor.css, which is included in my index.html. But when I load the app I get an error message:
"Cannot find module: 'react-timeseries-charts/lib/baseline.css' from 'react-timeseries-charts/lib/baseline.js'"
baseline.js has a require("./baseline.css") statement, but all CSS is contained in the vendor.css.

Has anyone tried using the time series charts with Brunch?

memoize allocation of d3 scales in ChartContainer and ChartRow

Currently scales are dynamically allocated in ChartContainer and ChartRow on every render cycle, requiring every leaf component to compare time scales by value (using the scaleAsString function, copied in a few places) instead of by reference in componentWillReceiveProps.
ChartContainer and ChartRow should probably keep these scale objects as local state and only re-allocate if the scale constructor arguments have changed since the last render. Note that it will be necessary to re-allocate on argument changes instead of just updating in place since otherwise leaf components won't have a way to detect changes. This should be straightforward for timeScale in ChartContainer since there is just one such scale constructed one way, depending only on props.beginTime and props.endTime. Y scales in chart row are more involved but should still be feasible. (Not an entirely theoretical issue -- this was the source of a difficult to find bug in the Brush component.)

Relative time axis scales

Sometime you want to display a time axis starting at 0, rather than one over a specific time range. For example you might display data from a test. It doesn't matter that the test was on Wednesday at 8am. You want to beginning of the test data to be labeled 0 and then have useful time increments from there, like 0:15, 0:30, 0:45, 1hr, 1:15 ...

AreaChart stacking doesn't work on branch v0.10

Seems like the changes made for enabling detailed styling had some impact on stacking, I can't get the area charts stacked.

I tried replacing the areachart.js from master branch, still the same problem somehow graphs get on top of one another. If I use multiple tags I get the desired results.

AreaChart API should take a single TimeSeries

Other charts generally have a single series prop to work with, but the AreaChart takes an array of arrays of TimeSeries objects. This was the historical structure of the data for this type of chart but is now inconsistent. Further, the common case for us is to have a single TimeSeries containing multiple channels (columns), so it would be better for the API to take one series but allow the user to map multiple columns onto the area stacking above and below the axis. We could do this with a columns prop, which would be of the form [up, down] where up and down are arrays of string stacked either up or down. For example: [up: ["in"], down: ["out"]]. The default should map the "value" column to an up area.

Add clipping for LineChart

We added clipping for AreaChart here:
0c31b4e

Follow the same approach for LineChart. Should be a two-line change, but don't do it until we at least have an example that exercises LineChart functionality to allow for manual testing.

Dynamic width and height

Currently it seems like the width and height of a chart have to be set to fixed values (e.g. height property of ChartRow, width property of ChartContainer). Is there some way to make a chart responsive? There already is a closed issue (Feature/variable width layouts #13), but it only considers width and not height.

Branch v0.9: Can't find variable: renderLine

Hi,
I just tried branch v0.9 which uses the newest version of pond, but I'm getting an error when I load the page:

ReferenceError: Can't find variable: renderLine

Everything builds with no errors.

LineCharts should support broken data

In the real world we often have data that has missing segments or points. We should support this, particularly in the LineCharts code, by constructing multiple line segments where we encounter nulls or NaNs in the timeseries.

Example for areachart

Ironically our most used chart doesn't have an example in this repo. We should grab some traffic data and add one.

Bar chart to compare multiple TimeSeries

We often want to compare multiple timeseries. For network traffic data this could be a breakdown of interfaces that face a site, or a flow breakdown (portion of traffic going to different countries, for example).

Some possible features:

  • show either avg or max as a simple horizontal bar chart
  • sorting
  • top n
  • show a range bar (min to max), with some statistical visualization
  • show a current time's values overlaid on the range bar. This could come from hovering over an area chart, or it could be the current values
  • callback for selection evoked by clicking on the name
  • on mouse over callback

Here's a prototype:

screen shot 2016-02-12 at 6 21 52 pm

Brushing selection control

Request to add additional functionality to the Brush control from @apertome:

  • Ability to have it load with no initial selection. Need way of specifying an empty range.
  • Have the selection cleared when the user clicks outside of the selected area along with programatic selection clearing

Most likely this would mean adapting the existing code to accept null as a TimeRange and providing a callback (if an existing one is not appropriate) to clear that state.

Additional comment:

These could be added easily enough, but I thought I'd check with you guys to see if these would be desirable options from your point of view, before I go adding too much to the chart library itself. At the very least I think it needs to have a "clearBrush" function or something that can be called from other components. It might be nice to take it one step further and offer options for these behaviors, which I imagine might be fairly common.

@apertome If I've misrepresented this request, please make a note and I'll edit the description

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.