当前位置: 首页 > 知识库问答 >
问题:

如何在chart.js中显示每个切片的饼图数据值

尉迟跃
2023-03-14

我不知道如何用图表来做这件事。js。

请帮帮我。

我的Javascript代码:

function drawPie(canvasId,data,legend){
    var ctx = $("#pie-canvas-" + canvasId).get(0).getContext("2d");

    var piedata = [];
    $.each(data,function(i,val){
        piedata.push({value:val.count,color:val.color,label:val.status});
    });
    var options =
    {
        tooltipTemplate: "<%= Math.round(circumference / 6.283 * 100) %>%",
    }
    var pie = new Chart(ctx).Pie(piedata,options);
    if(legend)document.getElementById("legend").innerHTML = pie.generateLegend();
}

php代码:

printf('<table><tr>');
echo '<td style="text-align: right;"><canvas id="pie-canvas-'
    . $canvasId
    . '" width="256" height="256" ></canvas></td><td style="text-align: left;width:360px;height:auto" id="legend" class="chart-legend"></td></tr></table>';

     echo '<script type="text/javascript">drawPie('
    . $canvasId
    . ', '
    . $data3
    .', '
    . $legend
    . ');</script>';

共有3个答案

尉迟明辉
2023-03-14

据我所知,我不相信那个图表。JS有任何功能来帮助在饼图上绘制文本。但这并不意味着你不能用原生JavaScript自己完成。我将为您提供一个如何执行此操作的示例,下面是为饼图中的每个段绘制文本的代码:

