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

2.3 图表中的数据使用

在实际应用中,图表涉及的数据有很多种。根据常见的数据类型,图表常见的数据包括数值类型、时间日期类型和字符串类型。本节详细讲解这3种数据的使用方式。

2.3.1 数值类型数据

在Highcharts中,数值类型数据是使用最多的,也是使用方式最简单的。用户只要正确赋值,就可以直接使用。对于一些特殊的数据,还需要额外的处理。

1.比较大的数据

对于比较大的数值,Highcharts显示的时候会有一些特殊的处理。

【实例2-4:bignumber】下面是一个展现大数值的图表。核心代码如下:

var options = {
    chart: {
        type: 'line'
    },
    title: {
        text: '大数值图表'
    },
    subtitle: {
        text: '临时数据'
    },
    series: [{
        data: [50, 2000, 2790, 3900, 1000, 4000, 5000, 2000, 1598, 2460],
        pointStart: 1,
        pointInterval:1
    }],
    credits: {
        text: '大学霸',
        href: 'http://daxueba.net'
    }
};

执行代码后,效果如图2.4所示。从图中可以看到,y轴上的刻度均以k为单位来显示。并且,提示框中显示的y值也以每3位间隔显示。

图2.4 大数值图表

这两种显示都是国外常见的一种数值显示方式。但是这种使用方式,在国内并不普及。如果要取消这两种显示,需要修改Highcharts的全局配置。修改全局配置需要使用类Highcharts的setOptions()方法。语法如下:

Highcharts.setOptions({
    //相关配置项
})

其中相关配置项包括两个顶级配置项global和lang。这里,需要使用顶级配置项global中的配置项numericsSymbols和thousandsSep。下面依次介绍这两个配置项的使用。

(1)配置项numericsSymbols用来设置数值单位,如千和兆之类。其语法如下:

numericSymbols: Array<String>

其中,参数Array<String>表示数值单位,默认值为[ "k","M","G","T","P","E"]。如果用户想要禁用该功能,只需要将该配置项设置为null即可。

(2)配置项thousandsSep用于设置千位分隔符,也就是说小数点左侧每3位使用特殊符号做分割。其语法如下:

thousandsSep: String

其中,参数String指定分隔所使用的符号,默认为空格。

【实例2-5:bignumberedit】下面重新设置大数值的显示形式。核心代码如下:

var options = {
 };
Highcharts.setOptions({
    lang: {
        numericSymbols: null,                               //设置数值单位
        thousandsSep:''                                     //设置千分位分隔符
    }
});

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

图2.5 调整的大数值显示

2.小数数据

由于计算机无法精确表示数据,往往会造成小数的位数过多,而影响图表显示。这个时候,可以用类似C语言打印函数的格式修饰符,对数据输出格式进行限制。该格式修饰符用于各个数据的格式化配置项中,如数据标签的配置项format中。

【实例2-6:datafloat】下面指定图表数据显示的小数位数。核心代码如下:

series: [{
    type: 'spline',
    data: [[12, 34], [23, 89.99], [30, 67], [45, 23], [62, 79]],
    dataLabels: {
        enabled:true,
        format:'{point.y:3.1f}'
    }
}]

运行代码,效果如图2.6所示。在代码中,3.1f表示整个数据总长为3位,小数位数为一位。第二个节点数据总共4位,小数点后两位,按照格式会被四舍五入,所以显示为90.0。

图2.6 小数位数显示

2.3.2 时间日期类型数据

时间日期数据也是图表中常用的数据类型。由于这类数据涉及实际生活,所以其输入和显示受到更多限制。下面详细讲解时间日期数据的使用方式。

1.数据赋值

在Highcharts中,要正确处理时间日期数据,最好将时间转化为时间戳格式。时间戳是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。实际上,时间日期数据是以整型来处理的。

手动转化时间戳比较麻烦,通常都是使用Javascript函数Date.UTC()转化。其语法格式如下:

Date.UTC(year,month,day,hours,minutes,seconds,ms)

其中,参数year指定4位数字形式的年份;参数month指定月份,范围为0~11;参数day指定日期的整数,范围为1~31;参数hours指定小时的整数,范围为0~23;参数minutes指定分钟的整数,范围为0~59;参数seconds指定秒的整数,范围为0~59;参数ms指定毫秒数,范围为0~999。参数year、month和day是必需的,其他参数是可选的。

注意:参数月份month值的范围为0~11。其中,0表示1月;1表示2月,以此类推。

2.时间日期时区化

由于地域不同,用户的时间日期数据都具有时区性。当Highcharts无法正确显示时间时,需要设置对应的时区。这时需要使用包含在global中的配置项。

