Установка дополнительных данных в ряд highcharts
есть ли способ передать некоторые дополнительные данные в объект series, который будет использоваться для отображения в диаграмме "всплывающая подсказка"?
tooltip: {
formatter: function() {
return '<b>'+ this.series.name +'</b><br/>'+
Highcharts.dateFormat('%b %e', this.x) +': '+ this.y;
}
здесь мы можем использовать только series.name -это.x & это.г в серии. допустим, мне нужно передать другое динамическое значение в одиночку с набором данных и получить доступ через объект series. это возможно?
спасибо всем заранее.
5 ответов:
да, если вы настроили объект series следующим образом, где каждая точка данных является хэшем, то вы можете передать дополнительные значения:
new Highcharts.Chart( { ..., series: [ { name: 'Foo', data: [ { y : 3, myData : 'firstPoint' }, { y : 7, myData : 'secondPoint' }, { y : 1, myData : 'thirdPoint' } ] } ] } );
в подсказке вы можете получить доступ к нему через атрибут "точка" объекта, переданного в:
tooltip: { formatter: function() { return 'Extra data: <b>' + this.point.myData + '</b>'; } }
полный пример здесь: https://jsfiddle.net/burwelldesigns/jeoL5y7s/
кроме того, с помощью этого решения, вы можете даже поместить несколько данных столько, сколько вы хотите:
tooltip: { formatter: function () { return 'Extra data: <b>' + this.point.myData + '</b><br> Another Data: <b>' + this.point.myOtherData + '</b>'; } }, series: [{ name: 'Foo', data: [{ y: 3, myData: 'firstPoint', myOtherData: 'Other first data' }, { y: 7, myData: 'secondPoint', myOtherData: 'Other second data' }, { y: 1, myData: 'thirdPoint', myOtherData: 'Other third data' }] }]
спасибо Ник.
для данных временных рядов, особенно с достаточным количеством точек данных, чтобы активировать турбо порог, предложенные выше решения не получится. В случае порога turbo это связано с тем, что Highcarts ожидает, что точки данных будут массивом, например:
series: [{ name: 'Numbers over the course of time', data: [ [1515059819853, 1], [1515059838069, 2], [1515059838080, 3], // you get the idea ] }]
чтобы не потерять преимущества порога turbo (что важно при работе с большим количеством точек данных), я сохраняю данные за пределами диаграммы и просматриваю точку данных в подсказке
Я использую AJAX для получения данных из SQL Server, затем я готовлю массив js, который используется в качестве данных в моей диаграмме. Код JavaScript после успешного выполнения AJAX:
..., success: function (data) { var fseries = []; var series = []; for (var arr in data) { for (var i in data[arr]['data'] ){ var d = data[arr]['data'][i]; //if (i < 5) alert("d.method = " + d.method); var serie = {x:Date.parse(d.Value), y:d.Item, method:d.method }; series.push(serie); } fseries.push({name: data[arr]['name'], data: series, location: data[arr]['location']}); series = []; }; DrawChart(fseries); },
Теперь, чтобы показать дополнительные метаданные в подсказке:
... tooltip: { xDateFormat: '%m/%d/%y', headerFormat: '<b>{series.name}</b><br>', pointFormat: 'Method: {point.method}<br>Date: {point.x:%m/%d/%y } <br>Reading: {point.y:,.2f}', shared: false, },
Я использую DataRow для итерации через мой результирующий набор, а затем я использую класс для присвоения значений до передачи обратно в формате Json. Вот код C# в действии контроллера, вызванном Ajax.
public JsonResult ChartData(string dataSource, string locationType, string[] locations, string[] methods, string fromDate, string toDate, string[] lstParams) { List<Dictionary<string, object>> dataResult = new List<Dictionary<string, object>>(); Dictionary<string, object> aSeries = new Dictionary<string, object>(); string currParam = string.Empty; lstParams = (lstParams == null) ? new string[1] : lstParams; foreach (DataRow dr in GetChartData(dataSource, locationType, locations, methods, fromDate, toDate, lstParams).Rows) { if (currParam != dr[1].ToString()) { if (!String.IsNullOrEmpty(currParam)) //A new Standard Parameter is read and add to dataResult. Skips first record. { Dictionary<string, object> bSeries = new Dictionary<string, object>(aSeries); //Required else when clearing out aSeries, dataResult values are also cleared dataResult.Add(bSeries); aSeries.Clear(); } currParam = dr[1].ToString(); aSeries["name"] = cParam; aSeries["data"] = new List<ChartDataModel>(); aSeries["location"] = dr[0].ToString(); } ChartDataModel lst = new ChartDataModel(); lst.Value = Convert.ToDateTime(dr[3]).ToShortDateString(); lst.Item = Convert.ToDouble(dr[2]); lst.method = dr[4].ToString(); ((List<ChartDataModel>)aSeries["data"]).Add(lst); } dataResult.Add(aSeries); var result = Json(dataResult.ToList(), JsonRequestBehavior.AllowGet); //used to debug final dataResult before returning to AJAX call. return result; }
Я понимаю, что есть это более эффективный и приемлемый способ кодирования в C#, но я унаследовал проект.
просто чтобы добавить какой-то динамизм :
сделал это для генерации данных для сложенной гистограммы с 10 категориями.
Я хотел иметь для каждой категории 4 серии данных и хотел отображать дополнительную информацию (изображение, вопрос, дистрактор и ожидаемый ответ) для каждого из рядов данных:<?php while($n<=10) { $data1[]=array( "y"=>$nber1, "img"=>$image1, "ques"=>$ques, "distractor"=>$distractor1, "answer"=>$ans ); $data2[]=array( "y"=>$nber2, "img"=>$image2, "ques"=>$ques, "distractor"=>$distractor2, "answer"=>$ans ); $data3[]=array( "y"=>$nber3, "img"=>$image3, "ques"=>$ques, "distractor"=>$distractor3, "answer"=>$ans ); $data4[]=array( "y"=>$nber4, "img"=>$image4, "ques"=>$ques, "distractor"=>$distractor4, "answer"=>$ans ); } // Then convert the data into data series: $mydata[]=array( "name"=>"Distractor #1", "data"=>$data1, "stack"=>"Distractor #1" ); $mydata[]=array( "name"=>"Distractor #2", "data"=>$data2, "stack"=>"Distractor #2" ); $mydata[]=array( "name"=>"Distractor #3", "data"=>$data3, "stack"=>"Distractor #3" ); $mydata[]=array( "name"=>"Distractor #4", "data"=>$data4, "stack"=>"Distractor #4" ); ?>
в разделе highcharts:
var mydata=<? echo json_encode($mydata)?>; // Tooltip section tooltip: { useHTML: true, formatter: function() { return 'Question ID: <b>'+ this.x +'</b><br/>'+ 'Question: <b>'+ this.point.ques +'</b><br/>'+ this.series.name+'<br> Total attempts: '+ this.y +'<br/>'+ "<img src=\"images/"+ this.point.img +"\" width=\"100px\" height=\"50px\"/><br>"+ 'Distractor: <b>'+ this.point.distractor +'</b><br/>'+ 'Expected answer: <b>'+ this.point.answer +'</b><br/>'; } }, // Series section of the highcharts series: mydata // For the category section, just prepare an array of elements and assign to the category variable as the way I did it on series.
надеюсь, что это поможет кому-то.