【问题标题】:Make Chart.js horizontal bar labels multi-line使 Chart.js 水平条标签多行
【发布时间】:2019-03-23 12:18:47
【问题描述】:

只是想知道是否有任何方法可以使用 chart.js 为 y 轴设置水平条标签。以下是我设置图表的方式:

<div class="box-body">
<canvas id="chart" style="position: relative; height: 300px;"></canvas>
</div>

Javascript:

    var ctx = document.getElementById('chart').getContext("2d");
    var options = {
        layout: {
            padding: {
              top: 5,
            }
        },
        responsive: true,
        animation: {
            animateScale: true,
            animateRotate: true
        },
    };

    var opt = {
      type: "horizontalBar",
      data: { 
        labels: label, 
        datasets: [{ 
        data: price, 
        }] 
      }, 
      options: options
    };

    if (chart) chart.destroy();
    chart= new Chart(ctx, opt);

    chart.update();

如您所见,第一个和第三个标签太长并且被切断。有没有办法让标签多行?

【问题讨论】:

    标签: javascript chart.js


    【解决方案1】:

    如果您想完全控制标签跨行分解的长度,您可以通过在嵌套数组中提供标签来指定断点。例如:

    var chart = new Chart(ctx, {
    ...
      data: {
        labels: [["Label1 Line1:","Label1 Line2"],["Label2 Line1","Label2 Line2"]],
        datasets: [{
    ...
    });
    

    【讨论】:

    • 当我使用嵌套数组时,它在我的情况下显示为 [object, object]
    • @SomeoneSpecial 您可能需要使用 map 函数转换您的数组。
    【解决方案2】:

    您可以使用以下图表插件:

    plugins: [{
       beforeInit: function(chart) {
          chart.data.labels.forEach(function(e, i, a) {
             if (/\n/.test(e)) {
                a[i] = e.split(/\n/);
             }
          });
       }
    }]
    

    在您的图表选项后添加此项

    ᴜꜱᴀɢᴇ:

    将换行符 (\n) 添加到您的标签中,无论您想在哪里添加换行符。

    ᴅᴇᴍᴏ

    var chart = new Chart(ctx, {
       type: 'horizontalBar',
       data: {
          labels: ['Jan\n2017', 'Feb', 'Mar', 'Apr'],
          datasets: [{
             label: 'BAR',
             data: [1, 2, 3, 4],
             backgroundColor: 'rgba(0, 119, 290, 0.7)'
          }]
       },
       options: {
          scales: {
             xAxes: [{
                ticks: {
                   beginAtZero: true
                }
             }]
          }
       },
       plugins: [{
          beforeInit: function(chart) {
             chart.data.labels.forEach(function(e, i, a) {
                if (/\n/.test(e)) {
                   a[i] = e.split(/\n/);
                }
             });
          }
       }]
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.6.0/Chart.min.js"></script>
    <canvas id="ctx"></canvas>

    【讨论】:

    • 嗯,但问题是我正在动态填充标签,所以我无法将 \n 硬编码到字符串中。
    • 在将标签保存到数据库时执行此操作。
    • 这解决了我的问题,谢谢!可以在此处找到此方法的图解说明:github.com/chartjs/Chart.js/pull/2704#issuecomment-372637124
    • 有没有办法做多行标签(推送后)并更新图表?
    • @PAR 你可以在更新图表时使用beforeUpdate函数。
    猜你喜欢
    • 2017-08-26
    • 2019-09-22
    • 2017-05-26
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多