(1)使用配置项useUTC,启用UTC功能。其语法如下:

useUTC: Boolean

该配置项的值为布尔类型。当值为true时,启用该功能;否则,禁用该功能。默认值为true。

(2)使用配置项timezoneOffset,设置由时区不同引起的时间差值。其语法如下:

timezoneOffset: Number

其中,参数Number指定以分钟为单位的时间差值。例如,我国作为东八区,其时间间隔为60*-8。

3.时间日期本地化

Highcharts默认使用英文,所以显示的月和星期都是英文单词。Highcharts的配置项lang包含3个子配置项用来设置这些英文单词。下面依次讲解。

(1)使用配置项months设置每个月的名称。其语法如下:

months: Array<String>

其中,参数Array<String>用于存储每个月的名称。默认值如下:

[ "January" , "February" , "March" , "April" , "May" , "June" , "July" , 
"August" , "September" , "October" , "November" , "December"]

对于国内用户,只需要将其设置为如下值即可:

months:['一月','二月','三月','四月','五月','六月','七月','八月','九月','十月', 
'十一月','十二月']

(2)当显示空间有限时,Highcharts则会使用月份的简写代替完整写法。月份简写形式需要使用配置项shortMonths指定。其语法如下:

shortMonths: Array<String>

其中,参数Array<String>包含一年12个月的名称简写形式。默认值如下:

[ "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" , 
"Oct" , "Nov" , "Dec"]

对于国内用户,需要将其设置为和months一样的值。代码如下:

shortMonths:['一月','二月','三月','四月','五月','六月','七月','八月','九月', 
'十月','十一月','十二月']

(3)Highcharts有时会按照英文星期显示日期。这个时候,需要使用配置项weekdays修改每个星期的名称。其语法如下:

weekdays: Array<String>

其中,参数Array<String>用于保存每个星期7天的名称。默认值如下:

["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", 
"Saturday"]

对于国内用户,需要设置为以下值:

weekdays:['星期日','星期一','星期二','星期三','星期四','星期五','星期六']

4.显示格式

虽然用户使用的是时间戳形式赋值,但显示的时候Highcharts会自动转化成正常的时间日期格式。常见的日期格式有很多种,如年/月/日、日/月/年、月/日/年等。在国内大家使用最多的形式是年/月/日。由于Highcharts的自动转化形式往往不是我们所需要的,所以需要用户在显示的时候进行格式指定。

在Highcharts中,时间通常会显示在提示框和坐标轴上。这两个顶级配置项都提供相同的配置项dateTimeLabelFormats。其语法如下:

dateTimeLabelFormats: Object

其中,参数Object用来指定各种精度下时间显示的格式。默认值如下:

{
    millisecond:"%A, %b %e, %H:%M:%S.%L",
    second:"%A, %b %e, %H:%M:%S",
    minute:"%A, %b %e, %H:%M",
    hour:"%A, %b %e, %H:%M",
    day:"%A, %b %e, %Y",
    week:"Week from %A, %b %e, %Y",
    month:"%B %Y",
    year:"%Y"
}

其中,%Y、%B之类的标志用来表示各种时间的写法,详细说明如表2.2所示。

表2.2 常见格式字符串

【实例2-7:datedata】下面构建一个x值为时间日期类型数据的图表。其核心代码如下:

