Data visualization with react-vis
What is react-vis?
React-vis is a React visualization library created by Uber. With it you can easily create common charts, such as line, area, bar charts, pie and donut charts, tree maps and many more.
React-vis is a good option because it is:
- Simple
- Flexible
- Integrated with React.
In this article I want to show how to build a simple line chart using react-vis.
Installation
First of all you need to install react-vis on your project. For demo purpose I used an empty project created with create-react-app.
Installing react-vis is as easy as npm install react-vis --save
Examples
Of course it is supposed that you have some data you want to visualize. For my example I will use dataset from Github Language Statistics with amounts of pull-requests per programming language.
Nothing new here, I fetch data in componentDidMount, than set state of my app and pass it as a props to the child component. As I am interested in JavaScript statistics, I also filter results.
import React, {Component} from 'react';
import './App.css';
import Chart from './components/chart'
const API_URL = "https://nataliia-radina.github.io/react-vis-example/";
class App extends Component {
constructor(props) {
super(props)
this.state = {
results: [],
};
}
componentDidMount() {
fetch(API_URL)
.then(response => {
if (response.ok) {
return response.json()
}
else {
throw new Error ('something went wrong')
}
})
.then(response => this.setState({
results: response.results.filter((r)=>{
return r.name === 'JavaScript';
})
})
)}
render() {
const {results} = this.state;
return (
<div className="App">
<Chart data={results}/>
</div>
);
}
}
export default App;
Now let’s move further to our Chart component.
Chart component is a functional component because it has no state. On my chart I want to display the number of pull-requests at the specific period of time. That is why I will go for a simple LineSeries diagram.
To be able to use it I import the necessary components from the library
import {XYPlot, XAxis, YAxis, VerticalGridLines, LineSeries} from 'react-vis';
XYPlot is a wrapper for the rest of elements. Axes are there to show X and Y axis. VerticalGridLines to create a grid and LineSeries is a type of chart itself.
Simple use-case
Now let’s create chart component with some random data first, just to get an idea how it works:
import React from 'react';
import {XYPlot, XAxis, YAxis, VerticalGridLines, HorizontalGridLines, LineSeries} from 'react-vis';
const Chart = (props) => {
return (
<XYPlot
width={300}
height={300}>
<VerticalGridLines />
<HorizontalGridLines />
<XAxis />
<YAxis />
<LineSeries
data={[
{x: 1, y: 4},
{x: 5, y: 2},
{x: 15, y: 6}
]}/>
</XYPlot>
);
}
export default Chart;
As you can see I pass an array of objects containing x and y values I want to show on the diagram to LineSeries component.
And here comes some magic! My chart component at this point looks like this :
Applying real data
Now let’s pass actual data to our component. I want to show the amount of pull-requests for a specific period of time. It is “count”, and both “year” and “quarter” from my dataset. So I will create an array with x and y values from this data:
const dataArr = props.data.map((d)=> {
return {x: d.year + '/' + d.quarter,
y: parseFloat(d.count/1000)}
});
Let’s see what happens when I pass my array to LineSeries component
<LineSeries data={dataArr}/>
Because on the x axis I want to show quarters, I need to specify the type of the axes as following:
xType="ordinal"
Not bad, but I still want to modify the look of my chart a little bit. So I will add some styles as well:
<LineSeries data={dataArr} style={{stroke: 'violet', strokeWidth: 3}}/>
Here is the full code for chart component:
import React from 'react';
import {XYPlot, XAxis, YAxis, VerticalGridLines, HorizontalGridLines, LineSeries} from 'react-vis';
const Chart = (props) => {
const dataArr = props.data.map((d)=> {
return {x: d.year + '/' + d.quarter,
y: parseFloat(d.count/1000)}
});
return (
<XYPlot
xType="ordinal"
width={1000}
height={500}>
<VerticalGridLines />
<HorizontalGridLines />
<XAxis title="Period of time(year and quarter)" />
<YAxis title="Number of pull requests (thousands)" />
<LineSeries
data={dataArr}
style={{stroke: 'violet', strokeWidth: 3}}/>
</XYPlot>
);
}
export default Chart;
And here we go:
Conclusion
I hope that you are convinced now that react-vis is easy to use powerful tool. It is a good choice for presenting any type of data.
For further information and experiments check react-vis documentation and examples.
Enjoy your data visualization!