Create a simple pie chart from database values with chart.js
Graph of winning / losing probability that is common in sports competitions (setting of up to 100%)

forecasts table num is the win probability of win_school win_school is the team that is expected to win lose_school is a team that is expected to lose
| id | num | user_id | win_school | lose_school | 
|---|---|---|---|---|
| 1 | 60 | 1 | A school | B school | 
Setting to fetch data with id 1
def show
  @forecast = Forecast.find(params[:id])
end
<div class="win"><%= @forecast.win_school %></div><!--A school-->
<div class="lose"><%= @forecast.lose_school %></div><!--B school-->
<div class="win-rate"><%= @forecast.num %></div><!-- 60 -->
<div class="pie"><!--Graph drawing part-->
  <div style="width:60%; height:60%";><canvas id="PieChart"></canvas></div>
</div>
<%= javascript_pack_tag 'forecast' %> <!--js read-->
If you want to hide it, use hidden.
<div hidden class="win">
app > javascript > packs > forecast.js
var ctx = document.getElementById("PieChart");
var win = document.getElementsByClassName("win").textContent //Get value from class name win(A school)
var lose = document.getElementsByClassName("lose").textContent //Get value from class name lose(B school)
var winnum = document.getElementsByClassName("win-rate").textContent  //Class name win-Get value from rate(60)
var PieChart = new Chart(ctx, {
  type: 'pie', //Meaning that the type of graph is a pie chart
  data: {
    labels: [win,lose], //Pie chart label(Pie chart A school,Where it is displayed as B school)
    datasets: [{
      backgroundColor: [ //Pie chart color
        "#FF0000", //First color(Label win)Is red
        "#33CCFF", //Second color(Label lose)Is light blue
      ],
      data: [winnum,100-winnum] //Graph values See below
    }]
  },
  options: { //Optional customization?
    title: {
      display: true,
      text: 'Victory probability'//Graph title
    }
  }
});
data: is inserting a value into the graph Since the variable winnum contains 60, the second is 100-60 and 40 is entered. The winning percentage of A school is 60%, and the winning percentage of B school is 40%.
.js
data: [winnum,100-winnum]
This time I got the value from the html file If you want to get it from the controller, I think you should use gon
Recommended Posts