차트 ‘툴팁’에 표시하는 데 사용할 시리즈 개체에 추가 데이터를 전달하는 방법이 있습니까?
예를 들면
tooltip: {
formatter: function() {
return '<b>'+ this.series.name +'</b><br/>'+
Highcharts.dateFormat('%b %e', this.x) +': '+ this.y;
}
여기서는 series.name, this.x & this.y를 시리즈에만 사용할 수 있습니다. 데이터 세트와 함께 또 다른 동적 값을 전달해야하며 시리즈 객체를 통해 액세스 할 수 있습니다. 이게 가능해?
미리 감사드립니다.
답변
예, 다음과 같이 각 데이터 포인트가 해시 인 시리즈 객체를 설정하면 추가 값을 전달할 수 있습니다.
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/
답변
또한이 솔루션 을 사용하면 원하는만큼 여러 데이터를 넣을 수도 있습니다 .
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'
}]
}]
닉 감사합니다.
답변
시계열 데이터, 특히 터보 임계 값 을 활성화하기에 충분한 데이터 포인트가있는 경우 위의 제안 된 솔루션이 작동하지 않습니다. 터보 임계 값의 경우 이것은 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])
}]
})
이 접근 방식은 모든 차트 유형에 적용됩니다.
답변
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 #으로 코딩하는 데 더 효율적이고 수용 가능한 방법이 있다는 것을 알고 있지만 프로젝트를 상속했습니다.
답변
일종의 역 동성을 추가하기 위해 :
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.
누군가에게 도움이되기를 바랍니다.