<html>
    <head>
        <meta charset="utf-8">
        <script src="../common/jquery.min.js"></script>
        <!--<script src="../common/echarts.min.js"></script>-->
        <script src="../common/echarts.js"></script>
        <script src="../common/prettify/prettify.js"></script>
        <script src="../common/showCode.js"></script>
        <link rel="stylesheet" href="../common/reset.css">
        <link rel="stylesheet" href="../common/prettify/prettify.css">
        <script src="../common/perfect-scrollbar/0.6.8/js/perfect-scrollbar.min.js"></script>
        <link rel="stylesheet" href="../common/perfect-scrollbar/0.6.8/css/perfect-scrollbar.min.css">
    </head>
    <body>

        <div id="main">
            <pre class="prettyprint">
// 先初始化日历坐标系。
chart.setOption({
    calendar: {
        ...
    }
});

var option2 = {
    xAxis: [],
    yAxis: [],
    grid: [],
    series: []
};

dateList.each(function (date) {
    // 对每日，计算其在日历坐标系上的像素位置。
    var gridCenter = chart.convertToPixel(
        'calendar', date
    );
    // 对每日，做一个直角坐标系。
    option2.grid.push({
        left: gridCenter[0] - cellWidth / 2,
        top: gridCenter[1] - cellHeight / 2,
        width: cellWidth,
        height: cellHeight,
        ...
    });
    option2.xAxis.push({...});
    option2.yAxis.push({...});

    // 直角坐标系里的柱状图。
    option2.series.push({
        type: 'bar',
        data: ...
    });
});

// 将所有直角坐标系和柱状图设置进 chart。
chart.setOption(option2);

            </pre>
            <div id="chart"></div>
        </div>


        <script>



        var cellSize = [80, 80];
        var cartesianSize = [60, 55];

        function getVirtulData() {
            var date = +echarts.number.parseDate('2017-02-01');
            var end = +echarts.number.parseDate('2017-03-01');
            var dayTime = 3600 * 24 * 1000;
            var data = [];
            for (var time = date; time < end; time += dayTime) {
                data.push([
                    echarts.format.formatTime('yyyy-MM-dd', time),
                    Math.floor(Math.random() * 10000)
                ]);
            }
            return data;
        }

        function makeCartesian(scatterData, chart) {
            var option = {
                grid: [],
                xAxis: [],
                yAxis: [],
                series: []
            };

            echarts.util.each(scatterData, function (item, index) {
                var center = chart.convertToPixel('calendar', item);
                option.visualMap = {
                    orient: 'horizontal',
                    right: 150,
                    type: 'piecewise',
                    seriesIndex: visualMapSeriesIndices,
                    dimension: 0,
                    itemWidth: 30,
                    itemHeight: 20,
                    textStyle: {
                        color: '#ccc',
                        fontSize: 18
                    },
                    pieces: [{
                        value: 0,
                        label: '工作',
                        color: '#E56666'
                    }, {
                        value: 1,
                        label: '娱乐',
                        color: '#61a0a8'
                    }, {
                        value: 2,
                        label: '睡觉',
                        color: '#E9962B'
                    }]
                };
                option.xAxis.push({
                    id: index + '_x',
                    data: ['工作', '娱乐', '睡觉'],
                    gridId: index + '_grid',
                    axisLabel: {show: false},
                    axisLine: {show: false},
                    axisTick: {show: false}
                });
                option.yAxis.push({
                    id: index + '_y',
                    gridId: index + '_grid',
                    axisLabel: {show: false},
                    axisLine: {show: false},
                    axisTick: {show: false}
                });
                option.grid.push({
                    id: index + '_grid',
                    left: center[0] - cartesianSize[0] / 2,
                    top: center[1] - cartesianSize[1] / 2 + 10,
                    width: cartesianSize[0],
                    height: cartesianSize[1]
                });
                option.series.push({
                    id: index + '_bar',
                    type: 'bar',
                    xAxisId: index + '_x',
                    yAxisId: index + '_y',
                    label: {
                        normal: {
                            formatter: '{c}',
                            position: 'inside'
                        }
                    },
                    data: [
                        Math.round(Math.random() * 24),
                        Math.round(Math.random() * 24),
                        Math.round(Math.random() * 24)
                    ]
                });
            });

            return option;
        }

        function makeCartesianUpdate(scatterData, chart) {
            var option = {
                grid: []
            };

            echarts.util.each(scatterData, function (item, index) {
                var center = chart.convertToPixel('calendar', item);
                option.grid.push({
                    id: index + '_grid',
                    left: center[0] - cartesianSize[0] / 2,
                    top: center[1] - cartesianSize[1] / 2 + 10
                });
            });

            return option;
        }

        var scatterData = getVirtulData();
        var visualMapSeriesIndices = echarts.util.map(function (entry, index) {
            return index + 1;
        });

        option = {
            tooltip : {},
            animationDurationUpdate: 0,
            calendar: {
                top: 'middle',
                left: 'center',
                orient: 'vertical',
                cellSize: cellSize,
                yearLabel: {
                    show: false,
                    textStyle: {
                        fontSize: 30
                    }
                },
                dayLabel: {
                    margin: 20,
                    firstDay: 1,
                    nameMap: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
                    textStyle: {
                        color: '#ccc',
                        fontSize: 16,
                    }
                },
                monthLabel: {
                    show: false
                },
                range: ['2017-02']
            },
            series: [{
                id: 'label',
                type: 'scatter',
                coordinateSystem: 'calendar',
                symbolSize: 1,
                label: {
                    normal: {
                        show: true,
                        formatter: function (params) {
                            return echarts.format.formatTime('dd', params.value[0]);
                        },
                        offset: [-cellSize[0] / 2 + 10, -cellSize[1] / 2 + 10],
                        textStyle: {
                            color: '#000',
                            fontSize: 14
                        }
                    }
                },
                data: scatterData
            }]
        };

        var chart = initShowCode(
            option,
            {
                codeWidth: 500,
                noAnimation: true,
                onResize: function () {
                    chart.resize();
                    chart.setOption(makeCartesianUpdate(scatterData, chart));
                }
            }
        );

        chart.setOption(makeCartesian(scatterData, chart));

        </script>
    </body>
</html>