如何从CSV创建行Hightchart,其中两列数据用作工具提示文本
How to create line Hightchart from CSV where two columns of data are used as tooltip text?
这是一个由多部分组成的问题,请原谅问题的长度。
我正试图创建一个图表,将患者的身高、体重和BMI绘制为多个日期的独立系列。在迁移到服务器之前,我想使用CSV提取数据以进行测试。我正试图让它像这个FIDDLE一样工作,但到目前为止还没有成功。
这是我的代码的一个版本,数据是硬编码的:
$(function () {
var options = {
chart: {
renderTo: 'container',
type: 'line'
},
title: {
text: 'Patient Measurements'
},
xAxis: {
categories: []
},
yAxis: {
title: {
text: 'Measurements'
}
},
series: []
};
var data = "ID,PATIENT_NAME,DATA_DATE,HEIGHT,WEIGHT,BMI'n" +
"1,'"Doe,John'",1/1/2013 00:00:00,65,185,30.78224852'n" +
"1,'"Doe,John'",1/2/2013 00:00:00,65,184,30.61585799'n" +
"1,'"Doe,John'",2/1/2013 00:00:00,65,181,30.11668639'n" +
"1,'"Doe,John'",2/2/2013 00:00:00,65,180,29.95029585'n"
// Split the lines
var lines = data.split(''n');
var first = lines.shift().split(',');
var series_holder = [];
for (var = i, i < first.length, i++) {
var s = {
data: []
};
series_holder.push(s);
}
$.each (lines, function(lineNo, line) {
var items = line.split(',');
$.each (items, function(itemNo, item){
// If itemNo is the row/column iteration object, then start at column 2
if (itemNo >= 2) {
// Subtract the column from the itemNo to get a zero-based series_holder
series_holder[itemNo - 2].data.push(parseFloat(item));
}
});
});
options.series = series_holder;
var chart = new Highcharts.Chart(options);
});
该示例应绘制三条线(一条表示身高、体重和BMI),每条线(每个日期)有四个数据点。
我知道我的示例中的数据不是根据Highcharts建议格式化的,但我需要能够从CSV中获取ID和PATIENT_NAME字段,并在该系列的工具提示中使用它们,以便无论您悬停在哪个数据点上,ID和PATIE NT_NAME都能识别患者。我知道我可以在页面上的DIV或其他东西中显示它,但我希望能够做到这一点,因为我有其他想法,如果我能弄清楚如何让它发挥作用,我可以在工具提示中显示。
通过查看Highcharts网站,我相信我所需要做的就是在上面的代码中添加以下代码,而不是var data="…":
$.get(inputData, function(data) {
// Check for data
if (data.value != "") {
alert("No data to retrieve!");
return(0);
}
我不太精通Javascript、jQuery或Highcharts,但我正在尽我所能快速学习。我意识到我的代码中可能有很多错误(有些是故意的,比如parseFloat用于非浮点数据类型,这样我就可以学习如何处理/解析不同的数据类型),所以我感谢大家的耐心。
谢谢你的帮助。我已经对此进行了更多的研究,在进行了大量调试以确定如何处理数据后,我得出了以下代码。我想这可能是一个简化的版本,可能会更好地理解我的观点。
$(function () {
var options = {
chart: {
renderTo: 'container',
type: 'line'
},
title: {
text: 'Patient Measurements'
},
xAxis: {
categories: []
},
yAxis: {
title: {
text: 'Measurements'
}
},
series: []
};
var data = "ID;PATIENT_NAME;DATA_DATE;AVG_HEIGHT;AVG_WEIGHT;BMI;WEIGHT_STATUS'n"+"1;DOE,JOHN;2012-12-29 00:00:00;65;185;30.7822485207101;Obese'n"+"1;DOE,JOHN;2013-01-12 00:00:00;65;184;30.6158579881657;Obese'n"+"1;DOE,JOHN;2013-02-09 00:00:00;65;181;30.1166863905325;Obese'n";
// Split the lines
var lines = data.split(''n');
var first = lines.shift().split(';');
var series_holder = [];
$.each (lines, function(lineNo, line) {
var items = line.split(';');
$.each(items, function(itemNo, item) {
if (itemNo == 3) {
options.xAxis.categories.push(item);
}
else if (itemNo > 3 && itemNo < 7) {
series_holder[itemNo-4].data.push(parseFloat(item));
}
});
});
for (var i = 4; i < first.length - 1; i++) {
var s = {
data: []
};
s.name = first[i].replace(/AVG_/g,"");
series_holder.push(s);
}
var chart = new Highcharts.Chart(options);
});
x轴应为date_date下的日期值。
系列/线路应如下:
- 高度
- 重量
- BMI
绘图点的数据在标题行之后的列索引4(AVG_HEIGHT)到6(BMI)中。
这是我要做的一个Fiddle示例,它与我想做的类似……我只是无法让它为我的特定数据工作。
我暂时不谈问题的工具提示和CSV部分。我真的很想让我的一些东西发挥作用,这样我就知道我走在了正确的轨道上。
这不是一个完整的答案,但更多的是一个提示:Highcharts有一个插件(modules/data.src.js),可以处理csv数据的解析,这应该让你开始。它将自动使用列名作为序列名,并尝试猜测列的类型(日期时间/编号/类别)。
看看github上的src,以及jsfiddle上的演示示例:
$('#container1').highcharts({
data: {
csv: document.getElementById('csv1').innerHTML
},
title: {
text: 'Categorized CSV data'
}
});
- Telerik rad组合框多列数据绑定
- 带组的两列html表
- 对象数组-与其他列数据相比,增加一列
- 如何外部联接两个数据集(基于多个主键)
- 单个交叉筛选器维度和两列上的组
- 使用 php 将类别和子类别显示为两列
- 如何刷新数据表列数据
- 将网格视图的两列相乘,并将其显示在新列中
- Angular ng sortable-如果我在一个栏中添加了一个搜索框,则拖放在两列之间无法正常工作
- 我创建了一个下拉列表,以及如何显示所选项目的其他列数据
- 将列表拆分为两列.列表没有't具有块,但是需要在最接近的<p>标签
- 在两列中动态显示产品
- 两列全高布局展开以包含内容
- PHP生成的表列数据不在正确的位置
- 计算文本块中的字符数,并将其拆分为两列
- 如何使用AngularJS而不是在查询子句中根据两列的差异对表进行排序
- 基于两列之间的计算对jquery数据表进行排序
- 什么'这是比较Google Sheets中两列数据并使用Google脚本仅输出不匹配数据的最佳方法
- 使用数据表按两列排序(不能读取property ' style '未定义)
- 如何从CSV创建行Hightchart,其中两列数据用作工具提示文本