score:1

Accepted answer

you can use html to create your custom legend. here is an example of how to creating a custom legend with custom title(and custom user interface).

function legendclickcallback(event) {
  event = event || window.event;

  var target = event.target || event.srcelement;
  while (target.nodename !== 'li') {
      target = target.parentelement;
  }
  var parent = target.parentelement;
  var chartid = parseint(parent.classlist[0].split("-")[0], 10);
  var chart = chart.instances[chartid];
  var index = array.prototype.slice.call(parent.children).indexof(target);
  var meta = chart.getdatasetmeta(index);

  if (meta.hidden === null) {
    meta.hidden = !chart.data.datasets[index].hidden;
    target.classlist.add('hidden');
  } else {
    target.classlist.remove('hidden');
    meta.hidden = null;
  }
  chart.update();
}

var ctx = document.getelementbyid("mychart");
var mylegendcontainer = document.getelementbyid("mychartlegend");
var mychart = new chart(ctx, {
  type: 'bar',
  data: {
    labels: ["values #1", "values #2"],
    datasets: [
      {
        label: "one",
        backgroundcolor: "red",
        data: [26,36]
      },
      {
        label: "two",
        backgroundcolor: "blue",
        data: [34, 40]
      }

    ]
  },
  options: {
    legend: {
      display: false
    },
    scales: {
      yaxes: [{
        ticks: {
          beginatzero:true
        }
      }]
    }
  }
});

mylegendcontainer.innerhtml = mychart.generatelegend();
var legenditems = mylegendcontainer.getelementsbytagname('li');
for (var i = 0; i < legenditems.length; i += 1) {
  legenditems[i].addeventlistener("click", legendclickcallback, false);
}
.mychartdiv {
  max-width: 600px;
  max-height: 400px;
}
[class="0-legend"] {
  cursor: pointer;
  list-style: none;
  padding-left: 0;
}
[class="0-legend"] li {
  display: inline-block;
  padding: 0 5px;
}
[class="0-legend"] li.hidden {
  text-decoration: line-through;
}
[class="0-legend"] li span {
  border-radius: 5px;
  display: inline-block;
  height: 10px;
  margin-right: 10px;
  width: 10px;
}
.legend-box{
  border-color: gray;
  border-style: dashed;
  margin-top: 25px;
}
<script src="https://npmcdn.com/chart.js@latest/dist/chart.bundle.min.js"></script>


<html>
  <body>
    <div class="mychartdiv">
      <canvas id="mychart" width="600" height="400"></canvas>
      <div class='legend-box'>
        <span>chart legend</span>
        <div id="mychartlegend"></div>        
      </div>
    </div>
  </body>
</html>

i used the code of this example to create above example

score:1

you can override default legend option to generate your own legends. with this approach, however, you cannot style the label you are adding on top of the legends.

p.s: i'm using same example used by user pooyan.

var ctx = document.getelementbyid("mychart");
var mylegendcontainer = document.getelementbyid("legends");
var mychart = new chart(ctx, {
  type: 'bar',
  data: {
    labels: ["values #1", "values #2"],
    datasets: [
      {
        label: "one",
        backgroundcolor: "red",
        data: [26,36]
      },
      {
        label: "two",
        backgroundcolor: "blue",
        data: [34, 40]
      }

    ]
  },
  options: {
    legend: {
    	position: 'left',
    	labels : {
      	generatelabels: function(chart){
          var data = chart.data;
          var legends = array.isarray(data.datasets) ? data.datasets.map(function(dataset, i) {
            return {
              text: dataset.label,
              fillstyle: (!array.isarray(dataset.backgroundcolor) ? dataset.backgroundcolor : dataset.backgroundcolor[0]),
              hidden: !chart.isdatasetvisible(i),
              linecap: dataset.bordercapstyle,
              linedash: dataset.borderdash,
              linedashoffset: dataset.borderdashoffset,
              linejoin: dataset.borderjoinstyle,
              linewidth: dataset.borderwidth,
              strokestyle: dataset.bordercolor,
              pointstyle: dataset.pointstyle,

              // below is extra data used for toggling the datasets
              datasetindex: i
            };
          }, this) : [];
          var title = {
              text: 'my cool label',
              strokestyle: 'transparent',
              fillstyle: 'transparent',
              linewidth: 0
            };
          legends.unshift(title);
          return legends;
        }
      }
    },
    scales: {
      yaxes: [{
        ticks: {
          beginatzero:true
        }
      }]
    },
  }
});
<script src="https://npmcdn.com/chart.js@2.7.2/dist/chart.bundle.min.js"></script>
<div class="mychartdiv">
  <canvas id="mychart" width="600" height="400"></canvas>
</div>

score:1

you can do that by using filltext() above the legend after having drawn the chart.

by example, use the plugin afterdatasetsdraw (or another) and draw the title up to the position of first element of the legend (use legendhitboxes[0]).

in the plugin section :

return {afterdatasetsdraw: function(chartinstance, easing) {
                        //onprogress: function (animation) {
                            //var chartinstance = this.chart;
                            var ctx = chartinstance.ctx;
                            ctx.textalign = 'center';
                           // ctx.fillstyle = "rgba(255, 243, 243)";
                            ctx.textbaseline = 'middle';

                            // ajout d'un titre de légende
                            var titrelegendex = chartinstance.legend.legendhitboxes[0].left + 50;
                            var titrelegendey = chartinstance.legend.legendhitboxes[0].top-20;
                            ctx.fillstyle = "#000000";
                            ctx.font = "bold 12px verdana, sans-serif";
                            ctx.filltext("titre de légende", titrelegendex, titrelegendey);

example here to adapt for donut chart


Related Query

More Query from same tag