Highcharts网页图表制作实例详解 (Web开发典藏大系)
上QQ阅读APP看书,第一时间看更新

2.2 Highcharts数据表示

在Highcharts中,将关联的一系列数据称为数据列,构成数据的每一个数据单元称为数据节点。下面详细讲解数据列和数据节点的表示方式。

2.2.1 数据列

数据列就是相关联的一系列数据的集合。例如,第一个实例所呈现的数据就是由7个温度数据构成的集合。它们的关联关系是构成连续的一周的温度。在Highcharts中,数据列使用series表示。一个图表中,可以有一个或者多个数据列。所以,series的值是一个数组。形式如下:

series:[{
    //第一个数据列的相关配置
},{
    //第二个数据列的相关配置
},
......
{
    //第n个数据列的相关配置
}]

每个数据列的设置都可以单独指定。这样,不同数据列设置就不会互相干扰。数据列相关配置中最重要的就是数据配置。它使用配置项data来定义。其形式如下:

data:Array

在data中可以定义数据节点。由于数据节点可以是一个,也可以是多个,所以data值同样是一个数组。

2.2.2 数据节点

数据节点是图表中最小的元素,每个数据节点都是一个数据单元,它确定了图表中一个图形元素的各种信息。一个数据节点通常包括以下3类信息。

1.坐标位置信息

由于Highcharts中大部分的图表都是平面2D类型的,所以每个节点都需要对应的坐标信息(x,y)。在Highcarts中,坐标信息是通过配置项x和y定义的。其语法形式如下:

x:Number|String
y:Number

其中,配置项x的值可以为数字,也可以是字符串;配置项y必须是数字。

2.其他必须信息

除了坐标信息外,很多图表需要节点提供额外的信息,如柱体的颜色和气泡的大小等。对于这些信息,也是在数据节点中定义的。例如对于柱形图的节点,需要使用配置项color指定该节点对应的柱体的颜色,语法如下:

color:Color

其中,参数Color指定该柱体填充的颜色。

3.用户补充信息

有时,用户想为节点信息做补充,就需要创建自己的配置项,并赋值。这些节点信息可以在提示框和数据标签中显示。例如,在本书第一个实例中,用户可以为每个节点添加配置项,存放最高温度发生的时间。形式如下:

hightemtime:Number|String|Object

其中,配置项名hightemtime是用户自己定义的,其值的类型也是用户自己指定的。

了解节点中包含的信息后,就可以将所有的信息进行定义为,其形式如下:

{
    x:Number|String,
    y:Number,
    color:Color,
    hightemtime:Number|String|Object
}

每个节点都是这样的一个对象。而整个数据列的节点就构成一个对象数组,形式如下:

data:[{
    x:Number|String,
    y:Number,
    color:Color,
    hightemtime:Number|String|Object
},{
    x:Number|String,
    y:Number,
    color:Color,
    hightemtime:Number|String|Object
},
......
{
    x:Number|String,
    y:Number,
    color:Color,
    hightemtime:Number|String|Object
}]

【实例2-1:carcount】下面制作一个公交车每站人数变化的图表。其原始数据如表2.1所示。

表2.1 公交车每站乘客数量数

图表需要展现每站人数的变化。所以,每一行数据是一个节点。其中,站次是节点的x值,人数是节点的y值,而时间是补充信息。所以,第一个节点定义方式如下:

{
    x:1,                                        //对应的x值
    y:5,                                        //对应的y值
    atime:'7:30'                                //对应的补充信息
}

按照这个方式,设置完整的配置项,代码如下:

var options = {
    chart: {
        type: 'line'
    },
    title: {
        text: '公交车每站乘客人数'
    },
    subtitle: {
        text: '临时数据'
    },
    series: [{
        data: [{                                                        //第一个节点
            x: 1,
            y: 5,
            atime:'7:30'
        }, {                                                            //第二个节点
            x: 2,
            y: 8,
            atime:'7:45'
        }, {                                                            //第三个节点
            x: 3,
            y: 16,
            atime:'8:00'
        }, {                                                            //第四个节点
            x: 4,
            y: 19,
            atime:'8:10'
        }, {                                                            //第五个节点
            x: 5,
            y: 26,
            atime:'8:24'
        }, {                                                            //第六个节点
            x: 6,
            y: 21,
            atime:'8:40'
        }, {                                                            //第七个节点
            x: 7,
            y: 18,
            atime:'8:50'
        }, {                                                            //第八个节点
            x: 8,
            y: 14,
            atime:'9:00'
        }, {                                                            //第九个节点
            x: 9,
            y: 8,
            atime:'9:15'
        }, {                                                            //第十个节点
            x: 10,
            y: 4,
            atime:'9:25'
        }],
    }],
    credits: {
        text: '大学霸',
        href: 'http://daxueba.net'
    }
};

