추가 데이터를 highcharts 시리즈로 설정


116

차트 '툴팁'에 표시하는 데 사용할 시리즈 개체에 추가 데이터를 전달하는 방법이 있습니까?

예를 들면

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

여기서는 series.name, this.x & this.y를 시리즈에만 사용할 수 있습니다. 데이터 세트와 함께 또 다른 동적 값을 전달해야하며 시리즈 객체를 통해 액세스 할 수 있습니다. 이게 가능해?

미리 감사드립니다.


1
Javascript는 전달하는 개체에 대해 까다 롭지 않으며 일반적으로 사용되지 않으면 무시합니다. 라이브러리의 내부 코드에 의해 제거 될 수 있지만 반드시 그런 것은 아니며 일반적으로 한 번의 가치가 있습니다. series객체에 추가 데이터를 추가 하고이 핸들러에 표시해 보셨습니까 ?
Merlyn Morgan-Graham

@ MerlynMorgan-Graham-저는 'HighCharts'를 처음 사용합니다. 예제를 찾을 수있는 링크를 게시 해 주시겠습니까? 도와 주셔서 대단히 감사합니다.

@Sam, 내 대답에는 살펴볼 수있는 완전한 작동 예가 있습니다. 귀하의 요구 사항을 충족하지 못하는 경우 알려주십시오.
Nick

데이터 배열이 데이터와 같기 때문에 버블 차트의 경우 myData와 같은 추가 데이터를 어떻게 추가 할 수 있습니까? [[12, 43, 13], [74, 23, 44]] 예 : 위와 같은 데이터 값에 대한 키는 무엇입니까? 'y', 'x', 'y'및 'z'가 있습니까? 또는 '크기'
vishal

답변:


220

예, 다음과 같이 각 데이터 포인트가 해시 인 시리즈 객체를 설정하면 추가 값을 전달할 수 있습니다.

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

툴팁에서 전달 된 객체의 "point"속성을 통해 액세스 할 수 있습니다.

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

전체 예 : https://jsfiddle.net/burwelldesigns/jeoL5y7s/


1
나는 이것이 오래된 대답이라는 것을 알고 있지만 연결된 바이올린은 더 이상 관련 예제를 표시하지 않습니다.
undefinedvariable

@undefinedvariable-흠, 다른 사람들이 이것을 편집하고 jsfiddle에서 새 버전을 "기본"버전으로 설정 한 것 같습니다. 운이 없었어. 바이올린을 업데이트하고 이제 답변의 특정 버전에 연결합니다.
Nick

@Nick, 굉장합니다, 감사합니다. 그건 그렇고 훌륭한 대답입니다. 정보를 몰래 들어가기 위해 사용되지 않은 기본값이 부족했습니다.
undefinedvariable

배열 인 경우 myData에 액세스하는 방법은 무엇입니까?
vishal

2
감사합니다. 데이터 배열이 데이터와 같기 때문에 버블 차트의 경우 myData와 같은 추가 데이터를 어떻게 추가 할 수 있습니까? [[12, 43, 13], [74, 23, 44]] 예 : 데이터 값에 대한 키는 무엇입니까? 위의 내용에는 'y'가 있는데 'x', 'y'및 'z'가 있습니까? 또는 '크기'?
vishal

17

또한이 솔루션 을 사용하면 원하는만큼 여러 데이터를 넣을 수도 있습니다 .

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

닉 감사합니다.


4
[x, y] 비 객체 형식을 사용하면 '추가 데이터'가 불가능합니까? 우리는이 datetimex 값으로 만 툴팁에 추가 데이터를 추가 할.
Rvanlaak

timeseries 데이터의 예 : var serie = {x : Date.parse (d.Value), y : d.Item, method : d.method};
아르 준 Upadhyay

15

시계열 데이터, 특히 터보 임계 값 을 활성화하기에 충분한 데이터 포인트가있는 경우 위의 제안 된 솔루션이 작동하지 않습니다. 터보 임계 값의 경우 이것은 Highcarts가 데이터 포인트가 다음과 같은 배열이 될 것으로 예상하기 때문입니다.

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

터보 임계 값 (많은 데이터 포인트를 다룰 때 중요 함)의 이점을 잃지 않기 위해 차트 외부에 데이터를 저장하고 툴팁 formatter기능 에서 데이터 포인트를 조회합니다 . 예를 들면 다음과 같습니다.

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

이 접근 방식은 모든 차트 유형에 적용됩니다.


감사합니다. 고가 그래프에 추가 데이터를 표시하는 데 정말 도움이됩니다.
S Kumar

1
data: _.map(data, row => [row['timestamp'], row['value']])data: chartData.map(row => [row.timestamp, row.value])? 또한 lodash가 필요하지 않습니다. Array.find 사용할 수 있습니다 . IE에서는 지원되지 않지만 이미 ES6을 사용 const하고 있으며 ( ) MS는 2016 년에 IE 지원을 중단했습니다 .
Dan Dascalescu

잘 잡아 chartData. 나는 lodash를 사용하는 데 익숙하지만 당신이 맞습니다. 라이브러리에 구애받지 않도록 예제를 업데이트했습니다. 고마워.
Christof

3

AJAX를 사용하여 SQL Server에서 데이터를 가져온 다음 차트에서 데이터로 사용되는 js 배열을 준비합니다. AJAX가 성공하면 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);
         },

이제 도구 설명에 추가 메타 데이터를 표시합니다.

...
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 # 코드입니다.

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 #으로 코딩하는 데 더 효율적이고 수용 가능한 방법이 있다는 것을 알고 있지만 프로젝트를 상속했습니다.


1

일종의 역 동성을 추가하기 위해 :

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.

누군가에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.