Highcharts serisine Ek Verileri ayarlayın


116

Seri nesnesine grafikte 'araç ipucu' göstermek için kullanılacak bazı ek verileri iletmenin herhangi bir yolu var mı?

Örneğin

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

burada seriler için sadece series.name, this.x & this.y kullanabiliriz. veri kümesiyle tek başına başka bir dinamik değer geçirmem gerektiğini ve seri nesnesi aracılığıyla erişebileceğimi varsayalım. Mümkün mü?

Şimdiden teşekkür ederim.


1
Javascript, hangi nesneleri ilettiğiniz konusunda seçici değildir ve kullanılmazlarsa genellikle onları görmezden gelir. Kütüphanenin dahili kodu tarafından çıkarılmış olabilirler, ancak zorunlu değildirler ve genellikle denemeye değerdir. seriesNesnenize ek veri eklemeyi ve bu işleyicide görüntülemeyi denediniz mi?
Merlyn Morgan-Graham

@ MerlynMorgan-Graham - 'HighCharts'ta yeniyim. örnek bulabileceğim herhangi bir bağlantı gönderebilir misiniz? bana yardım ettiğiniz için çok teşekkür ederim.
Sam

@Sam, cevabımın bir göz atabileceğiniz eksiksiz bir çalışma örneği var. Gereksinimlerinizi tam olarak karşılamıyorsa bana bildirin.
Nick

Veri dizisi veri gibi olduğu için kabarcık grafiği durumunda myData gibi ek verileri nasıl ekleyebilirim: [[12, 43, 13], [74, 23, 44]] ör. Yukarıdaki gibi veri değerlerinin anahtarları nelerdir "y" var, "x", "y" ve "z" var mı? veya 'size'
vishal

Yanıtlar:


220

Evet, seri nesnesini aşağıdaki gibi ayarlarsanız, burada her veri noktası bir karmadır, o zaman ekstra değerler iletebilirsiniz:

new Highcharts.Chart( {
    ...,
    series: [ {
        name: 'Foo',
        data: [
            {
                y : 3,
                myData : 'firstPoint'
            },
            {
                y : 7,
                myData : 'secondPoint'
            },
            {
                y : 1,
                myData : 'thirdPoint'
            }
        ]
    } ]
} );

Araç ipucunuzda, ona iletilen nesnenin "nokta" özelliği aracılığıyla erişebilirsiniz:

tooltip: {
    formatter: function() {
        return 'Extra data: <b>' + this.point.myData + '</b>';
    }
}

Tam örnek burada: https://jsfiddle.net/burwelldesigns/jeoL5y7s/


1
Bunun eski bir cevap olduğunu biliyorum, ancak bağlantılı keman artık ilgili örneği göstermiyor.
undefinedvariable

@undefinedvariable - hmm, görünüşe göre diğerleri bunu düzenledi ve jsfiddle'da "temel" sürüm olarak yeni bir sürümü ayarladı. Bu talihsizlik. Keman güncellendi ve şimdi yanıtta belirli bir versiyona bağlanılıyor.
Nick

@Nick, harika, teşekkürler. Bu arada, harika cevap. Bilgileri gizlice içeri sokmak için kullanılmayan varsayılan değerlerim tükeniyor.
undefinedvariable

Verim bir diziyse nasıl erişilir?
vishal

2
Teşekkürler, veri dizisi veri gibi olduğundan kabarcık grafik durumunda myData gibi ek verileri nasıl ekleyebilirim: [[12, 43, 13], [74, 23, 44]] ör. Veri değerleri için anahtarlar nelerdir? yukarıda 'y' var, 'x', 'y' ve 'z' var mı? veya 'beden'?
vishal

17

Ek olarak, bu çözümle, birden çok veriyi istediğiniz kadar koyabilirsiniz :

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'
    }]
}]

Teşekkürler Nick.


4
[X, y] nesne olmayan biçim kullanıldığında 'ek veriler' mümkün değil mi? Biz datetimex-değeri olarak ancak araç ipucu ek veri eklemek istiyorum.
Rvanlaak

Zaman serisi verileri için örnek: var serie = {x: Date.parse (d.Value), y: d.Item, method: d.method};
Arjun Upadhyay

15

Zaman serisi verileri için, özellikle turbo eşiğini etkinleştirmek için yeterli veri noktası olduğunda , yukarıda önerilen çözümler işe yaramayacaktır. Turbo eşiği durumunda, bunun nedeni Highcarts'ın veri noktalarının aşağıdaki gibi bir dizi olmasını beklemesidir:

series: [{
    name: 'Numbers over the course of time',
    data: [
      [1515059819853, 1],
      [1515059838069, 2],
      [1515059838080, 3],
      // you get the idea
    ]
  }]

Turbo eşiğinin faydalarını kaybetmemek için (ki bu çok fazla veri noktasıyla uğraşırken önemlidir), verileri grafiğin dışında saklıyorum ve araç ipucu formatterişlevinde veri noktasını araştırıyorum . İşte bir örnek:

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])
    }]
})

Bu yaklaşım tüm grafik türleri için işe yarayacaktır.


Cevabınız için teşekkürler, Yüksek Stok grafiklerinde ek verileri görüntülemek için gerçekten yararlı.
S Kumar

1
Gerekmiyor data: _.map(data, row => [row['timestamp'], row['value']])olmak data: chartData.map(row => [row.timestamp, row.value])? Ayrıca, lodash'a ihtiyacınız yok; Array.find'ı kullanabilirsiniz . IE tarafından desteklenmiyor, ancak zaten ES6 kullanıyorsunuz ( const) ve MS 2016'da IE'yi desteklemeyi bıraktı .
Dan Dascalescu

İyi yakaladın chartData. Lodash kullanmaya alışkınım ama haklısın. Örneğimi kütüphaneden bağımsız olacak şekilde güncelledim. Teşekkürler.
Christof

3

Verilerimi SQL Server'dan almak için AJAX kullanıyorum, ardından grafiğimde veri olarak kullanılacak bir js dizisi hazırlıyorum. AJAX başarılı olduğunda JavaScript kodu:

...,
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);
         },

Şimdi ipucunda fazladan meta verileri göstermek için:

...
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,
},

Sonuç kümemi yinelemek için bir DataRow kullanıyorum, ardından Json biçiminde geri iletmeden önce değerleri atamak için bir sınıf kullanıyorum. İşte Ajax tarafından çağrılan denetleyici eylemindeki C # kodu.

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 # ile kodlamanın daha verimli ve kabul edilebilir bir yolu olduğunun farkındayım ama projeyi miras aldım.


1

Sadece bir çeşit dinamizm eklemek için:

Bunu, 10 kategorili yığılmış bir sütun grafik için veri oluşturmak için yaptım.
Her bir kategori 4 veri serisi için sahip olmak istedim ve her bir veri serisi için ek bilgi (resim, soru, dikkat dağıtıcı ve beklenen cevap) görüntülemek istedim:

<?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"
);
?>

Öne çıkan grafikler bölümünde:

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.

Umarım birine yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.