Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

189
Visualizações
Hiding spaces with zero values in bar chart with chart.js

I've got bar charts with multiple labels and zero data values for some labels.

enter image description here

I need to hide zero-values in chart and draw bars in the middle of current label value. How can i do it?

Here source code:

var chartDebugData = {
    labels: ["2021-11-16", "2021-11-17", "2021-11-18"],
    datasets: [
        {
            label: "Data1",
            backgroundColor: "rgba(161, 198, 76, 0.5)",
            borderColor: "rgba(161, 198, 76)",
            data: [
                66,
                77,
                0,
            ],
            borderWidth: 2,
        },
        {
            label: "Data2",
            backgroundColor: "rgba(107, 228, 46, 0.5)",
            borderColor: "rgba(107, 228, 46)",
            data: [
                55,
                0,
                82,
            ],
            borderWidth: 2,
        },
    ]
}

const canvasEl = document.getElementById("charts");

// Draw graph
new Chart(canvasEl, {
    type: 'bar',
    data: chartDebugData,
    options: {
        barValueSpacing: 5,
    },
});

JSFiddle: https://jsfiddle.net/70n3h1r4/4/

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

You can use a custom plugin to go into the propertys before the draw, check if its the only bar if so make it wider and replace it on the chart:

var chartDebugData = {
  labels: ["2021-11-16", "2021-11-17", "2021-11-18"],
  datasets: [{
      label: "Data1",
      backgroundColor: "rgba(161, 198, 76, 0.5)",
      borderColor: "rgba(161, 198, 76)",
      data: [
        66,
        77,
        0,
        0
      ],
      borderWidth: 2,
    },
    {
      label: "Data2",
      backgroundColor: "rgba(107, 228, 46, 0.5)",
      borderColor: "rgba(107, 228, 46)",
      data: [
        55,
        0,
        82,
        0
      ],
      borderWidth: 2,
    },
  ]
}

const canvasEl = document.getElementById("charts");

// Draw graph
new Chart(canvasEl, {
  type: 'bar',
  data: chartDebugData,
  options: {
    barValueSpacing: 5,
  },
  plugins: [{
    beforeDatasetsDraw: (chart, args, opts) => {
      const zeroPositions = chart.data.datasets.reduce((acc, curr) => {
        curr.data.forEach((dp, i) => {
          if (dp === 0) {
            acc[i] ? acc[i]++ : acc[i] = 1
          }
        });
        return acc;
      }, {});

      chart.data.datasets.forEach((d, di) => {
        const meta = chart.getDatasetMeta(di);

        d.data.forEach((dp, i) => {
          if (zeroPositions[i] !== chart.data.datasets.length - 1 || dp === 0) {
            return;
          }
          if (i === 0 && meta.data[i].width !== meta.data[i + 1].width) {
            return;
          } else if (meta.data[i].width !== meta.data[i - 1].width) {
            return;
          }

          meta.data[i].width = meta.data[i].width * chart.data.datasets.length;
          meta.data[i].x = chart.scales.x._labelItems[i].translation[0];
        });
      });
    }
  }]
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.6.2/chart.min.js"></script>
<canvas id="charts" width="900" height="450"></canvas>

about 4 years ago · Juan Pablo Isaza Relatório

0

Solution was simple: replace zero values with null and add option skipNull: true,

Here struct with data:

var chartDebugData = {
    labels: ["2021-11-16", "2021-11-17", "2021-11-18"],
    datasets: [
        {
            label: "Data1",
            backgroundColor: "rgba(161, 198, 76, 0.5)",
            borderColor: "rgba(161, 198, 76)",
            data: [
                66,
                77,
                null,
            ],
            borderWidth: 2,
            skipNull: true,
        },
        {
            label: "Data2",
            backgroundColor: "rgba(107, 228, 46, 0.5)",
            borderColor: "rgba(107, 228, 46)",
            data: [
                55,
                null,
                82,
            ],
            borderWidth: 2,
            skipNull: true,
        },
    ]
}

JSFiddle: https://jsfiddle.net/tLzhm6p9/

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda