如何使用图表。用js脚本绘制多个饼图

时间:2022-04-06 20:35:30

I'm using below code for pie chart and I want to draw same pie chart with multiples ids for example id="canvas2".

我使用下面的代码来绘制饼图,我想绘制具有多个id的饼图,例如id="canvas2"。

I don't know how to do this with chart.js?

我不知道怎么用chart.js做这个?

Please help me.

请帮助我。

I'm using this jsFiddle example

我用的是jsFiddle例子

http://jsfiddle.net/2gapedks/

http://jsfiddle.net/2gapedks/

var data = [
  {
    value: 300,
    color:"#F7464A",
    highlight: "#FF5A5E",
    label: "Red"
  },
  {
    value: 50,
    color: "#46BFBD",
    highlight: "#5AD3D1",
    label: "Green"
  },
  {
    value: 100,
    color: "#FDB45C",
    highlight: "#FFC870",
    label: "Yellow"
  }
];

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var midX = canvas.width/2;
var midY = canvas.height/2

// Create a pie chart
var myPieChart = new Chart(ctx).Pie(data, {
  showTooltips: false,
  onAnimationProgress: drawSegmentValues
});

var radius = myPieChart.outerRadius;

function drawSegmentValues()
{
  for(var i=0; i<myPieChart.segments.length; i++) 
  {
    ctx.fillStyle="white";
    var textSize = canvas.width/10;
    ctx.font= textSize+"px Verdana";
    // Get needed variables
    var value = myPieChart.segments[i].value;
    var startAngle = myPieChart.segments[i].startAngle;
    var endAngle = myPieChart.segments[i].endAngle;
    var middleAngle = startAngle + ((endAngle - startAngle)/2);

    // Compute text location
    var posX = (radius/2) * Math.cos(middleAngle) + midX;
    var posY = (radius/2) * Math.sin(middleAngle) + midY;

    // Text offside by middle
    var w_offset = ctx.measureText(value).width/2;
    var h_offset = textSize/4;

    ctx.fillText(value, posX - w_offset, posY + h_offset);
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
<canvas id="canvas" width=300 height=300></canvas>

1 个解决方案

#1


4  

If I understand you correctly,

如果我理解正确,

The logic is to create a function that draw the chart on accepted canvas. Is this way, you can call the function on each canvas you want.

逻辑是创建一个在可接受的画布上绘制图表的函数。这样,您就可以在您想要的每个画布上调用函数。

For example:

例如:

draw(document.getElementById("canvas"));
draw(document.getElementById("canvas2"));

see the following code:

看下面的代码:

var allData = 
    [
      [
        {
          value: 300,
          color:"#F7464A",
          highlight: "#FF5A5E",
          label: "Red"
        },
        {
          value: 50,
          color: "blue",
          highlight: "#5AD3D1",
          label: "Green"
        },
        {
          value: 100,
          color: "#FDB45C",
          highlight: "#FFC870",
          label: "Yellow"
        }
      ],
      [
        {
          value: 200,
          color:"#FF0",
          highlight: "#FF5A5E",
          label: "Red"
        },
        {
          value: 70,
          color: "purple",
          highlight: "#5AD3D1",
          label: "Green"
        },
        {
          value: 80,
          color: "pink",
          highlight: "#FFC870",
          label: "Yellow"
        }
      ]
    ];

function draw(canvas, data) {
  var ctx = canvas.getContext("2d");
  var midX = canvas.width/2;
  var midY = canvas.height/2

  // Create a pie chart
  var myPieChart = new Chart(ctx).Pie(data, {
    showTooltips: false,
    onAnimationProgress: drawSegmentValues
  });

  var radius = myPieChart.outerRadius;

  function drawSegmentValues()
  {
    for(var i=0; i<myPieChart.segments.length; i++) 
    {
      ctx.fillStyle= getTextColor(myPieChart.segments[i].fillColor);
      var textSize = canvas.width/10;
      ctx.font= textSize+"px Verdana";
      // Get needed variables
      var value = myPieChart.segments[i].value;
      var startAngle = myPieChart.segments[i].startAngle;
      var endAngle = myPieChart.segments[i].endAngle;
      var middleAngle = startAngle + ((endAngle - startAngle)/2);

      // Compute text location
      var posX = (radius/2) * Math.cos(middleAngle) + midX;
      var posY = (radius/2) * Math.sin(middleAngle) + midY;

      // Text offside by middle
      var w_offset = ctx.measureText(value).width/2;
      var h_offset = textSize/4;

      ctx.fillText(value, posX - w_offset, posY + h_offset);
    }
  }
}

function getTextColor(color) {
  switch(color) {
    case 'pink':
    default: 
      return 'white';
    case 'blue':
      return 'black';
  }
}

draw(document.getElementById("canvas"), allData[0]);
draw(document.getElementById("canvas2"), allData[1]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
<canvas id="canvas" width=300 height=300></canvas>
<canvas id="canvas2" width=300 height=300></canvas>

#1


4  

If I understand you correctly,

如果我理解正确,

The logic is to create a function that draw the chart on accepted canvas. Is this way, you can call the function on each canvas you want.

逻辑是创建一个在可接受的画布上绘制图表的函数。这样,您就可以在您想要的每个画布上调用函数。

For example:

例如:

draw(document.getElementById("canvas"));
draw(document.getElementById("canvas2"));

see the following code:

看下面的代码:

var allData = 
    [
      [
        {
          value: 300,
          color:"#F7464A",
          highlight: "#FF5A5E",
          label: "Red"
        },
        {
          value: 50,
          color: "blue",
          highlight: "#5AD3D1",
          label: "Green"
        },
        {
          value: 100,
          color: "#FDB45C",
          highlight: "#FFC870",
          label: "Yellow"
        }
      ],
      [
        {
          value: 200,
          color:"#FF0",
          highlight: "#FF5A5E",
          label: "Red"
        },
        {
          value: 70,
          color: "purple",
          highlight: "#5AD3D1",
          label: "Green"
        },
        {
          value: 80,
          color: "pink",
          highlight: "#FFC870",
          label: "Yellow"
        }
      ]
    ];

function draw(canvas, data) {
  var ctx = canvas.getContext("2d");
  var midX = canvas.width/2;
  var midY = canvas.height/2

  // Create a pie chart
  var myPieChart = new Chart(ctx).Pie(data, {
    showTooltips: false,
    onAnimationProgress: drawSegmentValues
  });

  var radius = myPieChart.outerRadius;

  function drawSegmentValues()
  {
    for(var i=0; i<myPieChart.segments.length; i++) 
    {
      ctx.fillStyle= getTextColor(myPieChart.segments[i].fillColor);
      var textSize = canvas.width/10;
      ctx.font= textSize+"px Verdana";
      // Get needed variables
      var value = myPieChart.segments[i].value;
      var startAngle = myPieChart.segments[i].startAngle;
      var endAngle = myPieChart.segments[i].endAngle;
      var middleAngle = startAngle + ((endAngle - startAngle)/2);

      // Compute text location
      var posX = (radius/2) * Math.cos(middleAngle) + midX;
      var posY = (radius/2) * Math.sin(middleAngle) + midY;

      // Text offside by middle
      var w_offset = ctx.measureText(value).width/2;
      var h_offset = textSize/4;

      ctx.fillText(value, posX - w_offset, posY + h_offset);
    }
  }
}

function getTextColor(color) {
  switch(color) {
    case 'pink':
    default: 
      return 'white';
    case 'blue':
      return 'black';
  }
}

draw(document.getElementById("canvas"), allData[0]);
draw(document.getElementById("canvas2"), allData[1]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
<canvas id="canvas" width=300 height=300></canvas>
<canvas id="canvas2" width=300 height=300></canvas>