function drawSegmentValues()
{
    for(var i=0; i<myPieChart.segments.length; i++) 
    {
        // Default properties for text (size is scaled)
        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 to middle of text
        var w_offset = ctx.measureText(value).width/2;
        var h_offset = textSize/4;

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

饼图有一个存储在PieChart.segments中的段数组,我们可以查看这些段的start AngleendAngle,以确定文本之间的角度MiddleAngle.然后我们将沿着这个方向移动半径/2,以弧度表示图表的中间点。

在上面的例子中,完成了一些其他的清理操作,由于在fillText()中绘制的文本的位置是右上角,我们需要获得一些偏移值来更正。最后根据图表本身的大小确定文本大小,图表越大,文本越大。

小提琴示例

只需稍加修改,就可以将数据集的离散数值更改为图形中的百分位数。要获取数据集中项目的总,请调用此总值。然后在每个分段上,您可以通过执行以下操作找到百分比:

Math.round(myPieChart.segments[i].value/totalValue*100)+'%';

这里的部分是myPieChart。段[i]。value/totalValue是计算段在图表中所占百分比的值。例如,如果当前段的值为50,而总值为200。然后段占用的百分比将为:50/200=

var value = myPieChart.segments[i].value/totalValue*100;
if(Math.round(value) !== value)
    value = (myPieChart.segments[i].value/totalValue*100).toFixed(1);
value = value + '%';

用小数点修改百分位数示例

摆弄整数百分位数示例

方恺
2023-03-14

我发现了一个优秀的Chart.js插件,它完全符合你的要求:https://github.com/emn178/Chart.PieceLabel.js

郭恩
2023-03-14

对于Chart.js2.0及以上版本,Chart对象数据已更改。对于使用Chart.js2.0的用户,下面是使用HTML5 CanvasfillText()方法在饼图切片内显示数据值的示例。代码也适用于甜甜圈图表,唯一的区别是创建图表时的type:'pie'type:'doughut'

脚本:

Javascript

var data = {
    datasets: [{
        data: [
            11,
            16,
            7,
            3,
            14
        ],
        backgroundColor: [
            "#FF6384",
            "#4BC0C0",
            "#FFCE56",
            "#E7E9ED",
            "#36A2EB"
        ],
        label: 'My dataset' // for legend
    }],
    labels: [
        "Red",
        "Green",
        "Yellow",
        "Grey",
        "Blue"
    ]
};

var pieOptions = {
  events: false,
  animation: {
    duration: 500,
    easing: "easeOutQuart",
    onComplete: function () {
      var ctx = this.chart.ctx;
      ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
      ctx.textAlign = 'center';
      ctx.textBaseline = 'bottom';

      this.data.datasets.forEach(function (dataset) {

        for (var i = 0; i < dataset.data.length; i++) {
          var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
              total = dataset._meta[Object.keys(dataset._meta)[0]].total,
              mid_radius = model.innerRadius + (model.outerRadius - model.innerRadius)/2,
              start_angle = model.startAngle,
              end_angle = model.endAngle,
              mid_angle = start_angle + (end_angle - start_angle)/2;

          var x = mid_radius * Math.cos(mid_angle);
          var y = mid_radius * Math.sin(mid_angle);

          ctx.fillStyle = '#fff';
          if (i == 3){ // Darker text color for lighter background
            ctx.fillStyle = '#444';
          }
          var percent = String(Math.round(dataset.data[i]/total*100)) + "%";      
          //Don't Display If Legend is hide or value is 0
          if(dataset.data[i] != 0 && dataset._meta[0].data[i].hidden != true) {
            ctx.fillText(dataset.data[i], model.x + x, model.y + y);
            // Display percent in another line, line break doesn't work for fillText
            ctx.fillText(percent, model.x + x, model.y + y + 15);
          }
        }
      });               
    }
  }
};

var pieChartCanvas = $("#pieChart");
var pieChart = new Chart(pieChartCanvas, {
  type: 'pie', // or doughnut
  data: data,
  options: pieOptions
});

HTML

<canvas id="pieChart" width=200 height=200></canvas>

jsFiddle

 类似资料:
  • 我最近更新了我的charts.js库到最新版本(2.5.0)。这个版本不显示图表上的标签。 我有一个在《小提琴手:http://jsfiddle.net/g6fajwg8》上工作的例子。 但是,我完全按照示例中的方式定义了我的图表,但仍然看不到图表上的标签。 注意:在Google和Stackoverflow上有很多这样的问题,但其中大多数都是关于以前的版本,这些版本在它们上运行良好。

  • 我一直在使用Chart.Js,但由于时间限制和个人对D3等人的SVG路线的偏好,我尽最大努力避免进入画布本身。 我在仪表板页面上混合了各种图表,除了一个问题外,其他一切看起来都很棒——你必须将鼠标悬停在饼图段上才能看到潜在的%或值。 对于仪表板视图,我的用户更喜欢快速查看数据段上的一些数据标签,就像Excel一样,可能更容易用图像进行解释: https://support.office.com/e

  • 问题内容: 在我的项目中,我想在饼图中显示每个员工在系统中注册了多少个机构。机构表包含一个外键,该外键具有注册该机构的员工的ID,因此每个机构都有与之关联的一名员工。 我构建了以下代码,但无法继续进行下去: 我尝试在查询中使用GROUP BY,但这并不能解决问题。 编辑 :实际上,使用GROUP BY语句对于此作业是必需的。请阅读接受的答案及其评论。 问题答案: 您不需要。使用接受查询的构造函数“

  • 我的图表中x轴上的点太多。我想限制显示点的最大值为100。但同时仍然显示相同的图表。完全相同的图表-但点数较少。 我的图表截图有太多的点 我不知道如何在服务器端用PHP实现它,所以我在想在chart.js中是否有客户端的解决方案?

  • 问题内容: 需要查看条形图中的条形所代表的确切值,而不是Y轴上的近似值。 怎么可能呢? 谢谢阅读! 问题答案: 在iReport 3.7.6中,您可以仅选中BarPlot属性下的“显示标签”框。 在以前的版本(3.1.4)中,我必须创建一个ChartCustomizer类。 如果您需要格式化标签中的数字(例如,设置为百分比,添加千位分隔符等),那么即使在新版本中,您也绝对需要一个ChartCust

  • 问题内容: 我正在使用python 3.5.2,我想制作一个嵌入了png图像的饼图。我有一些我想插入切片的散装产品的图片。例如,一片草莓,另一片覆盆子。就像http://www.python- course.eu/images/pie_chart_with_raspberries.png 显示的图片一样。 我可以生成图像,甚至可以绘制图像而不是点,如此处所示Matplotlib:如何绘制图像而不是