4

我需要使用 ChartJS 库为我的圆环图创建自定义图例。我已经使用 ChartJS 提供的默认图例创建了甜甜圈,但我需要进行一些修改。

我想拥有高于汽车名称的价值。此外,我不喜欢粘性图例,我希望将其与甜甜圈分开,这样我就可以更改字体、框的样式(例如,在文本“Audi”旁边)

我知道有一些Legend 生成器,但我不确定如何将它与 VueJS 一起使用 - 因为我使用 VueJS 作为框架

这就是我的传奇现在的样子 - http://imgur.com/a/NPUoi

我的代码:

从我导入甜甜圈组件的 Vue 组件:

<div class="col-md-6">
  <div class="chart-box">
    <p class="chart-title">Cars</p>
    <donut-message id="chart-parent"></donut-message>
  </div>
</div>

Javascript:

    import { Doughnut } from 'vue-chartjs'
    export default Doughnut.extend({

    ready () {


    Chart.defaults.global.tooltips.enabled = false;
    Chart.defaults.global.legend.display = false;

    this.render({
      labels: ['Audi','BMW','Ford','Opel'],
      datasets: [
        {
          label: 'Cars',
          backgroundColor: ['#35d89b','#4676ea','#fba545','#e6ebfd'],
          data: [40, 30, 20, 10]
        }
      ]
    }, 
    {
      responsive: true,
      cutoutPercentage: 75,
      legend: {
        display: true,
        position: "right",
        fullWidth: true,
        labels: {
          boxWidth: 10,
          fontSize: 14
        }
      },
      animation: {
        animateScale: true
      }
    })
  }
});
4

3 回答 3

9

我在尝试理解文档时遇到了同样的问题,这个链接可能会阐明自定义图例的过程:

https://codepen.io/michiel-nuovo/pen/RRaRRv

诀窍是跟踪回调以构建您自己的 HTML 结构并将这个新结构返回给 ChartJS。

在选项对象内部:

legendCallback: function(chart) {
  var text = [];
  text.push('<ul class="' + chart.id + '-legend">');
  for (var i = 0; i < chart.data.datasets[0].data.length; i++) {
    text.push('<li><span style="background-color:' + 
    chart.data.datasets[0].backgroundColor[i] + '">');
      if (chart.data.labels[i]) {
      text.push(chart.data.labels[i]);
    }
    text.push('</span></li>');
  }
  text.push('</ul>');
  return text.join("");
}

其次,您需要一个容器来插入新的 html,并使用myChart.generateLegend()方法来获取自定义的 html:

$("#your-legend-container").html(myChart.generateLegend());

之后,如果需要,跟踪事件:

$("#your-legend-container").on('click', "li", function() {
  myChart.data.datasets[0].data[$(this).index()] += 50;
  myChart.update();
  console.log('legend: ' + data.datasets[0].data[$(this).index()]);
});

$('#myChart').on('click', function(evt) {
  var activePoints = myChart.getElementsAtEvent(evt);
  var firstPoint = activePoints[0];
  if (firstPoint !== undefined) {
    console.log('canvas: ' + 
    data.datasets[firstPoint._datasetIndex].data[firstPoint._index]);
  } 
  else {
    myChart.data.labels.push("New");
    myChart.data.datasets[0].data.push(100);
    myChart.data.datasets[0].backgroundColor.push("red");
    myChart.options.animation.animateRotate = false;
    myChart.options.animation.animateScale = false;
    myChart.update();
    $("#your-legend-container").html(myChart.generateLegend());
  }
}

我发现的另一个解决方案,如果您不需要更改图例中的 HTMl 结构,您可以在图例容器中插入相同的 HTML 并通过 CSS 对其进行自定义,请查看另一个链接:

http://jsfiddle.net/vrwjfg9z/

希望对你有效。

于 2017-08-02T14:02:37.887 回答
0

您可以提取图例标记。

data () {
  return {
     legendMarkup: ''
  }
},
ready () {
  this.legendMarkup = this._chart.generateLegend()
 }

在您的模板中,您可以输出它。

<div class="legend" ref="legend" v-html="legendMarkup"></div>

this._chart 是 vue-chartjs 中的内部 chartjs 实例。因此,您可以调用 vue-chartjs api 未公开的所有 chartjs 方法。

但是,您也可以使用图例生成器。vue中的用法是一样的。您可以传入选项,使用回调等。

于 2017-06-21T13:46:37.390 回答
-5

请检查此文档

图例配置

图表图例显示有关图表上出现的数据集的数据。

配置选项 图例的位置。选项是:

“上”“左”“下”“右”

图例项接口

传递给图例 onClick 函数的项目是从 labels.generateLabels 返回的项目。这些项目必须实现以下接口。

{
    // Label that will be displayed
    text: String,

    // Fill style of the legend box
    fillStyle: Color,

    // If true, this item represents a hidden dataset. Label will be rendered with a strike-through effect
    hidden: Boolean,

    // For box border. See https://developer.mozilla.org/en/docs/Web/API/CanvasRenderingContext2D/lineCap
    lineCap: String,

    // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash
    lineDash: Array[Number],

    // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineDashOffset
    lineDashOffset: Number,

    // For box border. See https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/lineJoin
    lineJoin: String,

    // Width of box border
    lineWidth: Number,

    // Stroke style of the legend box
    strokeStyle: Color

    // Point style of the legend box (only used if usePointStyle is true)
    pointStyle: String
}

例子

以下示例将创建一个启用图例的图表,并将所有文本变为红色。

var chart = new Chart(ctx, { type: 'bar', data: data, options: { legend: { display: true, labels: { fontColor: 'rgb(255, 99, 132)' } } } }); 自定义点击操作

单击图例中的项目时,通常希望触发不同的行为。这可以使用配置对象中的回调轻松实现。

默认的图例点击处理程序是:

function(e, legendItem) {
    var index = legendItem.datasetIndex;
    var ci = this.chart;
    var meta = ci.getDatasetMeta(index);

    // See controller.isDatasetVisible comment
    meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;

    // We hid a dataset ... rerender the chart
    ci.update();
}
Lets say we wanted instead to link the display of the first two datasets. We could change the click handler accordingly.

var defaultLegendClickHandler = Chart.defaults.global.legend.onClick;
var newLegendClickHandler = function (e, legendItem) {
    var index = legendItem.datasetIndex;

    if (index > 1) {
        // Do the original logic
        defaultLegendClickHandler(e, legendItem);
    } else {
        let ci = this.chart;
        [ci.getDatasetMeta(0),
         ci.getDatasetMeta(1)].forEach(function(meta) {
            meta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;
        });
        ci.update();
    }
};

var chart = new Chart(ctx, {
    type: 'line',
    data: data,
    options: {
        legend: {

        }
    }
});

现在,当您单击此图表中的图例时,前两个数据集的可见性将链接在一起。

HTML 图例

有时你需要一个非常复杂的图例。在这些情况下,生成 HTML 图例是有意义的。图表在其原型上提供了一个 generateLegend() 方法,该方法返回一个 HTML 字符串作为图例。

要配置如何生成此图例,您可以更改 legendCallback 配置属性。

var chart = new Chart(ctx, {
    type: 'line',
    data: data,
    options: {
        legendCallback: function(chart) {
            // Return the HTML string here.
        }
    }
});
于 2017-06-20T09:49:09.560 回答