ตั้งค่าข้อมูลเพิ่มเติมเป็นชุด 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' คุณช่วยโพสต์ลิงค์ที่ฉันสามารถหาตัวอย่างได้ไหม ขอบคุณมากที่ช่วยฉัน.
แซม

@ แซมคำตอบของฉันมีตัวอย่างการทำงานเต็มรูปแบบที่คุณสามารถดูได้ โปรดแจ้งให้เราทราบหากไม่ตรงตามความต้องการของคุณ
นิค

ฉันจะเพิ่มข้อมูลเพิ่มเติมเช่น myData ในกรณีของแผนภูมิฟองเนื่องจากอาร์เรย์ข้อมูลเป็นเหมือนข้อมูล: [[12, 43, 13], [74, 23, 44]] เช่นอะไรคือคีย์สำหรับค่าข้อมูลเช่นข้างต้น มี 'y' มี 'x', 'y' และ 'z' หรือไม่ หรือ 'size'
vishal

คำตอบ:


220

ได้หากคุณตั้งค่าออบเจ็กต์ซีรีส์ดังต่อไปนี้โดยที่แต่ละจุดข้อมูลเป็นแฮชคุณสามารถส่งผ่านค่าพิเศษ

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/


1
ฉันรู้ว่านี่เป็นคำตอบเก่า แต่การเชื่อมโยงซอไม่แสดงตัวอย่างที่เกี่ยวข้องอีกต่อไป
undefinedvariable

@undefinedvariable - อืมดูเหมือนคนอื่นจะแก้ไขสิ่งนี้และตั้งค่าเวอร์ชันใหม่เป็นเวอร์ชัน "ฐาน" ใน jsfiddle ที่โชคร้าย อัปเดตซอและเชื่อมโยงไปยังเวอร์ชันเฉพาะในคำตอบ
นิค

@ นิกน่ากลัวขอบคุณ คำตอบที่ดีโดยวิธีการ ฉันหมดค่าเริ่มต้นที่ไม่ได้ใช้เพื่อแอบดูข้อมูล
undefinedvariable

จะเข้าถึง myData ได้อย่างไรหากเป็นอาร์เรย์
vishal

2
ขอบคุณฉันจะเพิ่มข้อมูลเพิ่มเติมเช่น myData ในกรณีของแผนภูมิฟองได้อย่างไรเนื่องจากอาร์เรย์ข้อมูลเป็นเหมือนข้อมูล: [[12, 43, 13], [74, 23, 44]] เช่นคีย์อะไรสำหรับค่าข้อมูลเช่น ด้านบนมี 'y' มี 'x', 'y' และ 'z' หรือไม่ หรือ 'size'?
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]? เรามีdatetimeเป็นค่า x แต่ต้องการเพิ่มข้อมูลพิเศษในคำแนะนำเครื่องมือ
Rvanlaak

ตัวอย่างสำหรับข้อมูลไทม์ซีรีส์: var serie = {x: Date.parse (d.Value), y: dItem, method: d.method};
Arjun 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])
    }]
})

วิธีนี้จะใช้ได้กับแผนภูมิทุกประเภท


ขอบคุณสำหรับคำตอบการแสดงข้อมูลเพิ่มเติมในกราฟ High Stock มีประโยชน์มาก
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 หยุดการสนับสนุน IE ในปี 2016
Dan Dascalescu

chartDataจับดีกับ ฉันคุ้นเคยกับการใช้ lodash แต่คุณพูดถูก ฉันอัปเดตตัวอย่างของฉันเพื่อให้ไลบรารีไม่เชื่อเรื่องพระเจ้า ขอบคุณ.
Christof

3

ฉันใช้ 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 # ที่มีประสิทธิภาพและเป็นที่ยอมรับมากกว่า แต่ฉันได้รับโครงการ


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.