1. What is Chartkick?
Chartkick is a library that helps us visualize statistics data easily. It has frameworks that support many different programming languages, such as:
- Ruby on rails
- Python
- Javascript
- …
It is also possible to use different adapter libraries such as Chart.js, highcharts or googlechart.
2. Installation instructions
2.1. Add the gem "chartkick"
to Gemfile then bundle
2.2. Install the necessary JS libraries to draw the chart
Installed with ChartJS
- With Rails 6 / Webpacker:
Run the following command to download the necessary libraries to the directory:
yarn add chartkick chart.js
and in the app / javascript / packs / application.js file add the following lines:
1 2 3 | <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"chartkick"</span> <span class="token punctuation">)</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"chart.js"</span> <span class="token punctuation">)</span> |
- With Rails 5:
Add the following lines to app/assets/javascripts/application.js
:
1 2 3 | <span class="token comment">//= require chartkick</span> <span class="token comment">//= require Chart.bundle</span> |
Install with GoogleChart
Add this asset tag into the layout:
1 2 | <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> javascript_include_tag <span class="token string">"https://www.gstatic.com/charts/loader.js"</span> <span class="token operator">%</span> <span class="token operator">></span> |
- With Rails 6 / Webpacker, we add:
We run yarn add chartkick
to install chartkick and in app/javascript/packs/application.js
we add:
1 2 | <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"chartkick"</span> <span class="token punctuation">)</span> |
- With Rails 5:
Add the file app/assets/javascripts/application.js
:
1 2 | <span class="token comment">//= require chartkick</span> |
Note: To configure a language or ggmap API for googlechart, just add this line before using the chart:
1 2 | Chartkick <span class="token punctuation">.</span> <span class="token function">configure</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> language <span class="token punctuation">:</span> <span class="token string">"de"</span> <span class="token punctuation">,</span> mapsApiKey <span class="token punctuation">:</span> <span class="token string">"..."</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> |
Install with highcharts
- With Rails 6 / Webpacker:
Run the following command to download the necessary libraries to the directory:
yarn add chartkick chart.js
and in the app / javascript / packs / application.js file add the following lines:
1 2 | <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"chartkick"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"highcharts"</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> |
- For Rails 5, we need to download highcharts.js in
vendor/assets/javascripts
. If you use Rails 5.1+ then you can use the following command to installyarn add highcharts
. Add the following lines toapp/assets/javascripts/application.js
:
1 2 3 | //= require chartkick //= require highcharts |
2.3. Install the necessary tools for the database to serve statistics
There are a few things that are essential to our statistics, such as GroupDate , Hightop and ActiveMedian.
The installation, please follow the links above.
After you have completed the basic steps you can draw.
3. Draw the characteristic chart
Note: If using multiple chart libraries at once. You have to add the following option (villa option):
1 2 3 4 | <%= line_chart data, adapter: "google" %> <span class="token comment"><!-- or highcharts or chartjs --></span> |
Types of single charts (There is only 1 chart type in a chart)
General syntax:
1 2 | function_chart data <span class="token punctuation">,</span> options <span class="token operator">*</span> |
Data will be a hash or array:
1 2 3 | <span class="token operator"><</span> <span class="token operator">%=</span> <span class="token function">pie_chart</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">"Football"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">10</span> <span class="token punctuation">,</span> <span class="token string">"Basketball"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">5</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">%=</span> pie_chart <span class="token punctuation">[</span> <span class="token punctuation">[</span> <span class="token string">"Football"</span> <span class="token punctuation">,</span> <span class="token number">10</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token string">"Basketball"</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> <span class="token operator">%</span> <span class="token operator">></span> |
For example:
Types of charts:
Line chart
<%= line_chart User.group_by_day(:created_at).count %>
Pie chart
<%= pie_chart Goal.group(:name).count %>
Column chart
<%= column_chart Task.group_by_hour_of_day(:created_at, format: "%l %P").count %>
Bar chart
<%= bar_chart Shirt.group(:size).sum(:price) %>
Area chart
<%= area_chart Visit.group_by_minute(:created_at).maximum(:load_time) %>
Options:
Id, width, and height
1 2 | <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> line_chart data <span class="token punctuation">,</span> id <span class="token punctuation">:</span> <span class="token string">"users-chart"</span> <span class="token punctuation">,</span> width <span class="token punctuation">:</span> <span class="token string">"800px"</span> <span class="token punctuation">,</span> height <span class="token punctuation">:</span> <span class="token string">"500px"</span> <span class="token operator">%</span> <span class="token operator">></span> |
Min and max values
1 2 | <%= line_chart data, min: 1000, max: 5000 %> |
min defaults to 0 for charts with non-negative values. Use nil to let the charting library decide.
Min and max for x-axis – Chart.js
1 2 | <span class="token operator"><</span> <span class="token operator">%=</span> line_chart data <span class="token punctuation">,</span> xmin <span class="token operator">:</span> <span class="token string">"2018-01-01"</span> <span class="token punctuation">,</span> xmax <span class="token operator">:</span> <span class="token string">"2019-01-01"</span> <span class="token operator">%</span> <span class="token operator">></span> |
Colors
1 2 | <%= line_chart data, colors: ["#b00", "#666"] %> |
Stacked columns or bars
1 2 | <%= column_chart data, stacked: true %> |
Discrete axis
1 2 | <span class="token operator"><</span> <span class="token comment">%= line_chart data, discrete: true %></span> |
Label (for single series)
1 2 | <%= line_chart data, label: "Value" %> |
Axis titles
1 2 | <span class="token operator"><</span> <span class="token operator">%=</span> line_chart data <span class="token punctuation">,</span> xtitle <span class="token punctuation">:</span> <span class="token string">"Time"</span> <span class="token punctuation">,</span> ytitle <span class="token punctuation">:</span> <span class="token string">"Population"</span> <span class="token operator">%</span> <span class="token operator">></span> |
Straight lines between points instead of a curve
1 2 | <%= line_chart data, curve: false %> |
Hide points
1 2 | <%= line_chart data, points: false %> |
Show or hide legend
1 2 | <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> line_chart data <span class="token punctuation">,</span> legend <span class="token punctuation">:</span> <span class="token keyword">false</span> <span class="token operator">%</span> <span class="token operator">></span> |
Specify legend position
1 2 | <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> line_chart data <span class="token punctuation">,</span> legend <span class="token punctuation">:</span> <span class="token string">"bottom"</span> <span class="token operator">%</span> <span class="token operator">></span> |
Defer chart creation until after the page loads
1 2 | <%= line_chart data, defer: true %> |
Donut chart
1 2 | <span class="token operator"><</span> <span class="token comment">%= pie_chart data, donut: true %></span> |
Prefix, useful for currency – Chart.js, Highcharts
1 2 | <%= line_chart data, prefix: "$" %> |
Suffix, useful for percentages – Chart.js, Highcharts
1 2 | <%= line_chart data, suffix: "%" %> |
Set a thousands separator – Chart.js, Highcharts
1 2 | <%= line_chart data, thousands: "," %> |
Set a decimal separator – Chart.js, Highcharts
1 2 | <%= line_chart data, decimal: "," %> |
Set significant digits – Chart.js, Highcharts
1 2 | <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> line_chart data <span class="token punctuation">,</span> precision <span class="token punctuation">:</span> <span class="token number">3</span> <span class="token operator">%</span> <span class="token operator">></span> |
Set rounding – Chart.js, Highcharts
1 2 | <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> line_chart data <span class="token punctuation">,</span> round <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token operator">%</span> <span class="token operator">></span> |
Show insignificant zeros, useful for currency – Chart.js, Highcharts
1 2 | <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> line_chart data <span class="token punctuation">,</span> round <span class="token operator">:</span> <span class="token number">2</span> <span class="token punctuation">,</span> zeros <span class="token operator">:</span> <span class="token boolean">true</span> <span class="token operator">%</span> <span class="token operator">></span> |
Friendly byte sizes – Chart.js 2.8+
1 2 | <%= line_chart data, bytes: true %> |
Show a message when data is empty
1 2 | <%= line_chart data, messages: {empty: "No data"} %> |
Refresh data from a remote source every n seconds
1 2 | <%= line_chart url, refresh: 60 %> |
You can pass options directly to the charting library with:
1 2 | <%= line_chart data, library: {backgroundColor: "#eee"} %> |
Optimize performance with a single chart Make your pages load super fast and don’t worry about waiting time. We use it’s own url and load the data.
Create controller
1 2 3 4 5 6 | <span class="token keyword">class</span> <span class="token class-name">ChartsController</span> <span class="token operator"><</span> <span class="token constant">ApplicationController</span> <span class="token keyword">def</span> completed_tasks render json <span class="token punctuation">:</span> <span class="token constant">Task</span> <span class="token punctuation">.</span> <span class="token function">group_by_day</span> <span class="token punctuation">(</span> <span class="token symbol">:completed_at</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> count <span class="token keyword">end</span> <span class="token keyword">end</span> |
** If used to draw a variety of styles with the same overseas life:
1 2 | render json <span class="token punctuation">:</span> <span class="token constant">Task</span> <span class="token punctuation">.</span> <span class="token function">group</span> <span class="token punctuation">(</span> <span class="token symbol">:goal_id</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">group_by_day</span> <span class="token punctuation">(</span> <span class="token symbol">:completed_at</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> count <span class="token punctuation">.</span> chart_json |
Draw a chart Example of a line chart:
1 2 | <%= line_chart completed_tasks_charts_path %> |
4. Custom some charts as you like
4.1. Draw a server side rendering combination diagram
We will combine different types of charts in one client-side chart.
- Advantages:
- Fast deployment
- Simple
- Defect:
- The page load time is slow due to data aggregation
For example:
1 2 3 4 5 6 | <%= line_chart [ {name: "Data1", type: "line", data: data}, {name: "Data1", type: "column", data: data} ], prefix: "$", adapter: "highcharts", messages: {empty: I18n.t("chart.message.empty")} %> |
At this point, the chart will have 1 line and a column.
4.2. Draw a client side rendering combination chart
Demo code
1 2 3 4 5 6 7 8 | var data = [ {name: "Apple", type: "line", data: {"Tuesday": 3, "Friday": 4}}, {name: "Pear", type: "line", data: {"Tuesday": 1, "Friday": 8}}, {name: "Carrot", type: "line", data: {"Tuesday": 3, "Friday": 4}}, {name: "Beet", type: "column", data: {"Tuesday": 1, "Friday": 8}} ]; new Chartkick.LineChart("chart-12345", data, {adapter:"highcharts"}); |