如何从CSV创建行Hightchart,其中两列数据用作工具提示文本

How to create line Hightchart from CSV where two columns of data are used as tooltip text?

本文关键字:两列 数据 文本 工具提示 CSV 创建 Hightchart      更新时间:2023-09-26

这是一个由多部分组成的问题,请原谅问题的长度。

我正试图创建一个图表,将患者的身高、体重和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下的日期值。

系列/线路应如下:

  1. 高度
  2. 重量
  3. 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'
    }
});