首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将附加数据设置为highcharts系列

将附加数据设置为highcharts系列
EN

Stack Overflow用户
提问于 2011-12-15 10:39:30
回答 3查看 97.3K关注 0票数 117

有没有办法将一些额外的数据传递给series对象,用来在图表的“工具提示”中显示?

例如

代码语言:javascript
复制
 tooltip: {
     formatter: function() {
               return '<b>'+ this.series.name +'</b><br/>'+
           Highcharts.dateFormat('%b %e', this.x) +': '+ this.y;
     }

这里我们只能使用series.name,this.x & this.y到这个系列。假设我需要单独传递另一个动态值和数据集,并且可以通过series对象访问。这个是可能的吗?

提前感谢大家。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-15 13:47:21

可以,如果您像下面这样设置series对象,其中每个数据点都是一个散列,那么您可以传递额外的值:

代码语言:javascript
复制
new Highcharts.Chart( {
    ...,
    series: [ {
        name: 'Foo',
        data: [
            {
                y : 3,
                myData : 'firstPoint'
            },
            {
                y : 7,
                myData : 'secondPoint'
            },
            {
                y : 1,
                myData : 'thirdPoint'
            }
        ]
    } ]
} );

在您的工具提示中,您可以通过传入的对象的"point“属性访问它:

代码语言:javascript
复制
tooltip: {
    formatter: function() {
        return 'Extra data: <b>' + this.point.myData + '</b>';
    }
}

完整示例如下:https://jsfiddle.net/burwelldesigns/jeoL5y7s/

票数 223
EN

Stack Overflow用户

发布于 2018-01-04 18:11:09

对于时间序列数据,特别是具有足够的数据点来激活turbo threshold的情况下,上述建议的解决方案将不起作用。在turbo阈值的情况下,这是因为Highcarts希望数据点是如下所示的数组:

代码语言:javascript
复制
series: [{
    name: 'Numbers over the course of time',
    data: [
      [1515059819853, 1],
      [1515059838069, 2],
      [1515059838080, 3],
      // you get the idea
    ]
  }]

为了不失去加速阈值的好处(这在处理大量数据点时很重要),我将数据存储在图表外部,并在工具提示formatter函数中查找数据点。下面是一个例子:

代码语言:javascript
复制
const chartData = [
  { timestamp: 1515059819853, value: 1, somethingElse: 'foo'},
  { timestamp: 1515059838069, value: 2, somethingElse: 'bar'},
  { timestamp: 1515059838080, value: 3, somethingElse: 'baz'},
  // you get the idea
]

const Chart = Highcharts.stockChart(myChart, {
  // ...options
  tooltip: {
    formatter () {
      // this.point.x is the timestamp in my original chartData array
      const pointData = chartData.find(row => row.timestamp === this.point.x)
      console.log(pointData.somethingElse)
    }
  },
  series: [{
      name: 'Numbers over the course of time',
      // restructure the data as an array as Highcharts expects it
      // array index 0 is the x value, index 1 is the y value in the chart
      data: chartData.map(row => [row.timestamp, row.value])
    }]
})

此方法适用于所有图表类型。

票数 15
EN

Stack Overflow用户

发布于 2016-03-24 09:06:34

我使用AJAX从SQL Server获取数据,然后准备一个js数组作为图表中的数据。在AJAX成功后编写JavaScript代码:

代码语言:javascript
复制
...,
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);
         },

现在,要在工具提示中显示额外的元数据:

代码语言:javascript
复制
...
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格式传回之前,我使用一个类来赋值。下面是Ajax调用的控制器操作中的C#代码。

代码语言:javascript
复制
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#编码方式,但我继承了这个项目。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8514457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档