我有一个页面,有各种选择菜单。 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)}]
}]
});
}
我在一个简单的例子中重现了你的问题:http://jsfiddle.net/BlackLabel/sm2r684n/
第一次,图像是异步加载的,图表在计算边距时不会将其考虑在内。每次下次结果都不同时,您应该等到图片加载完毕:
var img = new Image();
img.onload = function() {
initChart();
}
img.src = "https://www.highcharts.com/samples/graphics/sun.png";
我认为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();