Skip to content

K线图 多种组件整合,K线图设置的tooltip无效 #3891

@ParadiseKiss

Description

@ParadiseKiss

问题简述 (One-line summary)

init 之后,在series里边设置了 candlestick 和 line 等多个组件,option 里边设置了 tooltip 参数 为 show: true,

在 series 的 candlestick 里边设置tooltip 详细样式的时候无效,formatter函数无效,实际显示出来的效果还是 默认的英文效果

版本及环境 (Version & Environment)

  • ECharts 版本 (ECharts version):
    3.1
  • 浏览器类型和版本 (Browser version):
    google chrome 版本 52.0.2743.82 m (64-bit)
  • 操作系统类型和版本 (OS Version):
    win7 64

重现步骤 (Steps to reproduce)

  1. 官方例子:echarts.baidu.com/gallery/editor.html?c=candlestick-brush
series: [
            {
                name: 'TEST',
                type: 'candlestick',
                                ....

代码处添加 tooltip

tooltip: {
    trigger: 'axis',
    axisPointer: {
        type: 'line'
    },
    formatter: function (param, ticket, callback) {
        var param = param[0];
        var MA5Data = calculateMA(5, data);
        var MA10Data = calculateMA(10, data);
        var MA20Data = calculateMA(20, data);
        var MA30Data = calculateMA(30, data);
        return [
            '日期: ' + param.name + '<hr size=1 style="margin: 3px 0">',
            '开盘: ' + param.data[0] + '<br/>',
            '收盘: ' + param.data[1] + '<br/>',
            '最低: ' + param.data[2] + '<br/>',
            '最高: ' + param.data[3] + '<br/>',
            '<hr size=1 style="margin: 3px 0">',
            'MA5:' + MA5Data[param.dataIndex] + '<br/>',
            'MA10:' + MA10Data[param.dataIndex] + '<br/>',
            'MA20:' + MA20Data[param.dataIndex] + '<br/>',
            'MA30:' + MA30Data[param.dataIndex] + '<br/>',
        ].join('');
    }
},

期望结果 (Expected behaviour)

如果是BUG希望修复,如果是调用错误,希望能把正确方法 发送到
289854608@qq.com

可能哪里有问题 (What went wrong)

曾经做过测试,在option全局的 tooltip 里边设置 formatter 方法可以调用,K线图的现实结果是预期结果,放到candlestick里边就失效,应该是没有调用 candlerstick 的tooltip 方法。

如果是没有调用的话,建议官方把 例子 修改成正确例子

ECharts配置项 (ECharts option) //全部JS

var app = {};
option = null;
app.timeTicket = null;

function splitData(rawData) {
    var categoryData = [];
    var values = [];
    var volumns = [];
    for (var i = 0; i < rawData.length; i++) {
        categoryData.push(rawData[i].splice(0, 1)[0]);
        values.push(rawData[i]);
        volumns.push(rawData[i][4]);
    }
    return {
        categoryData: categoryData,
        values: values,
        volumns: volumns
    };
}

function calculateMA(dayCount, data) {
    var result = [];
    for (var i = 0, len = data.values.length; i < len; i++) {
        if (i < dayCount) {
            result.push('-');
            continue;
        }
        var sum = 0;
        for (var j = 0; j < dayCount; j++) {
            sum += data.values[i - j][1];
        }
        result.push(+(sum / dayCount).toFixed(3));
    }
    return result;
}

var now = +new Date(1997, 9, 3);
function randomData(isChangeDate) {
    var oneDay = 24 * 3600 * 1000;
    var value = Math.random() * 1000;
    now = isChangeDate ? new Date(+now + oneDay) : now;
    value = value + Math.random() * 21 - 10;
    return {
        name: now.toString(),
        value: [
            [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'),
            Math.round(value)
        ]
    }
}


var KLineOption = function(data) {
    var showRange = 50;
    var startShow = data.categoryData.length - showRange;
    return {
        backgroundColor: '#fff',
        animation: true,
        legend: {
            bottom: 10,
            left: 'center',
            data: ['LLC', 'MA5', 'MA10', 'MA20', 'MA30']
        },
        tooltip: {
            show: true,
        },
        toolbox: {
            feature: {
                dataZoom: {
                    yAxisIndex: false
                },
                brush: {
                    type: ['lineX', 'clear']
                }
            }
        },
        brush: {
            xAxisIndex: 'all',
            brushLink: 'all',
            outOfBrush: {
                colorAlpha: 0.1
            }
        },
        grid: [
            {
                left: '10%',
                right: '8%',
                height: '50%'
            },
            {
                left: '10%',
                right: '8%',
                top: '63%',
                height: '16%'
            }
        ],
        xAxis: [
            {
                type: 'category',
                data: data.categoryData,
                scale: true,
                boundaryGap : false,
                axisLine: {onZero: false},
                splitLine: {show: false},
                splitNumber: 20,
                min: 'dataMin',
                max: 'dataMax'
            },
            {
                type: 'category',
                gridIndex: 1,
                data: data.categoryData,
                scale: true,
                boundaryGap : false,
                axisLine: {onZero: false},
                axisTick: {show: false},
                splitLine: {show: false},
                axisLabel: {show: false},
                splitNumber: 20,
                min: 'dataMin',
                max: 'dataMax'
            }
        ],
        yAxis: [
            {
                scale: true,
                splitArea: {
                    show: true
                }
            },
            {
                scale: true,
                gridIndex: 1,
                splitNumber: 2,
                axisLabel: {show: false},
                axisLine: {show: false},
                axisTick: {show: false},
                splitLine: {show: false}
            }
        ],
        dataZoom: [
            {
                type: 'inside',
                xAxisIndex: [0, 1],
                startValue: startShow,
                endValue: startShow + showRange,
            },
            {
                show: true,
                handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
                handleSize: '80%',
                dataBackground: {
                    areaStyle: {
                        color: '#8392A5'
                    },
                    lineStyle: {
                        opacity: 0.8,
                        color: '#8392A5'
                    }
                },
                handleStyle: {
                    color: '#fff',
                    shadowBlur: 3,
                    shadowColor: 'rgba(0, 0, 0, 0.6)',
                    shadowOffsetX: 2,
                    shadowOffsetY: 2
                },
                xAxisIndex: [0, 1],
                type: 'slider',
                top: '85%',
                startValue: startShow,
                endValue: startShow + showRange,
            }
        ],
        series: [
            {
                name: 'LLC',
                type: 'candlestick',
                data: data.values,
                itemStyle: {
                    normal: {
                        color: "darkred",
                        color0: "green",
                        borderColor: "darkred",
                        borderColor0: "green",
                    }
                },
                markLine: {
                    symbol: ['none', 'none'],
                    data: [
                        [
                            {
                                name: '最高最低',
                                type: 'min',
                                valueDim: 'lowest',
                                symbol: 'circle',
                                symbolSize: 10,
                                label: {
                                    normal: {show: false},
                                    emphasis: {show: false}
                                }
                            },
                            {
                                type: 'max',
                                valueDim: 'highest',
                                symbol: 'circle',
                                symbolSize: 10,
                                label: {
                                    normal: {show: false},
                                    emphasis: {show: false}
                                }
                            }
                        ],
                        {
                            name: '收盘最低价',
                            type: 'min',
                            valueDim: 'close'
                        },
                        {
                            name: '收盘最高价',
                            type: 'max',
                            valueDim: 'close'
                        }
                    ]
                },
                tooltip: {
                    trigger: 'axis',
                    axisPointer: {
                        type: 'line'
                    },
                    formatter: function (param, ticket, callback) {
                        var param = param[0];
                        var MA5Data = calculateMA(5, data);
                        var MA10Data = calculateMA(10, data);
                        var MA20Data = calculateMA(20, data);
                        var MA30Data = calculateMA(30, data);
                        panel = document.getElementById("kline_panel");
                        panel.innerHTML = [
                            '日期: ' + param.name + ' : ',
                            '开盘: ' + param.data[0] + '',
                            '收盘: ' + param.data[1] + '',
                            '最低: ' + param.data[2] + '',
                            '最高: ' + param.data[3] + '',
                            'MA5:' + MA5Data[param.dataIndex] + '',
                            'MA10:' + MA10Data[param.dataIndex] + '',
                            'MA20:' + MA20Data[param.dataIndex] + '',
                            'MA30:' + MA30Data[param.dataIndex] + '',
                        ].join(' ');

                        return [
                            '日期: ' + param.name + '<hr size=1 style="margin: 3px 0">',
                            '开盘: ' + param.data[0] + '<br/>',
                            '收盘: ' + param.data[1] + '<br/>',
                            '最低: ' + param.data[2] + '<br/>',
                            '最高: ' + param.data[3] + '<br/>',
                            '<hr size=1 style="margin: 3px 0">',
                            'MA5:' + MA5Data[param.dataIndex] + '<br/>',
                            'MA10:' + MA10Data[param.dataIndex] + '<br/>',
                            'MA20:' + MA20Data[param.dataIndex] + '<br/>',
                            'MA30:' + MA30Data[param.dataIndex] + '<br/>',
                        ].join('');
                    }
                },

            },
            {
                name: 'MA5',
                type: 'line',
                data: calculateMA(5, data),
                smooth: true,
                lineStyle: {
                    normal: {opacity: 0.5}
                }
            },
            {
                name: 'MA10',
                type: 'line',
                data: calculateMA(10, data),
                smooth: true,
                lineStyle: {
                    normal: {opacity: 0.5}
                }
            },
            {
                name: 'MA20',
                type: 'line',
                data: calculateMA(20, data),
                smooth: true,
                lineStyle: {
                    normal: {opacity: 0.5}
                }
            },
            {
                name: 'MA30',
                type: 'line',
                data: calculateMA(30, data),
                smooth: true,
                lineStyle: {
                    normal: {opacity: 0.5}
                }
            },
            {
                name: 'Volumn',
                type: 'bar',
                xAxisIndex: 1,
                yAxisIndex: 1,
                data: data.volumns,
                tooltip: {
                    axisPointer: {
                        type: 'cross'
                    },
                }
            }
        ]
    }
}

var MinuteOption = function(data) {

    return option = {
        tooltip: {
            trigger: 'axis',
            formatter: function (params) {
                params = params[0];
                var date = new Date(params.name);
                //return date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + ' ' + data.getHours + ':' + data.getMinutes + '  ' + params.value[1];
                return params.value[1];
            },
            axisPointer: {
                type: 'line',
                animation: true
            }
        },

        xAxis: {
            type: 'time',
            splitLine: {
                show: false
            }
        },
        yAxis: {
            type: 'value',
            boundaryGap: [0, '100%'],
            splitLine: {
                show: true
            }
        },
        series: [{
            name: '分时数据',
            type: 'line',
            showSymbol: false,
            hoverAnimation: false,
            data: data,
        }]
    };
}

function makeLine(dataType) {
    if(dataType === "minute") {
        showMinutes();
    } else {
        showKLine(dataType);
    }
}
function showKLine(dataType) {
    var dom = document.getElementById("container");
    var myChart = echarts.init(dom);
    $.get('/stock.json', function (rawData) {
        var data = splitData(rawData);
        myChart.setOption(KLineOption(data), true);
        myChart.dispatchAction({

        });
    }); 
}
function intervalKLine() {

}
function showMinutes() {
    var dom = document.getElementById("container");
    var myChart = echarts.init(dom);
    var data = [];
    for (var i = 0; i < 50; i++) {
        data.push(randomData(true));
    }
    console.log(data)
    myChart.setOption(MinuteOption(data), true);
    myChart.dispatchAction({

    });

    intervalMinutes();


    app.timeTicket = setInterval(function () {
        isChangeDate = false;

        //data.shift();
        //data.push(randomData());

        data[data.length - 1] = randomData(isChangeDate);

        myChart.setOption({
            series: [{
                data: data,
                markPoint: {
                    label: {
                        normal: {
                            formatter: function (param) {
                                return param != null ? Math.round(param.value) : '';
                            }
                        }
                    },
                    data: [
                        {
                            coord: [data[data.length-1].value[0], data[data.length-1].value[1]],
                            value: data[data.length-1].value[1],
                            itemStyle: {
                                normal: {color: 'rgb(41,60,85)'}
                            }
                        }
                    ],
                },
            }]
        });
    }, 1000);
}
function intervalMinutes() {
    clearInterval(app.timeTicket);

}

makeLine() 是入口方法

其他信息 (Other comments)

Metadata

Metadata

Assignees

No one assigned

    Labels

    staleInactive for a long time. Will be closed in 7 days.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions