<template> <div> <lt-canvas ref="canvas" :width="750" :height="500"></lt-canvas> </div> </template> <script> import LightChart from 'light-chart'; export default { components:{ ltCanvas:require("light-chart/canvas") }, data(){ return {} }, mounted(){ const data = [ { name: 'Jon\nNicoll', score: 282, avgScore: 94 }, { name: 'Aaron\nMaell', score: 208, avgScore: 41.6 }, { name: 'Warren\nClunes', score: 186, avgScore: 46.5 }, { name: 'David\nBolton', score: 184, avgScore: 30.67 }, { name: 'Joel\nRobion', score: 177, avgScore: 44.25 }, { name: 'Kyle\nBuckley', score: 150, avgScore: 50 }, { name: 'Jordan\nLawrce', score: 148, avgScore: 24.67 }, { name: 'Jack\nCarey', score: 138, avgScore: 34.5 }, { name: 'Kuldeep\nPegu', score: 130, avgScore: 32.5 }, { name: 'Max\nHiler', score: 128, avgScore: 32 }, { name: 'Angus\nLivre', score: 127, avgScore: 62.5 } ];
const legendItems = [ { name: '个人分数', marker: 'square', fill: '#FACC14', checked: true }, { name: '平均分数', marker: function(x, y, r, ctx) { ctx.lineWidth = 1; ctx.strokeStyle = ctx.fillStyle; ctx.moveTo(x - r - 3, y); ctx.lineTo(x + r + 3, y); ctx.stroke(); ctx.arc(x, y, r, 0, Math.PI * 2, false); ctx.fill(); }, fill: '#000', checked: true } ];
function findLegendItem(name) { let index; for(let i = 0; i < legendItems.length; i++) { if (legendItems[i].name === name) { index = i; break; } } return index; }
let chart = new LightChart.Chart({ ltCanvas:this.$refs.canvas });
chart.source(data, { score: { tickInterval: 50, alias: '个人分数' }, avgScore: { ticks: [ 0, 17, 33, 50, 67, 83, 100 ], alias: '平均分数' } }); chart.axis('avgScore', { grid: null }); chart.axis('name', { label: { rotate: Math.PI / 4, textAlign: 'start', textBaseline: 'middle' } });
chart.legend({ custom: true, items: legendItems, onClick(ev) { const item = ev.clickedItem; const name = item.get('name'); const checked = item.get('checked'); const children = item.get('children'); if (checked) { const markerFill = children[0].attr('fill'); const textFill = children[1].attr('fill'); children[0].set('_originColor', markerFill); children[1].set('_originColor', textFill); } const geoms = chart.get('geoms'); const canvas = chart.get('canvas'); for (let i = 0; i < geoms.length; i++) { const geom = geoms[i]; const container = geom.get('container');
if (geom.getYScale().alias === name) if (!checked) { geom.show(); children[0].attr('fill', children[0].get('_originColor')); children[1].attr('fill', children[1].get('_originColor')); } else { geom.hide(); children[0].attr('fill', '#bfbfbf'); children[1].attr('fill', '#bfbfbf'); } item.set('checked', !checked); legendItems[findLegendItem(name)].checked = !checked; } } });
chart.interval().position('name*score').color('#FACC14'); chart.line().position('name*avgScore').color('#000'); chart.point().position('name*avgScore').size(3).style({ fill: '#000', stroke: '#fff', lineWidth: 1 }); chart.render(); } } </script> <style scoped>
</style>
|