执行代码后,效果如图2.1所示。代码中的atime可以用于标签和提示框的显示,这里暂时不做讲解。

图2.1 运行效果

2.2.3 简化为二维数组

采用对象数组的形式,可以明确节点上每个项目的值。但是当节点较多时,会造成大量的冗余代码。如果不写配置项名称,对象数组就可以简化二维数组。形式如下:

data:[
[Number|String , Number , Color , Number|String|Object],
[Number|String , Number , Color , Number|String|Object],
[Number|String , Number , Color , Number|String|Object],
......,
[Number|String , Number , Color , Number|String|Object],
]

这个时候,可以节省很多代码的书写量。但是由于不同的数据列可能包含的项目不同,所以需要让Highcharts能正确识别每个项目的顺序。这个时候,可以采用配置项keys来指定项目顺序。该配置项是series的一个子配置项。其语法如下:

keys:Array<String>

其中,参数Array<String>指定二维数组中每个值所对应的配置项名称。对于刚才的例子,就需要使用keys进行指定,形式如下:

keys:['x','y','color','hightemtime']

【实例2-2:carcountone】下面采用二维数组的形式对实例2-1进行简化。代码如下:

var options = {
    chart: {
        type: 'line'
    },
    title: {
        text: '公交车每站乘客人数'
    },
    subtitle: {
        text: '临时数据'
    },
    series: [{
        data: [
            [1, 5, '7:30'],                                             //第一个节点
            [2, 8, '7:45'],                                             //第二个节点
            [3,16,'8:00'],                                              //第三个节点
            [4,19,'8:10'],                                              //第四个节点
            [5,26,'8:24'],                                              //第五个节点
            [6,21,'8:40'],                                              //第六个节点
            [7,18,'8:50'],                                              //第七个节点
            [8,14,'9:00'],                                              //第八个节点
            [9,8,'9:15'],                                               //第九个节点
            [10,4,'9:25']                                               //第十个节点
        ],
        keys:['x','y','atime']                                      //设置节点配置
    }],
    credits: {
        text: '大学霸',
        href: 'http://daxueba.net'
    }
};

执行代码后,还是可以得到图2.1所示的效果。

2.2.4 简化为一维数组

对于一些简单图表类型,在某些情况下,数据还可以进一步简化。但是在简化的时候,必须同时满足以下两个条件:

图表只需要节点的坐标位置数据,就可以实现对应的图表。

各个节点的x轴坐标值是等差数列。

在满足以上条件后,数据就可以简化为一维数组形式,形式如下:

data:[Number, Number, Number,......, Number]

简化后,用户需要指定x轴坐标值的起始值和等差值。这时需要在配置项series中设置配置项pointStart和pointInterval。其语法如下:

poinStart:Number1
pointInterval:Number2

其中,参数Number1指定数据列的第一个节点x的值;参数Number2指定每个节点之间x值的差。

注意:如果数据列节点的x轴无法构成等差数据,则不能进行简化。

【实例2-3:carcounttwo】下面舍弃实例2-2中的atime数据,对图表进行进一步简化。代码如下:

var options = {
    chart: {
        type: 'line'
    },
    title: {
        text: '公交车每站乘客人数'
    },
    subtitle: {
        text: '临时数据'
    },
    series: [{
        data: [5,8,16,19,26,21,18,14,8,4],
    }],
    credits: {
        text: '大学霸',
        href: 'http://daxueba.net'
    }
};

执行代码后,效果如图2.2所示。从图中可以看到,节点对应的x值错了。这是由于没有指定第一个节点的起始x值,所以需要在顶级配置项series添加pointStart和pointInterval的设置。添加后的代码如下:

series: [{
    data: [5, 8, 16, 19, 26, 21, 18, 14, 8, 4],
    pointStart: 1,                                                      //设置起始值
    pointInterval:1
}],

图2.2 运行效果

再执行代码后,效果如图2.3所示。

图2.3 修正后的运行效果