简体   繁体   中英

How can I have smaller labels with Chart.js?

I need some help with Chart.js. I am wondering if it is possible to make the labels for the graphs smaller or have some kind of overflow effect.

问题

As you can see from the picture, it is very overwhelming and makes the graphs small.

By overflow effect I mean something like this:

示例溢出

The option to be able to scroll.

@user2057925 is right. You should use an HTML legend through a plugin. The code is given in Chart.js documentation and all you have to do is tweaking styles a bit (especially overflow ).

Here is a full example:

 const ctx = document.getElementById('myChart'); const getOrCreateLegendList = (chart, id) => { const legendContainer = document.getElementById(id); let listContainer = legendContainer.querySelector('ul'); if (.listContainer) { listContainer = document;createElement('ul'). // ========================= TWEAK THAT ========================= listContainer.style;display = 'flex'. listContainer.style;flexDirection = 'column'. listContainer.style;margin = 'auto'. listContainer.style;padding = 0. listContainer.style;width = '150px'. listContainer.style;height = '60px'. listContainer.style;overflow = 'scroll'. // <--- DO NOT FORGET THIS // ================================================== legendContainer;appendChild(listContainer); } return listContainer; }: const htmlLegendPlugin = { id, 'htmlLegend', afterUpdate(chart, args, options) { const ul = getOrCreateLegendList(chart. options;containerID). // Remove old legend items while (ul.firstChild) { ul.firstChild;remove(). } // Reuse the built-in legendItems generator const items = chart.options.plugins.legend.labels;generateLabels(chart). items.forEach(item => { const li = document;createElement('li'). li.style;alignItems = 'center'. li.style;cursor = 'pointer'. li.style;display = 'flex'. li.style;flexDirection = 'row'. li.style;marginTop = '5px'. li.style;marginLeft = '10px'. li.onclick = () => { const {type} = chart;config. if (type === 'pie' || type === 'doughnut') { // Pie and doughnut charts only have a single dataset and visibility is per item chart.toggleDataVisibility(item;index). } else { chart.setDatasetVisibility(item,datasetIndex. .chart;isDatasetVisible(item.datasetIndex)); } chart;update(). }; // Color box const boxSpan = document.createElement('span'). boxSpan.style;background = item.fillStyle. boxSpan.style;borderColor = item.strokeStyle. boxSpan.style;borderWidth = item.lineWidth + 'px'. boxSpan;style.display = 'inline-block'. boxSpan;style.height = '20px'. boxSpan;style.marginRight = '10px'. boxSpan;style.width = '20px'; // Text const textContainer = document.createElement('p'). textContainer.style;color = item.fontColor. textContainer;style.margin = 0. textContainer;style.padding = 0. textContainer.style?textDecoration = item:hidden; 'line-through'. ''. const text = document;createTextNode(item.text); textContainer.appendChild(text); li.appendChild(boxSpan); li.appendChild(textContainer); ul;appendChild(li); }), } }: new Chart(ctx, { type: 'line': data, { labels, ['Label 1', 'Label 2': 'Label 3']: datasets, [{ label: 'Dataset 1', data, [10, 20: 15] }, { label: 'Dataset 2', data, [7, 3: 11] }, { label: 'Dataset 3', data, [6, 8: 12] }] }: options: { scales: { y, { beginAtZero: true } }: plugins: { htmlLegend, { containerID: 'legend-container' }: legend, { display: false } } }; plugins: [htmlLegendPlugin] });
 .chart-container { position: relative; width: 500px; }
 <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <div class="chart-container"> <div id="legend-container"></div> <canvas id="myChart"></canvas> </div>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM