结合饼图和地图
Combine PieChart with Map
我正在尝试使用 Highcharts 和 Highmaps 在地图上绘制 PieCharts。
我没有在文档中找到任何具体的内容,也没有在 Web 上找到示例。我正在关注 this demo,在那里我可以在地图上绘制地图气泡。我想做完全相同的事情,但使用饼图而不是地图气泡。
到目前为止我拥有的是:
$('.map').slideDown().highcharts('Map', {
title: {
text: null
},
mapNavigation: {
enabled: true
},
series: [{ // First series, plot the map
mapData: result,
name: 'Random data'
}, { // Second serie, plot a pie chart on specific coordinates
type: 'pie',
dataLabels: {
enabled: true
},
name: 'Cities',
data: [{
lat: -21.194476,
lon: -43.794456,
y: 100,
name: 'Barbacena'
}, {
lat: -21.194476,
lon: -43.794456,
y: 50,
name: 'Barbacena'
}],
maxSize: '12%'
}],
legend: {
layout: 'vertical',
align: 'left',
verticalAlign: 'bottom'
},
});
绘制了饼图,但它完全忽略了地图。拖地图的时候不拖。
那么,Highcharts 中有内置的方法吗?
提前致谢
我写了一个包装器,可以根据 lat/lon 绘制饼图。有关 lat/lon 的更多信息,请访问网站 here。
第一步是将lat/lon解析为x/y,这可以通过chart.fromLatLonToPoint()
来实现。之后需要设置饼图的中心。中心接受像素,因此 x/y 值应转换为像素 - 它可以通过 axis.toPixels()
方法实现。
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'getCenter', function(p) {
var centerOptions = this.options.center,
centerLatLonOptions = this.options.centerLatLon,
chart = this.chart,
slicedOffset = this.options.slicedOffset,
pos,
lat,
lon;
if (centerLatLonOptions && chart.fromLatLonToPoint) {
pos = chart.fromLatLonToPoint({
lat: centerLatLonOptions[0],
lon: centerLatLonOptions[1]
});
centerOptions[0] = chart.xAxis[0].toPixels(pos.x, true) - 2 * slicedOffset;
centerOptions[1] = chart.yAxis[0].toPixels(pos.y, true) - 2 * slicedOffset;
}
return p.call(this);
});
重新居中饼图需要在重绘时调用,它可以让饼图保持在正确的位置。
redraw: function() {
if (!this.centeringPies) {
this.centeringPies = true;
this.series.forEach(function(serie) {
if (serie.type === 'pie' && serie.options.centerLatLon) {
serie.update({
center: serie.getCenter()
}, false);
}
});
this.redraw(false);
this.centeringPies = false;
}
},
示例:https://jsfiddle.net/qqyLb7qx/1/
要做的一件事是检查饼图是否在绘图区域内 - 如果不是,则将其隐藏。
我正在尝试使用 Highcharts 和 Highmaps 在地图上绘制 PieCharts。 我没有在文档中找到任何具体的内容,也没有在 Web 上找到示例。我正在关注 this demo,在那里我可以在地图上绘制地图气泡。我想做完全相同的事情,但使用饼图而不是地图气泡。
到目前为止我拥有的是:
$('.map').slideDown().highcharts('Map', {
title: {
text: null
},
mapNavigation: {
enabled: true
},
series: [{ // First series, plot the map
mapData: result,
name: 'Random data'
}, { // Second serie, plot a pie chart on specific coordinates
type: 'pie',
dataLabels: {
enabled: true
},
name: 'Cities',
data: [{
lat: -21.194476,
lon: -43.794456,
y: 100,
name: 'Barbacena'
}, {
lat: -21.194476,
lon: -43.794456,
y: 50,
name: 'Barbacena'
}],
maxSize: '12%'
}],
legend: {
layout: 'vertical',
align: 'left',
verticalAlign: 'bottom'
},
});
绘制了饼图,但它完全忽略了地图。拖地图的时候不拖。
那么,Highcharts 中有内置的方法吗?
提前致谢
我写了一个包装器,可以根据 lat/lon 绘制饼图。有关 lat/lon 的更多信息,请访问网站 here。
第一步是将lat/lon解析为x/y,这可以通过chart.fromLatLonToPoint()
来实现。之后需要设置饼图的中心。中心接受像素,因此 x/y 值应转换为像素 - 它可以通过 axis.toPixels()
方法实现。
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'getCenter', function(p) {
var centerOptions = this.options.center,
centerLatLonOptions = this.options.centerLatLon,
chart = this.chart,
slicedOffset = this.options.slicedOffset,
pos,
lat,
lon;
if (centerLatLonOptions && chart.fromLatLonToPoint) {
pos = chart.fromLatLonToPoint({
lat: centerLatLonOptions[0],
lon: centerLatLonOptions[1]
});
centerOptions[0] = chart.xAxis[0].toPixels(pos.x, true) - 2 * slicedOffset;
centerOptions[1] = chart.yAxis[0].toPixels(pos.y, true) - 2 * slicedOffset;
}
return p.call(this);
});
重新居中饼图需要在重绘时调用,它可以让饼图保持在正确的位置。
redraw: function() {
if (!this.centeringPies) {
this.centeringPies = true;
this.series.forEach(function(serie) {
if (serie.type === 'pie' && serie.options.centerLatLon) {
serie.update({
center: serie.getCenter()
}, false);
}
});
this.redraw(false);
this.centeringPies = false;
}
},
示例:https://jsfiddle.net/qqyLb7qx/1/
要做的一件事是检查饼图是否在绘图区域内 - 如果不是,则将其隐藏。