amcharts' stockChart mouse move listener - javascript
I'm trying to add a listener to amCharts' stockChart but can't find where.
According to the docs of chartCursor you can set changed event on chartCursor however chartCursor does not exist on stockChart, only regular charts according to the docs of the StockChart.
As far as I can see the only semi-relevant settings is chartCursorSettings but it does not allow setting any listeners.
How can I catch mouse move/changed event over amCharts' amStockChart ?
The changed event can be caught at the panel level:
var chart = AmCharts.makeChart("chartdiv", {
// ...
"panels": [{
// ...
"listeners": [{
"event": "changed",
"method": function(e) {
console.log('changed event fired')
}
}],
}],
// ...
});
Demo below:
var chart = AmCharts.makeChart("chartdiv", {
"type": "stock",
"theme": "light",
"categoryAxesSettings": {
"minPeriod": "mm"
},
"dataSets": [{
"fieldMappings": [{
"fromField": "value",
"toField": "value"
}],
"dataProvider": generateChartData(),
"categoryField": "date"
}],
"panels": [{
"stockGraphs": [{
"valueField": "value",
"type": "smoothedLine"
}],
"listeners": [{
"event": "changed",
"method": function(e) {
console.log('changed event fired')
}
}],
}],
"chartCursorSettings": {
"valueBalloonsEnabled": true
}
});
function generateChartData() {
var chartData = [];
var firstDate = new Date( 2012, 0, 1 );
firstDate.setDate( firstDate.getDate() - 1000 );
firstDate.setHours( 0, 0, 0, 0 );
for ( var i = 0; i < 1000; i++ ) {
var newDate = new Date( firstDate );
newDate.setHours( 0, i, 0, 0 );
var a = Math.round( Math.random() * ( 40 + i ) ) + 100 + i;
chartData.push( {
date: newDate,
value: a
} );
}
return chartData;
}
#chartdiv {
width: 100%;
height: 300px;
}
<script src="//www.amcharts.com/lib/3/amcharts.js"></script>
<script src="//www.amcharts.com/lib/3/serial.js"></script>
<script src="//www.amcharts.com/lib/3/themes/light.js"></script>
<script src="//www.amcharts.com/lib/3/amstock.js"></script>
<div id="chartdiv"></div>
Related
Apache echarts - Schedule style chart layout
Does anyone know of a chart layout that functions like a schedule/timeline? I currently have a chart that shows the on/off status of 3 valves over time. It's a stacked line/area chart, it's works ok, but it's not the easiest to follow. See linked screenshot of what I'm looking to achieve: Chart actual vs desired (Top is current chart, bottom is what I want to achieve). Is this possible with apache echarts?
Thanks to #pthomson for pointing me in the right direction. Here is what I've come up with: Codepen chart example I'm still having some issues with the min/max values for the xAxis. The min/max seems to be calculated on values in index 1, which is the end timestamp of each schedule piece, so not ideal. var dom = document.getElementById('chart-container'); var myChart = echarts.init(dom, null, { renderer: 'canvas', useDirtyRect: false }); var app = {}; var option; const valveColors = [ "#f59527", "#00e200", "#2da8f3", ] var data = [ { "name": "Valve 1", "value": [ 1655647200000, 1657980000000, 0 ] }, { "name": "Valve 3", "value": [ 1657980000000, 1659448800000, 2 ] }, { "name": "Valve 1", "value": [ 1659448800000, 1660526144467, 0 ] }, { "name": "Valve 2", "value": [ 1655647200000, 1660526144467, 1 ] } ]; option = { xAxis: { type: "time", //Min is getting values from index 1, not sure why min: range => range.min - (7 * 24 * 60 * 60 * 1000), //Subtract 7 days }, yAxis: { type: "category", data: [ "Valve 3", "Valve 2", "Valve 1" ] }, series: [ { type: "custom", renderItem: (params, api) => { var catIndex = api.value(2); var timeSpan = [api.value(0), api.value(1)]; var start = api.coord([timeSpan[0], 2 - catIndex]); var end = api.coord([timeSpan[1], 2 -catIndex]); var size = api.size([0,1]); var height = size[1] * 0.6; var rect = echarts.graphic.clipRectByRect( { x: start[0], y: start[1] - height / 2, width: end[0] - start[0], height: height}, { x: params.coordSys.x, y: params.coordSys.y, width: params.coordSys.width, height: params.coordSys.height} ); return ( rect && { type: "rect", transition: ["shape"], shape: rect, style: { fill: valveColors[catIndex], }, } ); }, encode: { x: [0,1], y: 0, }, data: data, } ], tooltip: { show: true, trigger: "item", formatter: params => { return `${params.data.name}<br/> ${params.data.value[0]} - ${params.data.value[1]}` //Unix timestamps should be converted to readable dates } }, dataZoom: [ { type: "slider", filterMode: "none" }, ], } if (option && typeof option === 'object') { myChart.setOption(option); } window.addEventListener('resize', myChart.resize);
How to click map Bubble in Amcharts and call server request
I want to click the bubble in Am chart and call the server through ajax call and manipulate some data in a view is it possible ? I am loading my map through ajax call . below is the code . I tried it using eventlistener clickable object , but wont get success. function StatisticsMap(item, categoryID, statusID) { languageShortName = $("#languageShortName").val(); $("[relf-map-tab]").removeClass("active"); var url = "/" + languageShortName + "/saudiprojects/statistics/map-data?categoryID=" + categoryID + "&statusID=" + statusID; dataPoints = []; $.ajax({ type: "GET", url: url }).done(function (data) { $(data).each(function (index, value) { dataPoints.push({ longitude: value.Longitude, latitude: value.Latitude, type: 'circle', color: '#E98C3E', label: value.CountNo, labelPosition: "middle", labelColor: "#ffffff", labelFontSize: 20, fixedSize: false, labelBackgroundAlpha: 1, labelBackgroundColor: "#E98C3E", height: 50 + (value.CountNo * 10), width: 50 + (value.CountNo * 10), centered: true, title: value.Status }); }); var map = AmCharts.makeChart("mapdiv", { "type": "map", "theme": "light", "dataProvider": { "map": "saudiArabiaHigh", "images": dataPoints } }); $(item).addClass("active"); }); } Here is my HTML <div class="graph"> <div id="mapdiv" style="width:100%;height:100%;"></div> </div>
You can use the clickMapObject listener on the map to capture what bubble was clicked. The image itself is stored in the mapObject property of the event: "listeners": [{ "event": "clickMapObject", "method": function(ev) { alert('clicked on ' + ev.mapObject.title) } }] Note that in order to make the image clickable, you have to set selectable to true in imagesSettings: "imagesSettings": { "selectable": true } Demo below: var dataPoints = [{ longitude: 45, latitude: 25, type: 'circle', color: '#E98C3E', label: "1", labelPosition: "middle", labelColor: "#ffffff", labelFontSize: 20, fixedSize: false, labelBackgroundAlpha: 1, labelBackgroundColor: "#E98C3E", height: 60, width: 60, centered: true, title: "Example" }]; var map = AmCharts.makeChart("mapdiv", { "type": "map", "theme": "light", "dataProvider": { "map": "saudiArabiaHigh", "images": dataPoints }, "imagesSettings": { "selectable": true }, "listeners": [{ "event": "clickMapObject", "method": function(ev) { alert('clicked on ' + ev.mapObject.title) } }] }); #mapdiv { width: 100%; height: 500px; } <script src="https://www.amcharts.com/lib/3/ammap.js"></script> <script src="https://www.amcharts.com/lib/3/maps/js/saudiArabiaHigh.js"></script> <script src="https://www.amcharts.com/lib/3/plugins/export/export.min.js"></script> <div id="mapdiv"></div>
Timeline chart with highcharts using x-range with multiple stacks
I am using Highcharts to create a timeline chart which shows the flow of different "states" over time. The current implementation is at http://jsfiddle.net/hq1kdpmo/8/ and it looks like . The current code is as follows: Highcharts.chart('container', { "chart": { "type": "xrange" }, "title": { "text": "State Periods" }, "xAxis": { "type": "datetime" }, "yAxis": [{ "title": { "text": "Factions" }, "categories": ["A", "B", "C", "D"], "reversed": true }], "plotOptions": { "xrange": { "borderRadius": 0, "borderWidth": 0, "grouping": false, "dataLabels": { "align": "center", "enabled": true, "format": "{point.name}" }, "colorByPoint": false } }, "tooltip": { "headerFormat": "<span style=\"font-size: 0.85em\">{point.x} - {point.x2}</span><br/>", "pointFormat": "<span style=\"color:{series.color}\">●</span> {series.name}: <b>{point.yCategory}</b><br/>" }, "series": [{ "name": "State A", "pointWidth": 20, "data": [{ "x": 1540430613000, "x2": 1540633768100, "y": 0 }, { "x": 1540191009000, "x2": 1540633768100, "y": 1 }, { "x": 1540191009000, "x2": 1540530613000, "y": 2 }, { "x": 1540530613000, "x2": 1540633768100, "y": 3 }] }, { "name": "State B", "pointWidth": 20, "data": [{ "x": 1540191009000, "x2": 1540430613000, "y": 0 }, { "x": 1540530613000, "x2": 1540633768100, "y": 2 }, { "x": 1540191009000, "x2": 1540330613000, "y": 3 }] }, { "name": "State C", "pointWidth": 20, "data": [{ "x": 1540330613000, "x2": 1540530613000, "y": 3 }] }], "exporting": { "enabled": true, "sourceWidth": 1200 } }); Now what I am looking forward to is create something of this sort (pardon my paint skills). Here the categories A to D are the only axis on y. But I would like to group a variable number of parallel ranges. The use case is that there can be multiple states at any point of time and the number of states at any point of time is variable. How do I go on about doing this?
To create such a chart you will have to add 12 yAxis (0-11) and set proper ticks and labels so that only A-D categories will be plotted. Additionally, adjust plotOptions.pointPadding and plotOptions.groupPadding properties to set points width automatically (series.pointWidth should be undefined then). yAxis options: yAxis: [{ title: { text: "Factions" }, categories: ["A", "B", "C", "D"], tickPositions: [-1, 2, 5, 8, 11], lineWidth: 0, labels: { y: -20, formatter: function() { var chart = this.chart, axis = this.axis, label; if (!chart.yaxisLabelIndex) { chart.yaxisLabelIndex = 0; } if (this.value !== -1) { label = axis.categories[chart.yaxisLabelIndex]; chart.yaxisLabelIndex++; if (chart.yaxisLabelIndex === 4) { chart.yaxisLabelIndex = 0; } return label; } }, }, reversed: true }] Demo: https://jsfiddle.net/wchmiel/s9qefg7t/1/
I have managed to solve this thanks to support from Highcharts themselves. The idea is to set the tick position on the load event and use the labels.formatter for formatting each individual label. events: { load() { let labelGroup = document.querySelectorAll('.highcharts-yaxis-labels'); // nodeValue is distance from top let ticks = document.querySelectorAll('.highcharts-yaxis-grid'); let tickPositions = Array.from(ticks[0].childNodes).map( function(node){ return +node.attributes.d.nodeValue.split(" ")[2]; } ); let labelPositions = []; for(let i =1 ;i<tickPositions.length;i++){ labelPositions.push((tickPositions[i] + tickPositions[i-1])/2); } labelGroup[0].childNodes[0].attributes.y.nodeValue = labelPositions[0] + parseFloat(labelGroup[0].childNodes[0].style["font-size"], 10) / 2; labelGroup[0].childNodes[1].attributes.y.nodeValue = labelPositions[1] + parseFloat(labelGroup[0].childNodes[1].style["font-size"], 10) / 2; labelGroup[0].childNodes[2].attributes.y.nodeValue = labelPositions[2] + parseFloat(labelGroup[0].childNodes[2].style["font-size"], 10) / 2; labelGroup[0].childNodes[3].attributes.y.nodeValue = labelPositions[3] + parseFloat(labelGroup[0].childNodes[3].style["font-size"], 10) / 2; labelGroup[0].childNodes[4].attributes.y.nodeValue = labelPositions[4] + parseFloat(labelGroup[0].childNodes[4].style["font-size"], 10) / 2; } } And the labels are formatted as: labels: { formatter: function() { var chart = this.chart, axis = this.axis, label; if (!chart.yaxisLabelIndex) { chart.yaxisLabelIndex = 0; } if (this.value !== -1) { label = axis.categories[chart.yaxisLabelIndex]; chart.yaxisLabelIndex++; if (chart.yaxisLabelIndex === groups.length) { chart.yaxisLabelIndex = 0; } return label; } }, } Fiddle at https://jsfiddle.net/yvnp4su0/42/
As I suggested in the comment above it is a better idea to use Highcharts renderer and add custom labels than manipulate Dom elements as you did in the previous answer, because it is a much cleaner solution. Disable default labels: yAxis: [{ title: { text: "Factions", margin: 35 }, categories: ["A", "B", "C", "D", "E"], tickPositions: tickPositions, lineWidth: 0, labels: { enabled: false }, reversed: true }] Add custom labels in proper positions using renderer: chart: { type: 'xrange', height: 500, marginLeft: 60, events: { load: function() { this.customLabels = []; }, render: function() { var chart = this, yAxis = chart.yAxis[0], categories = yAxis.categories, xOffset = 15, yOffset = 20, xPos = yAxis.left - xOffset, tickPositions = yAxis.tickPositions, text, label, yPos, tick1Y, tick2Y, i; for (i = 0; i < tickPositions.length - 1; i++) { if (chart.customLabels[i]) { chart.customLabels[i].destroy(); } tick1Y = yAxis.toPixels(tickPositions[i]); tick2Y = yAxis.toPixels(tickPositions[i + 1]); yPos = (tick1Y + tick2Y) / 2 + yOffset; text = categories[i]; label = chart.renderer.text(text, xPos, yPos) .css({ color: '#ccc', fontSize: '14px' }) .add(); chart.customLabels[i] = label; } } } } Demo: https://jsfiddle.net/wchmiel/vkz7o1hw/
Detect when Max is clicked in amCharts
I am using AmCharts for displaying chart data. I am using different data sets for different zoom levels. Like for 1D, I use Minutes data; For 1W, I use Hours data and for 1Y I use Days data. I change the datasets by calculating difference in minutes for startDate and endDate for generated "changed" event of PeriodSelector. The problenm is that when I am currently at 1D zoom level, and I click Max, the difference in minutes is equal to 2 days and it displays only 2 days data as I have only that much in the minutes dataset. I want it to display the Days dataset which I have for 2 years. But the event generated has min startDate and max endDate only for current dataset which has just 2 days data.
The predefinedPeriod property in the changed event contains the label of the button that was clicked. You can use that to detect which button was clicked: listeners: [ { event: "changed", method: function(eventObj) { console.log("clicked " + eventObj.predefinedPeriod); } } ] Demo: var chartData1 = []; generateChartData(); var chart = AmCharts.makeChart("chartdiv", { type: "stock", theme: "light", dataSets: [ { fieldMappings: [ { fromField: "value", toField: "value" }, { fromField: "volume", toField: "volume" } ], dataProvider: chartData1, categoryField: "date" } ], panels: [ { showCategoryAxis: false, stockGraphs: [ { id: "g1", valueField: "value", comparable: true, compareField: "value", balloonText: "[[title]]:<b>[[value]]</b>", compareGraphBalloonText: "[[title]]:<b>[[value]]</b>" } ] } ], periodSelector: { position: "left", periods: [ { period: "MM", selected: true, count: 1, label: "1 month" }, { period: "YYYY", count: 1, label: "1 year" }, { period: "YTD", label: "YTD" }, { period: "MAX", label: "MAX" } ], listeners: [ { event: "changed", method: function(eventObj) { console.log("clicked " + eventObj.predefinedPeriod); } } ] } }); function generateChartData() { var firstDate = new Date(); firstDate.setDate(firstDate.getDate() - 500); firstDate.setHours(0, 0, 0, 0); for (var i = 0; i < 500; i++) { var newDate = new Date(firstDate); newDate.setDate(newDate.getDate() + i); var a1 = Math.round(Math.random() * (40 + i)) + 100 + i; var b1 = Math.round(Math.random() * (1000 + i)) + 500 + i * 2; chartData1.push({ date: newDate, value: a1, volume: b1 }); } } html, body { width: 100%; height: 100%; margin: 0px; } #chartdiv { width: 100%; height: 100%; } <script src="//www.amcharts.com/lib/3/amcharts.js"></script> <script src="//www.amcharts.com/lib/3/serial.js"></script> <script src="//www.amcharts.com/lib/3/themes/light.js"></script> <script src="//www.amcharts.com/lib/3/amstock.js"></script> <div id="chartdiv"></div>
i cant link local json file to the webpage
i am doing a school proget where i have to link a json data local file to a http webpage to get the data but i can't get the results. the code below is the json local code which i want to put in the webpage instead of this code $.getJSON('https://www.highcharts.com/samples/data/jsonp.php?filename=activity.json&callback=?', function (activity) ?({ "xData": [0.001567,0.011765,0.022194,0.032316,0.04266,0.063668,0.074477,0.085323,0.09576,0.106078,0.116096,0.137524,0.148342,0.159059,0.170005,0.180716,0.191407,0.212538,0.222819,0.233929,0.244239,0.255301,0.266081,0.287527,0.298115,0.309392,0.320217,0.330928,0.341401,0.361717,0.372173,0.382337,0.39294,0.403072,0.413454,0.434618,0.444845,0.455745,0.465785,0.475987,0.486064,0.507086,0.517517,0.527961,0.538242,0.548414,0.558444,0.578941,0.589212,0.599472,0.60977,0.620178,0.630189,0.650782,0.661001,0.671137,0.681175,0.691235,0.702012,0.722644,0.733166,0.743824,0.754059,0.764109,0.774519,0.795597,0.805721,0.81592,0.826139,0.836369,0.846826,0.86771,0.87803,0.888342,0.898695,0.908723,0.91922,0.939802,0.950378,0.960776,0.971377,0.981843,0.992312,1.013125,1.023302,1.033488,1.043822,1.054203,1.065019,1.086078,1.09635,1.106421,1.117028,1.127541,1.138599,1.159588,1.170167,1.180741,1.190794,1.201112,1.211355,1.233278,1.243477,1.254957,1.265227,1.276378,1.285656,1.297311,1.308367,1.318715,1.329589,1.340834,1.352388,1.375063,1.385369,1.396291,1.408156,1.418989,1.429535,1.451141,1.462205,1.473011,1.483844,1.494311,1.514761,1.525336,1.535858,1.546476,1.557325,1.567512,1.590091,1.600925,1.612303,1.622558,1.633071,1.643555,1.66484,1.675722,1.685986,1.696733,1.706895,1.719102,1.741295,1.752144,1.762688,1.773713,1.784052,1.795705,1.817305,1.827465,1.838408,1.849369,1.860023,1.871438,1.89257,1.90323,1.914398,1.924634,1.934642,1.945212,1.966275,1.976294,1.986422,1.996652,2.008005,2.018309,2.041139,2.051221,2.0613,2.072507,2.08342,2.094075,2.114574,2.125286,2.135765,2.146845,2.157966,2.169391,2.190921,2.200899,2.212709,2.222671,2.232908,2.244001,2.264898,2.275703,2.286885,2.298115,2.310186,2.32059,2.344695,2.354843,2.366387,2.379001,2.390328,2.402215,2.423134,2.433156,2.444912,2.457061,2.468253,2.478978,2.499832,2.513223,2.52561,2.538429,2.548659,2.560809,2.581308,2.592816,2.603963,2.615992,2.626242,2.638223,2.660346,2.671583,2.681938,2.69265,2.70588,2.716296,2.740081,2.75085,2.761319,2.772027,2.782659,2.793531,2.816194,2.828031,2.839243,2.851443,2.863884,2.874359,2.895246,2.906506,2.91761,2.92786,2.938937,2.950218,2.973357,2.98366,2.994639,3.005213,3.01666,3.02761,3.050025,3.061713,3.071828,3.082787,3.093422,3.105289,3.127231,3.138982,3.149755,3.160217,3.171299,3.191571,3.202226,3.213225,3.223987,3.234092,3.244644,3.265939,3.276411,3.286489,3.297156,3.307909,3.319018,3.34064,3.351107,3.361683,3.373136,3.384768,3.395457,3.417722,3.429096,3.439122,3.449679,3.459868,3.469997,3.492679,3.503647,3.514941,3.525858,3.538746,3.550422,3.572255,3.58452,3.595367,3.605736,3.617401,3.628324,3.652523,3.663679,3.67378,3.684605,3.695595,3.705843,3.728706,3.739169,3.750205,3.761258,3.771771,3.781911,3.804724,3.81631,3.826313,3.837847,3.85049,3.860999,3.88262,3.892937,3.903053,3.913656,3.924698,3.935126,3.956362,3.966543,3.976899,3.98752,3.997644,4.008721,4.029852,4.040633,4.051006,4.06126,4.071761,4.083526,4.10749,4.117855,4.128661,4.13934,4.151117,4.1624,4.184736,4.194826,4.205098,4.215261,4.225325,4.236367,4.262012,4.273794,4.285743,4.297226,4.308086,4.318245,4.340246,4.351486,4.363196,4.374465,4.387109,4.398635,4.421101,4.432135,4.444666,4.456226,4.467413,4.477804,4.498505,4.510413,4.522595,4.534044,4.545944,4.558048,4.580379,4.59312,4.605616,4.618065,4.631266,4.644086,4.667943,4.67948,4.691266,4.703019,4.715923,4.725932,4.752312,4.765224,4.777128,4.787361,4.800435,4.823353,4.836044,4.848602,4.860302,4.871112,4.882779,4.904695,4.914823,4.927074,4.938111,4.949586,4.960761,4.982911,4.9942,5.004246,5.016296,5.027215,5.038043,5.058885,5.070303,5.080649,5.093865,5.104424,5.114903,5.134965,5.146346,5.15634,5.168547,5.179066,5.191167,5.214242,5.224914,5.237573,5.249537,5.261586,5.272517,5.296154,5.306348,5.316773,5.327153,5.339961,5.350638,5.376502,5.389277,5.402142,5.412197,5.42399,5.434873,5.458466,5.470907,5.482679,5.493339,5.50574,5.516349,5.538897,5.549552,5.56083,5.571879,5.583764,5.59509,5.619028,5.629925,5.640716,5.650957,5.661787,5.671957,5.693974,5.704919,5.717491,5.731152,5.744728,5.755687,5.778668,5.791951,5.80409,5.815697,5.828482,5.840501,5.864145,5.875704,5.887893,5.900147,5.912517,5.924894,5.948897,5.959155,5.970262,5.981632,5.992996,6.00356,6.027256,6.038776,6.050959,6.061351,6.071864,6.082436,6.104054,6.115602,6.127623,6.139058,6.150639,6.161323,6.183013,6.194359,6.206269,6.218033,6.2281,6.240494,6.262584,6.275326,6.287166,6.298953,6.310644,6.321583,6.345676,6.356738,6.366782,6.377931,6.388519,6.397159], "datasets": [{ "name": "Speed", "data": [10,20,30,40,50,60,70,80,90,100], "unit": "km/h", "type": "line", "valueDecimals": 1 }, { "name": "Elevation", "data": [10,20,30,40,50,60,70,80,90,100], "unit": "m", "type": "area", "valueDecimals": 0 }, { "name": "Consumo Carburante", "data": [10,20,30,40,50,60,70,80,90,100], "unit": "l", "type": "area", "valueDecimals": 0 }] }); <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Highcharts Example</title> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> <style type="text/css"> .chart { min-width: 320px; max-width: 800px; height: 220px; margin: 0 auto; } </style> <!-- http://doc.jsfiddle.net/use/hacks.html#css-panel-hack --> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style> </style> <script type="text/javascript"> /* The purpose of this demo is to demonstrate how multiple charts on the same page can be linked through DOM and Highcharts events and API methods. It takes a standard Highcharts config with a small variation for each data set, and a mouse/touch event handler to bind the charts together. */ $(function () { /** * In order to synchronize tooltips and crosshairs, override the * built-in events with handlers defined on the parent element. */ $('#container').bind('mousemove touchmove', function (e) { var chart, point, i; for (i = 0; i < Highcharts.charts.length; i = i + 1) { chart = Highcharts.charts[i]; e = chart.pointer.normalize(e); // Find coordinates within the chart point = chart.series[0].searchPoint(e, true); // Get the hovered point if (point) { point.onMouseOver(); // Show the hover marker chart.tooltip.refresh(point); // Show the tooltip chart.xAxis[0].drawCrosshair(e, point); // Show the crosshair } } }); /** * Override the reset function, we don't need to hide the tooltips and crosshairs. */ Highcharts.Pointer.prototype.reset = function () { return undefined; }; /** * Synchronize zooming through the setExtremes event handler. */ function syncExtremes(e) { var thisChart = this.chart; if (e.trigger !== 'syncExtremes') { // Prevent feedback loop Highcharts.each(Highcharts.charts, function (chart) { if (chart !== thisChart) { if (chart.xAxis[0].setExtremes) { // It is null while updating chart.xAxis[0].setExtremes(e.min, e.max, undefined, false, { trigger: 'syncExtremes' }); } } }); } } // Get the data. The contents of the data file can be viewed at // https://github.com/highcharts/highcharts/blob/master/samples/data/activity.json // here i want to add my own json file which is local but i cant add it.. //********************** Problem ************************************** $.getJSON('https://www.highcharts.com/samples/data/jsonp.php?filename=activity.json&callback=?', function (activity) { $.each(activity.datasets, function (i, dataset) { // Add X values dataset.data = Highcharts.map(dataset.data, function (val, j) { return [activity.xData[j], val]; }); $('<div class="chart">') .appendTo('#container') .highcharts({ chart: { marginLeft: 40, // Keep all charts left aligned spacingTop: 20, spacingBottom: 20, zoomType: 'x' }, title: { text: dataset.name, align: 'left', margin: 0, x: 30 }, credits: { enabled: false }, legend: { enabled: false }, xAxis: { crosshair: true, events: { setExtremes: syncExtremes }, labels: { format: '{value} km' } }, yAxis: { title: { text: null } }, tooltip: { positioner: function () { return { x: this.chart.chartWidth - this.label.width, // right aligned y: -1 // align to title }; }, borderWidth: 0, backgroundColor: 'none', pointFormat: '{point.y}', headerFormat: '', shadow: false, style: { fontSize: '18px' }, valueDecimals: dataset.valueDecimals }, series: [{ data: dataset.data, name: dataset.name, type: dataset.type, color: Highcharts.getOptions().colors[i], fillOpacity: 0.3, tooltip: { valueSuffix: ' ' + dataset.unit } }] }); }); }); }); </script> <body> <script src="https://code.highcharts.com/highcharts.js"></script> <div id="container"></div> <!-- ******************************************************************************************** --> </body> </html>
save the below structure into local json file: { "xData": [0.001567,0.011765,0.022194,0.032316,0.04266,0.063668,0.074477,0.085323,0.09576,0.106078,0.116096,0.137524,0.148342,0.159059,0.170005,0.180716,0.191407,0.212538,0.222819,0.233929,0.244239,0.255301,0.266081,0.287527,0.298115,0.309392,0.320217,0.330928,0.341401,0.361717,0.372173,0.382337,0.39294,0.403072,0.413454,0.434618,0.444845,0.455745,0.465785,0.475987,0.486064,0.507086,0.517517,0.527961,0.538242,0.548414,0.558444,0.578941,0.589212,0.599472,0.60977,0.620178,0.630189,0.650782,0.661001,0.671137,0.681175,0.691235,0.702012,0.722644,0.733166,0.743824,0.754059,0.764109,0.774519,0.795597,0.805721,0.81592,0.826139,0.836369,0.846826,0.86771,0.87803,0.888342,0.898695,0.908723,0.91922,0.939802,0.950378,0.960776,0.971377,0.981843,0.992312,1.013125,1.023302,1.033488,1.043822,1.054203,1.065019,1.086078,1.09635,1.106421,1.117028,1.127541,1.138599,1.159588,1.170167,1.180741,1.190794,1.201112,1.211355,1.233278,1.243477,1.254957,1.265227,1.276378,1.285656,1.297311,1.308367,1.318715,1.329589,1.340834,1.352388,1.375063,1.385369,1.396291,1.408156,1.418989,1.429535,1.451141,1.462205,1.473011,1.483844,1.494311,1.514761,1.525336,1.535858,1.546476,1.557325,1.567512,1.590091,1.600925,1.612303,1.622558,1.633071,1.643555,1.66484,1.675722,1.685986,1.696733,1.706895,1.719102,1.741295,1.752144,1.762688,1.773713,1.784052,1.795705,1.817305,1.827465,1.838408,1.849369,1.860023,1.871438,1.89257,1.90323,1.914398,1.924634,1.934642,1.945212,1.966275,1.976294,1.986422,1.996652,2.008005,2.018309,2.041139,2.051221,2.0613,2.072507,2.08342,2.094075,2.114574,2.125286,2.135765,2.146845,2.157966,2.169391,2.190921,2.200899,2.212709,2.222671,2.232908,2.244001,2.264898,2.275703,2.286885,2.298115,2.310186,2.32059,2.344695,2.354843,2.366387,2.379001,2.390328,2.402215,2.423134,2.433156,2.444912,2.457061,2.468253,2.478978,2.499832,2.513223,2.52561,2.538429,2.548659,2.560809,2.581308,2.592816,2.603963,2.615992,2.626242,2.638223,2.660346,2.671583,2.681938,2.69265,2.70588,2.716296,2.740081,2.75085,2.761319,2.772027,2.782659,2.793531,2.816194,2.828031,2.839243,2.851443,2.863884,2.874359,2.895246,2.906506,2.91761,2.92786,2.938937,2.950218,2.973357,2.98366,2.994639,3.005213,3.01666,3.02761,3.050025,3.061713,3.071828,3.082787,3.093422,3.105289,3.127231,3.138982,3.149755,3.160217,3.171299,3.191571,3.202226,3.213225,3.223987,3.234092,3.244644,3.265939,3.276411,3.286489,3.297156,3.307909,3.319018,3.34064,3.351107,3.361683,3.373136,3.384768,3.395457,3.417722,3.429096,3.439122,3.449679,3.459868,3.469997,3.492679,3.503647,3.514941,3.525858,3.538746,3.550422,3.572255,3.58452,3.595367,3.605736,3.617401,3.628324,3.652523,3.663679,3.67378,3.684605,3.695595,3.705843,3.728706,3.739169,3.750205,3.761258,3.771771,3.781911,3.804724,3.81631,3.826313,3.837847,3.85049,3.860999,3.88262,3.892937,3.903053,3.913656,3.924698,3.935126,3.956362,3.966543,3.976899,3.98752,3.997644,4.008721,4.029852,4.040633,4.051006,4.06126,4.071761,4.083526,4.10749,4.117855,4.128661,4.13934,4.151117,4.1624,4.184736,4.194826,4.205098,4.215261,4.225325,4.236367,4.262012,4.273794,4.285743,4.297226,4.308086,4.318245,4.340246,4.351486,4.363196,4.374465,4.387109,4.398635,4.421101,4.432135,4.444666,4.456226,4.467413,4.477804,4.498505,4.510413,4.522595,4.534044,4.545944,4.558048,4.580379,4.59312,4.605616,4.618065,4.631266,4.644086,4.667943,4.67948,4.691266,4.703019,4.715923,4.725932,4.752312,4.765224,4.777128,4.787361,4.800435,4.823353,4.836044,4.848602,4.860302,4.871112,4.882779,4.904695,4.914823,4.927074,4.938111,4.949586,4.960761,4.982911,4.9942,5.004246,5.016296,5.027215,5.038043,5.058885,5.070303,5.080649,5.093865,5.104424,5.114903,5.134965,5.146346,5.15634,5.168547,5.179066,5.191167,5.214242,5.224914,5.237573,5.249537,5.261586,5.272517,5.296154,5.306348,5.316773,5.327153,5.339961,5.350638,5.376502,5.389277,5.402142,5.412197,5.42399,5.434873,5.458466,5.470907,5.482679,5.493339,5.50574,5.516349,5.538897,5.549552,5.56083,5.571879,5.583764,5.59509,5.619028,5.629925,5.640716,5.650957,5.661787,5.671957,5.693974,5.704919,5.717491,5.731152,5.744728,5.755687,5.778668,5.791951,5.80409,5.815697,5.828482,5.840501,5.864145,5.875704,5.887893,5.900147,5.912517,5.924894,5.948897,5.959155,5.970262,5.981632,5.992996,6.00356,6.027256,6.038776,6.050959,6.061351,6.071864,6.082436,6.104054,6.115602,6.127623,6.139058,6.150639,6.161323,6.183013,6.194359,6.206269,6.218033,6.2281,6.240494,6.262584,6.275326,6.287166,6.298953,6.310644,6.321583,6.345676,6.356738,6.366782,6.377931,6.388519,6.397159], "datasets": [{ "name": "Speed", "data": [10,20,30,40,50,60,70,80,90,100], "unit": "km/h", "type": "line", "valueDecimals": 1 }, { "name": "Elevation", "data": [10,20,30,40,50,60,70,80,90,100], "unit": "m", "type": "area", "valueDecimals": 0 }, { "name": "Consumo Carburante", "data": [10,20,30,40,50,60,70,80,90,100], "unit": "l", "type": "area", "valueDecimals": 0 }] } Anyway, the most preferable way is to use getJson method: $.getJSON( "test.json", function( data ) { var items = []; $.each( data, function( key, val ) { ... process data }); ... });