第一次刷新后,xAxis图像在Highcharts中消失

问题描述 投票:1回答:2

我有一个页面,有各种选择菜单。 select选项用于ajax调用以构建Highcharts条形图。每次过滤器更改时,都会重新创建图表。我这样做而不是更新系列数据,因为在过去我注意到破坏和重新创建比更新更有效。

我希望图像显示在x轴上,所以我使用了一个很好的小技巧来创建两个x轴,使用格式化工具在第一个轴上返回图像,并将第二个轴链接到第一个轴。这适用于第一次刷新。但是,每次在此后重新创建图表时,图像都会消失。我检查了我的控制台,我没有看到任何错误。

想一想这里发生了什么?

 /**
 * Whenselection changes
 */
$(document).on('change', '.filter', function(){


     getChartData($params)
    })

});


/**
 * API call to get data that will populate charts.
 * @param {obj} params
 */
function getChartData(params)
{
    //Get chart data
    $.ajax({
        url: apiURL + '/chartdata/',
        data: params,
        dataType: 'json',
        cache: false,
        success: function(data) {

            initChart(data[0]);
       }
 });

function initChart(chartData)
{
    var chart = Highcharts.chart('container', {
        chart: {
            type: 'bar',
            backgroundColor: 'transparent', //#E8EAF6',
            height: '23%',
            marginLeft: 35
        },
        title: {
            text: null
        },
        xAxis: {
            categories: [category1, category2],
            lineColor: 'transparent',
            min: 0,
            tickColor: 'transparent',
            title: {
                text: null
            },
            labels: {
                x: -35,
                useHTML: true,
                overflow: 'allow',
                formatter: function () {
                    if(this.isFirst == true)
                        return '<img src="../assets/img/nat-jr-grad-gold.png"><br/>';
                    else
                        return '<img src="../assets/img/nat-jr-grad-purple.png"><br/>';

                }
            }
        },
        yAxis: {
            min: 0,
            title: {
                useHTML: true,
                text: null
            },
            labels: {
                enabled: false
            },
            lineWidth: 0,
            minorGridLineWidth: 0,
            gridLineWidth: 0,
            lineColor: 'transparent',
            gridLineColor: 'transparent',
        },
        legend: {
            enabled: false
        },
        series: [{
            name: category1,
            data: [{name: category1, y:Math.round(chartData.p_grad_nongap * 100), {y: null}],

        }, {
            name: category2,
            data: [null, {name: category2, y: Math.round(chartData.p_grad_gap * 100)}]
        }]
     });

}

highcharts
2个回答
1
投票

我在一个简单的例子中重现了你的问题:http://jsfiddle.net/BlackLabel/sm2r684n/

第一次,图像是异步加载的,图表在计算边距时不会将其考虑在内。每次下次结果都不同时,您应该等到图片加载完毕:

var img = new Image();
img.onload = function() {
    initChart();
}
img.src = "https://www.highcharts.com/samples/graphics/sun.png";

现场演示:http://jsfiddle.net/BlackLabel/m09ok2cg/


0
投票

我认为ppotaczek有问题的根本原因;图像是异步加载的,图表在计算边距时不会将其考虑在内。他的建议使用setTimeout函数来不断重绘图形,这是相当低效的。我的解决方法是在创建图表后使用chart.renderer将图像添加为avg元素。

/* Render X-Axis images */
chart.renderer.image('../assets/img/img1.png', 0, 40, 32, 36)
    .css({
        class: 'icon-img',
        zIndex: 10
    })
    .add();

chart.renderer.image('../assets/img/img2.png', 0, 130, 32, 36)
    .css({
        class: 'icon-img',
        zIndex: 10
    })
    .add();
© www.soinside.com 2019 - 2024. All rights reserved.