TGraph Development among the Releases of Neo4jecharts scatter配置项内容和展示

Data from Github (2017-06-29)

配置项如下
      var uploadedDataURL = "/asset/get/s/data-1522024906757-SymAbpBqz.json";

//2017.6 var uploadedDataURL = "/asset/get/s/data-1498660933156-SkaSxrb4Z.json";


app.title = '笛卡尔坐标系上的热力图';


var time=[];

for(var year=2012;year<=2018;year++){
    for(var month=1;month<=12;month++){
        time.push(year+'.'+month);
    }
}

var branches = [];

var repoData = [];

var tagData = [];

var whereWeAre = [];

function getReleases(){
    $.get( uploadedDataURL, function(data){
        // console.log(typeof data)
        data = JSON.parse(data)
        // console.log(typeof data)
        // console.log(data)
        var branchMap = {}
        data.map(function(item){
            var r = releaseInfo(item)
            if(r===false) return;
            if(!branchMap.hasOwnProperty(r.branch)){
                branchMap[r.branch]={}
            }
            if(!branchMap[r.branch].hasOwnProperty(r.time)){
                branchMap[r.branch][r.time] = []
            }
            branchMap[r.branch][r.time].push(r)
        })
        branches = _.keys(branchMap).sort()
        console.log(branches)
        console.log(time)
        for(var j in time){
            var t = time[j]
            for(var b in branches){
                var bb = branches[b]
                if(bb<'1.9') continue;
                if(branchMap[bb].hasOwnProperty(t)){
                    var len = branchMap[bb][t].length
                    if(len==1){
                        var item = branchMap[bb][t][0]
                        if(item.isTag){
                            if(item.name=='2.2.3'){
                                whereWeAre.push([ parseInt(j), parseInt(b), 1, item.name])
                            }else{
                                tagData.push([ parseInt(j), parseInt(b), 1, item.name])
                            }
                        }else{
                            if(item.name=='2.3.12'){
                                whereWeAre.push([ parseInt(j), parseInt(b), 1, item.name])
                            }else{
                                repoData.push([ parseInt(j), parseInt(b), 1, item.name])
                            }
                        }
                    }else{
                        repoData.push([ parseInt(j), parseInt(b), branchMap[bb][t].length, ''])
                    }
                }
                // else{
                //     repoData.push([ parseInt(j), parseInt(b), 0, ''])
                // }
            }
        }
        
        console.log(JSON.stringify(repoData))
        myChart.setOption(option);
    })
}

getReleases()
// var data = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0],[2,8,0],[2,9,0],[2,10,3],[2,11,2],[2,12,1],[2,13,9],[2,14,8],[2,15,10],[2,16,6],[2,17,5],[2,18,5],[2,19,5],[2,20,7],[2,21,4],[2,22,2],[2,23,4],[3,0,7],[3,1,3],[3,2,0],[3,3,0],[3,4,0],[3,5,0],[3,6,0],[3,7,0],[3,8,1],[3,9,0],[3,10,5],[3,11,4],[3,12,7],[3,13,14],[3,14,13],[3,15,12],[3,16,9],[3,17,5],[3,18,5],[3,19,10],[3,20,6],[3,21,4],[3,22,4],[3,23,1],[4,0,1],[4,1,3],[4,2,0],[4,3,0],[4,4,0],[4,5,1],[4,6,0],[4,7,0],[4,8,0],[4,9,2],[4,10,4],[4,11,4],[4,12,2],[4,13,4],[4,14,4],[4,15,14],[4,16,12],[4,17,1],[4,18,8],[4,19,5],[4,20,3],[4,21,7],[4,22,3],[4,23,0],[5,0,2],[5,1,1],[5,2,0],[5,3,3],[5,4,0],[5,5,0],[5,6,0],[5,7,0],[5,8,2],[5,9,0],[5,10,4],[5,11,1],[5,12,5],[5,13,10],[5,14,5],[5,15,7],[5,16,11],[5,17,6],[5,18,0],[5,19,5],[5,20,3],[5,21,4],[5,22,2],[5,23,0],[6,0,1],[6,1,0],[6,2,0],[6,3,0],[6,4,0],[6,5,0],[6,6,0],[6,7,0],[6,8,0],[6,9,0],[6,10,1],[6,11,0],[6,12,2],[6,13,1],[6,14,3],[6,15,4],[6,16,0],[6,17,0],[6,18,0],[6,19,0],[6,20,1],[6,21,2],[6,22,2],[6,23,6]];
// data = data.map(function (item) {
//     return [item[1], item[0], item[2] || '-'];
// });


function releaseInfo(release){
    var b = release[1].match(/^(\d+\.\d+)\./)
    var t = new Date(Date.parse(release[0]))
    if(b){
        return {
            branch:b[1],
            name: release[1],
            date: release[0],
            time: t.getFullYear()+'.'+(t.getMonth()+1),
            isTag: release[2]=='tag'
        }
    }else{
        return false
    }
}

var now = new Date()

option = {
    title: {
        text: 'TGraph Development among the Releases of Neo4j',
        subtext: 'Data from Github '+now.getFullYear()+'.'+(now.getMonth()+1),
        link: 'https://github.com/neo4j/neo4j/releases'
    },
    // backgroundColor: '#404a59',
    color: [
        '#40c1BE', '#fec42c', '#dd4444'
    ],
    legend: {
        data: ['Release','Tag', 'We Are Here'],
        left: 'right'
    },
    tooltip: {
        position: 'top',
        formatter: function (params) {
            if(params.value[2]==1){
                return 'Releases: ' + params.value[3] + ' at ' + time[params.value[0]];
            }else{
                return params.value[2] + ' releases in ' + branches[params.value[1]] + ' on ' + time[params.value[0]];
            }
        }
    },
    grid: {
        left: 2,
        bottom: 10,
        right: 10,
        containLabel: true
    },
    xAxis: {
        type: 'category',
        data: time,
        boundaryGap: false,
        splitLine: {
            show: true,
            lineStyle: {
                color: '#999',
                type: 'dashed'
            }
        },
        axisLine: {
            show: false
        }
    },
    yAxis: {
        type: 'category',
        data: branches,
        axisLine: {
            show: true
        }
    },
    series: [{
        name: 'Release',
        type: 'scatter',
        symbolSize: function (val) {
            return val[2]?(val[2]*4+8):0;
        },
        showEffectOn: 'click',
        rippleEffect: {
            brushType: 'stroke'
        },
        data: repoData
    },{
        name: 'Tag',
        type: 'scatter',
        symbolSize: function (val) {
            return val[2]?(val[2]*4+8):0;
        },
        rippleEffect: {
            brushType: 'stroke'
        },
        showEffectOn: 'click',
        data: tagData
    },{
        name: 'We Are Here',
        type: 'effectScatter',
        symbolSize: function (val) {
            return val[2]?(val[2]*4+8):0;
        },
        // rippleEffect: {
        //     brushType: 'stroke'
        // },
        showEffectOn: 'click',
        itemStyle: {
            normal: {
                shadowBlur: 6,
                shadowColor: '#333'
            }
        },
        zlevel: 1,
        data: whereWeAre
    }]
};
    
截图如下