introduce
Today I would like to introduce a way to make charts in reactjs with chartjs, the library here I mention is react-chartjs2 https://github.com/jerairrest/react-chartjs-2 This library uses chartjs to write components in reactjs (the library chartjs currently has https://github.com/chartjs/Chart.js 47k3 votes, too trustworthy to spend [email protected] @).
Start learning
1. Installation:
1 2 | <span class="token function">npm</span> <span class="token function">install</span> --save react-chartjs-2 chart.js |
Here I have to install 2 libraries: chart.js and react-chartjs-2, I have to pay attention to the version that chartjs is installing, each updated version of chartjs has a different change. While in use there may be no errors, but the configs may lead to unexpected results.
2. Common charts that it can describe:
There are many real-life charts that chartjs can create. There are 3 main groups:
- Bar charts: bar chart The figure below is a bar chart: Vertical, in addition, we can style them as: Vertical, Horizontal, Multi axis, Stacked, Stacked groups
- Line charts: line chart.
There are also other types of charts that can style: Multi axis, Stepped, Interpolation, Line styles, Point styles, Point sizes
- Area charts: area chart: The image below is the radar chart –
There are also other commonly used forms: Donut, Pie, etc.
3. Usage, writing charts in reactjs:
With chartjs, to draw a chart, we often declare it or use it like this to draw a chart:
1 2 3 4 5 6 7 | <span class="token keyword">new</span> <span class="token class-name">Chart</span> <span class="token punctuation">(</span> element <span class="token punctuation">,</span> <span class="token punctuation">{</span> type <span class="token punctuation">:</span> <span class="token string">""</span> <span class="token punctuation">,</span> <span class="token comment">// ở đây ta thường khai báo loại chart tương ứng (ví dụ: bar, line,radar, pie,...)</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token operator">/</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment">//mảng dữ liệu, thường là giá trị của biểu đồ, các nhãn,vv</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> options <span class="token punctuation">:</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment">// object chứa các config , thường là config về tiêu đề, chú thích,...</span> |
The same applies to react-chartjs2, it’s just written into components to make it easier to use.
1 2 3 4 5 | <span class="token operator"><</span> <span class="token constant">T</span> ên loại chart data <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> options <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token operator">/</span> <span class="token operator">></span> |
a) Single column chart:
Now I will start to find out the details. For example, I want to create a bar graph showing information about the world’s pollution level by 2050. Here the basic parameters of the bar chart: pollution values (y-axis), x-axis are the continents. In addition to being easy to see, we add colors, titles of the chart
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">"react"</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> Bar <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-chartjs-2"</span> <span class="token punctuation">;</span> <span class="token operator">...</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token operator"><</span> Bar data <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> labels <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"Africa"</span> <span class="token punctuation">,</span> <span class="token string">"Asia"</span> <span class="token punctuation">,</span> <span class="token string">"Europe"</span> <span class="token punctuation">,</span> <span class="token string">"Latin America"</span> <span class="token punctuation">,</span> <span class="token string">"North America"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> datasets <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> label <span class="token punctuation">:</span> <span class="token string">"Population (millions)"</span> <span class="token punctuation">,</span> backgroundColor <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"#3e95cd"</span> <span class="token punctuation">,</span> <span class="token string">"#8e5ea2"</span> <span class="token punctuation">,</span> <span class="token string">"#3cba9f"</span> <span class="token punctuation">,</span> <span class="token string">"#e8c3b9"</span> <span class="token punctuation">,</span> <span class="token string">"#c45850"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">2478</span> <span class="token punctuation">,</span> <span class="token number">5267</span> <span class="token punctuation">,</span> <span class="token number">734</span> <span class="token punctuation">,</span> <span class="token number">784</span> <span class="token punctuation">,</span> <span class="token number">433</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> options <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> legend <span class="token punctuation">:</span> <span class="token punctuation">{</span> display <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> title <span class="token punctuation">:</span> <span class="token punctuation">{</span> display <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> text <span class="token punctuation">:</span> <span class="token string">"Predicted world population (millions) in 2050"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
Data attribute:
- labels: the x-axis sticker
- datasets:
- The label here is tooltips when we hover over the chart column, it will output: Population (millions): value.
- data: values -> automatically divide y-axis distance, if you want to divide by hand, we can configure in options -> steps
- options: I just configured basic with this column chart:
- legend (note): I will make it hidden
- title: its title, text: is the text of the title
===> The result will be:
====> in the element tree: we will see it generates a canvas tag chart -> chartjs using js code drawn on the canvas:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> canvas</span> <span class="token attr-name">height</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> 363 <span class="token punctuation">"</span></span> <span class="token attr-name">width</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> 726 <span class="token punctuation">"</span></span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> chartjs-render-monitor <span class="token punctuation">"</span></span> <span class="token style-attr language-css"><span class="token attr-name"> <span class="token attr-name">style</span></span> <span class="token punctuation">="</span> <span class="token attr-value"><span class="token property">display</span> <span class="token punctuation">:</span> block <span class="token punctuation">;</span> <span class="token property">width</span> <span class="token punctuation">:</span> 726px <span class="token punctuation">;</span> <span class="token property">height</span> <span class="token punctuation">:</span> 363px <span class="token punctuation">;</span></span> <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> canvas</span> <span class="token punctuation">></span></span> |
b) line chart
Another example: draw a chart of the world’s population densities over the years -> we will do a line graph. Here each line is each continent, the value at each point corresponds to the continent’s population in that year
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">"react"</span> <span class="token punctuation">;</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> Doughnut <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">"react-chartjs-2"</span> <span class="token punctuation">;</span> <span class="token operator">...</span> <span class="token operator">...</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token operator"><</span> Line data <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> labels <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">1500</span> <span class="token punctuation">,</span> <span class="token number">1600</span> <span class="token punctuation">,</span> <span class="token number">1700</span> <span class="token punctuation">,</span> <span class="token number">1750</span> <span class="token punctuation">,</span> <span class="token number">1800</span> <span class="token punctuation">,</span> <span class="token number">1850</span> <span class="token punctuation">,</span> <span class="token number">1900</span> <span class="token punctuation">,</span> <span class="token number">1950</span> <span class="token punctuation">,</span> <span class="token number">1999</span> <span class="token punctuation">,</span> <span class="token number">2050</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> datasets <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">86</span> <span class="token punctuation">,</span> <span class="token number">114</span> <span class="token punctuation">,</span> <span class="token number">106</span> <span class="token punctuation">,</span> <span class="token number">106</span> <span class="token punctuation">,</span> <span class="token number">107</span> <span class="token punctuation">,</span> <span class="token number">111</span> <span class="token punctuation">,</span> <span class="token number">133</span> <span class="token punctuation">,</span> <span class="token number">221</span> <span class="token punctuation">,</span> <span class="token number">783</span> <span class="token punctuation">,</span> <span class="token number">2478</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> label <span class="token punctuation">:</span> <span class="token string">"Africa"</span> <span class="token punctuation">,</span> borderColor <span class="token punctuation">:</span> <span class="token string">"#3e95cd"</span> <span class="token punctuation">,</span> fill <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">282</span> <span class="token punctuation">,</span> <span class="token number">350</span> <span class="token punctuation">,</span> <span class="token number">411</span> <span class="token punctuation">,</span> <span class="token number">502</span> <span class="token punctuation">,</span> <span class="token number">635</span> <span class="token punctuation">,</span> <span class="token number">809</span> <span class="token punctuation">,</span> <span class="token number">947</span> <span class="token punctuation">,</span> <span class="token number">1402</span> <span class="token punctuation">,</span> <span class="token number">3700</span> <span class="token punctuation">,</span> <span class="token number">5267</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> label <span class="token punctuation">:</span> <span class="token string">"Asia"</span> <span class="token punctuation">,</span> borderColor <span class="token punctuation">:</span> <span class="token string">"#8e5ea2"</span> <span class="token punctuation">,</span> fill <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">168</span> <span class="token punctuation">,</span> <span class="token number">170</span> <span class="token punctuation">,</span> <span class="token number">178</span> <span class="token punctuation">,</span> <span class="token number">190</span> <span class="token punctuation">,</span> <span class="token number">203</span> <span class="token punctuation">,</span> <span class="token number">276</span> <span class="token punctuation">,</span> <span class="token number">408</span> <span class="token punctuation">,</span> <span class="token number">547</span> <span class="token punctuation">,</span> <span class="token number">675</span> <span class="token punctuation">,</span> <span class="token number">734</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> label <span class="token punctuation">:</span> <span class="token string">"Europe"</span> <span class="token punctuation">,</span> borderColor <span class="token punctuation">:</span> <span class="token string">"#3cba9f"</span> <span class="token punctuation">,</span> fill <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">40</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token number">16</span> <span class="token punctuation">,</span> <span class="token number">24</span> <span class="token punctuation">,</span> <span class="token number">38</span> <span class="token punctuation">,</span> <span class="token number">74</span> <span class="token punctuation">,</span> <span class="token number">167</span> <span class="token punctuation">,</span> <span class="token number">508</span> <span class="token punctuation">,</span> <span class="token number">784</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> label <span class="token punctuation">:</span> <span class="token string">"Latin America"</span> <span class="token punctuation">,</span> borderColor <span class="token punctuation">:</span> <span class="token string">"#e8c3b9"</span> <span class="token punctuation">,</span> fill <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">6</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">7</span> <span class="token punctuation">,</span> <span class="token number">26</span> <span class="token punctuation">,</span> <span class="token number">82</span> <span class="token punctuation">,</span> <span class="token number">172</span> <span class="token punctuation">,</span> <span class="token number">312</span> <span class="token punctuation">,</span> <span class="token number">433</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> label <span class="token punctuation">:</span> <span class="token string">"North America"</span> <span class="token punctuation">,</span> borderColor <span class="token punctuation">:</span> <span class="token string">"#c45850"</span> <span class="token punctuation">,</span> fill <span class="token punctuation">:</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> options <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> title <span class="token punctuation">:</span> <span class="token punctuation">{</span> display <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> text <span class="token punctuation">:</span> <span class="token string">"World population per region (in millions)"</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> legend <span class="token punctuation">:</span> <span class="token punctuation">{</span> display <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> position <span class="token punctuation">:</span> <span class="token string">"bottom"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
The difference with the single column chart above, the data line chart is 1 array, each element will contain:
- data: population value over the years
- label: continental name
- borderColor: line color
- fill: here to fill or not (color the container area)
Options here:
- title: also the chart graph
- lengend: this time the line chart, we want to display the caption with the position top / right / bottom / left
c) pie chart
Similarly we have 1 example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token operator"><</span> Doughnut data <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> labels <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"Africa"</span> <span class="token punctuation">,</span> <span class="token string">"Asia"</span> <span class="token punctuation">,</span> <span class="token string">"Europe"</span> <span class="token punctuation">,</span> <span class="token string">"Latin America"</span> <span class="token punctuation">,</span> <span class="token string">"North America"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> datasets <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> label <span class="token punctuation">:</span> <span class="token string">"Population (millions)"</span> <span class="token punctuation">,</span> backgroundColor <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">"#3e95cd"</span> <span class="token punctuation">,</span> <span class="token string">"#8e5ea2"</span> <span class="token punctuation">,</span> <span class="token string">"#3cba9f"</span> <span class="token punctuation">,</span> <span class="token string">"#e8c3b9"</span> <span class="token punctuation">,</span> <span class="token string">"#c45850"</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> data <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token number">2478</span> <span class="token punctuation">,</span> <span class="token number">5267</span> <span class="token punctuation">,</span> <span class="token number">734</span> <span class="token punctuation">,</span> <span class="token number">784</span> <span class="token punctuation">,</span> <span class="token number">433</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> option <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">{</span> title <span class="token punctuation">:</span> <span class="token punctuation">{</span> display <span class="token punctuation">:</span> <span class="token boolean">true</span> <span class="token punctuation">,</span> text <span class="token punctuation">:</span> <span class="token string">"Predicted world population (millions) in 2050"</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">/</span> <span class="token operator">></span> |
Conclude:
react-chartjs2 with chartjs is a duo worth using for drawing charts, because it supports almost all common chart types. In addition, it also supports config to get the corresponding chart or event set (when clicking on each item, etc.)
In addition, it also supports set animation, style gradients, etc. or zooming actions via config extensions (manual code or library also). See you on the next post with more details
Refer
- Chartjs homepage: https://www.chartjs.org/
- React-chartjs2 homepage: https://www.chartjs.org/docs/latest/getting-started/
- Docs: https://www.chartjs.org/docs/latest/getting-started
- Common examples: https://tobiasahlin.com/blog/chartjs-charts-to-get-you-started/