Учитывая, что ваш исходный JSON имеет сложный формат, который напрямую не работает с AmCharts, вы должны использовать обратный вызов postProcess
dataLoader, чтобы получить ответ и адаптировать его к вашим потребностям.Если вы посмотрите на пример документации отклика API * openweathermap , вы увидите, что она отображает каждое поле и то, что ему соответствует.Основные свойства, представляющие интерес: main.temp
, dt
, rain.3h
и snow.3h
.Вы захотите извлечь эту информацию для каждой точки и назначить ее вашему массиву.В вашем ответе API каждая точка находится в массиве list
, поэтому вы захотите пройти через это.
Вот как будет выглядеть метод postProcess
:
"dataLoader": {
"url": "YOUR API URL HERE",
"postProcess": function(jsonData) {
var newData = []; //dataProvider for your chart
//loop through your API response's list array for the data you need
jsonData.list.forEach(function(periodInfo) {
//set up the data point with the converted timestamp,
//converted temperature, and placeholder for precipitation
var dataPoint = {
"date": periodInfo.dt * 1000, //convert to milliseconds
"temperature": periodInfo.main.temp - 273.15, //convert kelvin to celsius
"precipitation": 0
};
//check if we have a value for rain precipitation before adding it to our precipitation property
if (periodInfo.rain !== undefined && periodInfo.rain['3h'] !== undefined) {
dataPoint.precipitation += periodInfo.rain['3h'];
}
//check if we have a value for snow precipitation before adding it in
if (periodInfo.snow !== undefined && periodInfo.snow['3h'] !== undefined) {
dataPoint.precipitation += periodInfo.snow['3h'];
}
//finally, add it to your new data array
newData.push(dataPoint);
});
//return the new array to be assigned to the chart's dataProvider
return newData;
}
},
Теперьу вас есть сопоставленные данные, вы должны обновить вызов makeChart для поиска этих свойств, создав graph
объекты с соответствующими свойствами valueField
(temperature
и precipitation
), установив для categoryField
значение date
и создайте categoryAxis
с включенным parseDates
и minPeriod
, установленным на hh
, поскольку данные являются почасовыми.Возможно, вы также захотите создать вторую ось значений для значений осадков.
Вот фрагмент обновленных свойств makeChart:
//create value axes for both temperature and precip values
"valueAxes": [{
"id": "temperature",
"title": "Temperature (C)"
}, {
"id": "precipitation",
"title": "Precipitation (mm)",
"position": "right"
}],
"synchronizeGrid": true, //make sure the grids from both axes are synchronized
"graphs": [{
"bullet": "round",
"valueField": "temperature"
},{
"fillAlphas": 0.9,
"lineAlpha": 0.2,
"type": "column",
"valueField": "precipitation",
"valueAxis": "precipitation" //plot this against the precipitation value axis
}],
"categoryField": "date",
"categoryAxis": {
"parseDates": true,
"minPeriod": "hh" //make sure we plot hourly data correctly
},
Вот demo с использованиемстатический JSON-файл вышеуказанного API-ответа, чтобы проиллюстрировать это.Я добавил некоторые другие настройки качества жизни, такие как курсор и настройка точности.Я рекомендую ознакомиться с документацией по AmCharts API для получения дополнительной информации.