Highcharts.setOptions({
    global: {                                                   //设置时区信息
        useUTC: true,
        timezoneOffset:60*-8
    },
    lang: {                                                     //设置日期本地化格式
        months:['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月',
        '九月', '十月', '十一月', '十二月'],
        shortMonths: ['一月', '二月', '三月', '四月', '五月', '六月', '七月',
        '八月', '九月', '十月', '十一月', '十二月'],
        weekdays: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五',
        '星期六']
    }
});
var options = {
    chart: {
        type: 'line'
    },
    title: {
        text: '时间日期数据'
    },
    subtitle: {
        text: '临时数据'
    },
    series: [{
        data: [
            [Date.UTC(2015, 5, 1), 54],
            [Date.UTC(2015, 5, 7), 136],
            [Date.UTC(2015, 5, 12), 189],
            [Date.UTC(2015, 5, 20), 62],
            [Date.UTC(2015, 5, 23), 43],
            [Date.UTC(2015,5,29),143]
        ],
    }],
    xAxis: [{
        type: 'datetime',
        dateTimeLabelFormats: {
            week: '%Y-%m-%e'                                //设置显示的时间格式
        },
    }],

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

图2.7 时间日期数据图表

5.简化形式

如果对应的图表元素没有专有的配置项dateTimeLableFormat,用户也可以通过配置项format进行设置。参考形式如下:

format:'{value:String}'

其中,value表示原有的值;String表示格式字符串,可以是表2.2中的组合形式。

2.3.3 字符串数据

字符串数据也是图表中一种常用的数据类型。在图表中,字符串类型数据可能出现在x值、y值,或者其他辅助性信息中。当字符串数据作为x值或者y值时,需要用户特别注意。下面依次讲解这两种情况。

1.字符串数据作为x值

从严格意义来说,HIghcharts是不允许字符串作为x值的。在实际使用中,会把x值作为节点的名称name来使用。通过name值来生成x轴的坐标值。这时构建的x轴类型为分类类型。用户需要指定x轴的类型。代码如下:

xAxis:[{
    type:'category'
}]

指定后,Highcharts就会读取数据节点中的name值,作为x轴坐标刻度。

【实例2-8:strdata】下面使用字符串数据构建一个图表。核心代码如下:

series: [{
    data: [                                             //指定节点数据
        ['第一次', 92],
        ['第二次', 85],
        ['第三次', 89],
        ['第四次', 97],
        ['第五次', 91]
    ],
    keys:['name','y']                                       //指定数据节点格式
}],
xAxis: [{
    type: 'category',                               //设置分类类型
}],

执行代码后,效果如图2.8所示。从图表中可以看出,Highcharts自动将每个节点的第一个值作为x轴刻度进行显示。

图2.8 字符串构建的图表

这时,x轴的实际刻度数值为0、1、2、3、4。“第一次”的实际数值为0,“第二次”的实际数值为1,以此类推。如果数据节点中出现相同的name,Highcharts并不会认为是相同的,会按照不同的刻度来处理。

【实例2-9:strdata1】构建一个具有相同节点名称的图表。核心代码如下:

series: [{
    data: [
        ['第一次', 92],                                //相同节点名称
        ['第二次', 85],
        ['第三次', 89],
        ['第四次', 97],
        ['第五次', 91],
        ['第一次',93]                          //相同节点名称
    ],
    keys:['name','y']
}],
xAxis: [{
    type: 'category',
}],

执行代码,效果如图2.9所示。从图中可以看到,“第一次”刻度在x轴出现了两次。在很多图表中,这样的数据节点是无法避免的。这个时候,就需要将节点名称和节点数据进行分离,这就是下面要讲解的内容。

图2.9 具有相同节点名称

2.简化节点赋值

当图表中存在多个数据列,并且每个数据列的节点的x值都是相同的,也可以在x轴的设置中直接指定由name构成的刻度。其代码如下:

xAxis:[{
    type:'category',
    categories:['第一次','第二次','第三次','第四次','第五次']
}]

这样做的结果就是将节点中的name和y值进行分离。

【实例2-10:strdatasimple】下面简化实例2-6的节点数据,重新构成图表。核心代码如下:

series: [{
    data: [92, 85, 89, 97, 91]                                  //简化的节点数据
}],
xAxis: [{
    type: 'category',
    categories:['第一次','第二次','第三次','第四次','第五次']//指定x轴刻度
}],

执行代码后,运行效果如图2.8所示。对于实例2-7的问题,这个时候也可以解决了。解决方法就是为节点指定Highcharts允许的x值。

【实例2-11:strdata2】下面解决实例3-7的问题。核心代码如下:

series: [{
    data: [92, 85, 89, 97, 91,[0,93]]               //指定最后一个节点的x值
}],
xAxis: [{
    type: 'category',
    categories:['第一次','第二次','第三次','第四次','第五次']
}]

执行代码后,效果如图2.10所示。从图中可以看到,“第一次”刻度上有两个节点了。虽然在折线图中很少遇到这种情况,但是在其他图表类型中经常会遇到这类问题。

图2.10 重复节点名称的解决

3.字符串作为y值

由于Highcharts不支持字符串作为y值,也不能将节点名称name解析到y轴上,所以只能采用实例2-9的方式进行转化。

【实例2-12:strdatay】将某同学的成绩表生成图表,其成绩如表2.3所示。其中x值是考试次数,成绩作为y值。

表2.3 某同学考试成绩

核心代码如下:

series: [{
    data: [2, 1, 3, 2,3]                                //将字符串转化为刻度值
}],
yAxis: [{
    type: 'category',
    categories:['不及格','及格','良好','优秀']           //指定刻度
}],
xAxis: [{
    type: 'category',
    categories:['第一次','第二次','第三次','第四次','第五次']
}],

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

图2.11 y值是字符串