0

这是一个多部分的问题,所以请原谅问题的长度。

我正在尝试创建一个图表,将患者的身高、体重和 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 和 PATIENT_NAME 识别患者,无论您将鼠标悬停在哪个数据点上。我知道我可以将其显示在 DIV 或页面上的其他内容中,但我希望能够做到这一点,因为如果我能弄清楚如何使其工作,我可以在工具提示中显示其他内容.

通过查看 Highcharts 站点,我相信实现 CSV 代码所需要做的就是在上面的代码中添加以下代码而不是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. 体重指数

绘图点的数据位于标题行之后的列索引 4 (AVG_HEIGHT) 到 6 (BMI) 中。

这是我要工作的一个示例小提琴,它与我想做的类似......我只是无法让它适用于我的特定数据。

我将暂时搁置问题的工具提示和 CSV 部分。我真的很想让我的东西工作,所以我知道我在正确的轨道上。

4

1 回答 1

0

这不是一个完整的答案,而是一个提示:Highcharts 有一个插件 (modules/data.src.js) 可以处理 csv 数据的解析,这应该可以帮助您入门。它会自动使用列名作为系列名称,并且还会尝试猜测列的类型(日期时间/数字/类别)。

查看github上的 src和jsfiddle上的演示示例:

$('#container1').highcharts({
    data: {
        csv: document.getElementById('csv1').innerHTML
    },
    title: {
        text: 'Categorized CSV data'
    }
});
于 2013-02-12T11:30:39.847 回答