当数据值为 0 时,Django Chartjs 输出“无数据”

Posted

技术标签:

【中文标题】当数据值为 0 时,Django Chartjs 输出“无数据”【英文标题】:Django Chartjs outputs "No data" when data has value 0 【发布时间】:2021-03-11 18:48:48 【问题描述】:

我试图用 Django 和 chartJS 绘制一些甜甜圈图。但卡在了一个问题上。 当数据的值 = 0 时,我希望输出代替甜甜圈作为“无数据”。

我研究了 ngIf,但输出不如预期。 这是我的代码

index.html

<div class="card-body card-body-cascade text-center"><div class="chartjs-size-monitor" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px; overflow: hidden; pointer-events: none; visibility: hidden; z-index: -1;"><div class="chartjs-size-monitor-expand" style="position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;">
<div style="position:absolute;width:1000000px;height:1000000px;left:0;top:0"></div></div><div class="chartjs-size-monitor-shrink" style="position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;">
<div style="position:absolute;width:200%;height:200%;left:0; top:0"></div></div></div>
<canvas id="doughnutChart"   class="chartjs-render-monitor" style="display: block; width: 408px; height: 272px;" ng-if="data.length <= 0"></canvas>
<span ng-if="data == 0">No data</span>
</div>

甜甜圈的JS是这样的

<script>
chartIt();
    async function chartIt() 
    const data = await getData();
    var ctx = document.getElementById("doughnutChart").getContext('2d');
    var myLineChart = new Chart(ctx, 
      type: 'doughnut',
      data: 
        labels: ['d1','d2'],
        datasets: [
          data: ['0','0'],
          backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1", "#4D5360"],
          hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5", "#616774"]
        ]
      ,
      options: 
        responsive: true
      
    );

</script>

【问题讨论】:

【参考方案1】:

Plugin Core API 提供了一系列可用于执行自定义代码的挂钩。您可以使用afterDraw 钩子在画布上使用CanvasRenderingContext2D 直接写入文本“无数据”,以防所有data 值中的sum 为零。

请查看您修改后的代码,看看它是如何工作的。

new Chart('doughnutChart', 
  type: 'doughnut',
  plugins: [
    afterDraw: function(chart) 
      let sum = chart.data.datasets[0].data.map(v => parseInt(v)).reduce((a, b) => a + b, 0);
      if (sum == 0) 
        let width = chart.chart.width,
          height = chart.chart.height + 35,
          ctx = chart.chart.ctx;
        ctx.save();
        let fontSize = (height / 200).toFixed(2);
        ctx.font = fontSize + "em sans-serif";
        ctx.textBaseline = "middle";
        let text = 'No Data',
          textX = Math.round((width - ctx.measureText(text).width) / 2),
          textY = height / 2;
        ctx.fillText(text, textX, textY);
        ctx.restore();
      
    
  ],
  data: 
    labels: ['d1', 'd2'],
    datasets: [
      data: ['0', '0'],
      backgroundColor: ["#F7464A", "#46BFBD", "#FDB45C", "#949FB1", "#4D5360"],
      hoverBackgroundColor: ["#FF5A5E", "#5AD3D1", "#FFC870", "#A8B3C5", "#616774"]
    ]
  ,
  options: 
    responsive: true
  
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
<canvas id="doughnutChart" ></canvas>

【讨论】:

以上是关于当数据值为 0 时,Django Chartjs 输出“无数据”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中显示来自 chartjs 视图的数据?

Django chartjs多个图表堆叠

当虚拟数据存储在 Django 数据库中且其 id 为 none 且所有值为 null 时如何解决错误

Chartjs 没有在我的 Django 项目中显示图表

Chartjs 条形图在悬停时显示旧数据

科比职业生涯场均得分~django+chartjs数据可视化柱形图简单