# 混合图表


# 效果

# 使用方法


<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); // 缓存 marker 原来的颜色
                        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) {
                            // container.show();
                            geom.show();
                            children[0].attr('fill', children[0].get('_originColor'));
                            children[1].attr('fill', children[1].get('_originColor'));
                        } else {
                            // container.hide();
                            geom.hide();
                            children[0].attr('fill', '#bfbfbf'); // marker 置灰
                            children[1].attr('fill', '#bfbfbf'); // 文本置灰 置灰
                        }
                        item.set('checked', !checked);
                        legendItems[findLegendItem(name)].checked = !checked;
                        }
                        // canvas.draw();
                    }
                });

            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>