【问题标题】:How can I format chart.js data labels while using chart.js datalabels plugin?如何在使用 chart.js 数据标签插件时格式化 chart.js 数据标签?
【发布时间】:2021-08-16 16:24:29
【问题描述】:

我有这个图表在 chart.js 中工作,它从 csv 文件中提取数据。到目前为止,我对自己的成就感到满意,但我似乎仍然无法以某些方式影响样式。我正在使用 chart.js 旧版本 2.9.3

  1. 我正在使用 datalabel 插件将值添加到图表上的条形图,但是如何设置值的字体样式?我想给它们上色并让它们显示在条形区域之外。我一直在尝试将样式标签放在不同的区域,但似乎没有任何效果。我在代码中使用红色进行测试。 我还尝试了一个名为 formatter 的 javascript 函数,但这似乎也没有任何作用。也许我的变量名有误?

  2. 我也想去掉底部的数字,但勾选:{display: false} 似乎不起作用。

对不起,我是一个代码新手,感到很沮丧。任何帮助将不胜感激。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Project 1</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/chartjs-plugin-datalabels/1.0.0/chartjs-plugin-datalabels.min.js" integrity="sha512-XulchVN83YTvsOaBGjLeApZuasKd8F4ZZ28/aMHevKjzrrjG0lor+T4VU248fWYMNki3Eimk+uwdlQS+uZmu8g==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<link rel="stylesheet" type="text/css" href="style.css">

<body>
  <div class="wrapper">
    <h1>MY CHART HERE</h1>
    <h2>Results of a survey </h2>
    <canvas id="myChart" width="350" height="250" style="background-color:white;"></canvas>
  </div>

  <script>
    window.addEventListener('load', setup);

    async function setup() {
      var ctx = document.getElementById('myChart').getContext('2d');
      var poll = await getData();
      var myChart = new Chart(ctx, {
        type: 'horizontalBar',

        data: {
          labels: poll.years,
          datasets: [{
            label: 'how many people (%)',
            data: poll.vals,


            backgroundColor: [
              '#cd0000',
              '#eb7d44',
              '#70AA5B',
              '#CAF0FD',
              '#134D85',
            ],
          }]
        },

        options: {
          scaleShowLabels: false,
          plugins: {
            datalabels: {
              align: 'end',
              color: 'red',
              formatter: function(value, context) {
                return context.chart.data.labels[context.dataIndex];
              }

            }
          },

          layout: {
            padding: {
              left: 0,
              right: 0,
              top: 8,
              bottom: 0
            }
          },

          responsive: true,
          title: {
            display: false
          },


          legend: {
            display: true,
            position: 'top',
            usePointStyle: true,
            padding: 1,
            labels: {
              boxWidth: 15
            }
          },

          scales: {
            yAxes: [{
              ticks: {
                display: false,
                color: '#ffffff',
                zeroLineColor: '#ffffff'
              }
            }],

            xAxes: [{
              ticks: {
                display: false
              },
            }],
          }
        },

        plugins: [ChartDataLabels],
        options: {
          datalabels: {
            color: 'red',
            align: 'end'
          }
        },

      });
    }

    async function getData() {
      // const response = await fetch('testdata.csv');
      var response = await fetch('data/test2.csv');
      var data = await response.text();
      data = data.replace(/"/g, "");
      var years = [];
      var vals = [];
      var rows = data.split('\n').slice(1);

      rows = rows.slice(0, rows.length - 1);
      rows = rows.filter(row => row.length !== 0)

      rows.forEach(row => {
        var cols = row.split(",");
        years.push(cols[0]);
        vals.push(0 + parseFloat(cols[2]));
      });
      console.log(years, vals);
      return {
        years,
        vals
      };

    }
  </script>
</body>

</html>

图表图片:

【问题讨论】:

  • 这里好像也发不了图片。呜呜!!
  • 这里是图表屏幕截图的链接dropbox.com/s/42absds48cpsj3p/chart.jpg?dl=0
  • 您能否提供问题的工作示例,但根据您提供的内容,它可以正常工作,datalabels 插件的标签颜色已更改并且 y 刻度已隐藏:jsfiddle.net/Leelenaleee/xfn84bmo/13
  • 你好,Leelen。我认为我无法通过我的雇主提供指向服务器位置的链接。你能在我上面发布的屏幕截图中看到底部比例仍然显示在那里吗?我还看到您将选项声明为变量。我是否需要这样做才能使数据值显示为红色? 。我完全迷失了。
  • 在这个函数中,它应该是 poll.vals 还是数据而不是标签上的数字? ``` 格式化程序:函数(值,上下文){ 返回 context.chart.data.labels[context.dataIndex]; }```

标签: javascript chart.js


【解决方案1】:

发现您的问题,您在 plugins 部分之后第二次定义 options 块,这会覆盖早期的选项块,因为 js 对象中不允许重复键,所以如果您将配置更改为此它会起作用的:

async function setup() {
    var ctx = document.getElementById('myChart').getContext('2d');
    var poll = await getData();
    var myChart = new Chart(ctx, {
        type: 'horizontalBar',
        data: {
            labels: poll.years,
            datasets: [{
                label: 'how many people (%)',
                data: poll.vals,
                backgroundColor: [
                    '#cd0000',
                    '#eb7d44',
                    '#70AA5B',
                    '#CAF0FD',
                    '#134D85',
                ],
            }]
        },
        options: {
            scaleShowLabels: false,
            plugins: {
                datalabels: {
                    align: 'end',
                    color: 'red',
                }
            },
            layout: {
                padding: {
                    left: 0,
                    right: 0,
                    top: 8,
                    bottom: 0
                }
            },
            responsive: true,
            title: {
                display: false
            },
            legend: {
                display: true,
                position: 'top',
                usePointStyle: true,
                padding: 1,
                labels: {
                    boxWidth: 15
                }
            },
            scales: {
                yAxes: [{
                    ticks: {
                        display: false,
                        fontColor: '#ffffff',
                        zeroLineColor: '#ffffff'
                    }
                }],
                xAxes: [{
                    ticks: {
                        display: false
                    },
                }],
            }
        },
        plugins: [ChartDataLabels],
    });
}

【讨论】:

  • 你是个奇迹。一件简单的事情,所有这些事情都行不通。现在我知道不要两次使用这些中的任何一个,也知道那个功能和它在做什么。我真的很感激这一点。 ?
  • 想知道我是否可以再问你一个问题。你知道我会在哪里为 y 轴上的条设置名称吗?它在天平部分吗?我在这些东西上遇到了麻烦。刻度:{ yAxes:[{ 刻度:{ 显示:真,标签:{ 颜色:'红色'}
  • 你需要使用属性fontColor而不是color
  • 我找到了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 2015-03-21
  • 2017-12-07
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多