图表插件Highcharts的动态化赋值,实现图表数据的动态化设置显示

在很早之前就介绍过图表插件Highcharts的使用了,在2014年的随笔《基于MVC4+EasyUI的Web开发框架经验总结(4)--使用图表控件Highcharts》,这里基本上都介绍的比较完整,基本的设置也没有太大的差异,本篇介绍的是基于Bootstrap开发框架的界面处理,以及对图表插件Highcharts的其他模块,如柱状图,线图等其他样式的信息进行动态设置,以期达到利用数据库的数据,方便动态设置显示出来。

1、Bootstrap框架图标的展示

饼图的数据展示界面效果如下所示

image

柱状图以及其他曲线图展示效果如下所示。

image

使用这些图表功能强,我们一般需要在页面里面引入对应的JS+CSS

image

2、使用脚本动态设置图表的数据

默认的案例,这些数据都是直接绑定在里面的,有时候我们需要动态设置,那么需要分析好对应的数据属性,以及设置的API,才能正常进行显示。

以饼图为例,我们需要分析它的数据结构,一般是Series里面的Data数据格式,不同的图表样式需要的数据结构不太一样,对于图表而已,它的数据格式如下所示。


image

另外也可以使用key、Value方式的定义格式,如下数据所示。

image

那么,有了这些了解,我们就可以通过Ajax方式,动态从数据库里面获取数据,并绑定在界面上显示即可。

首先我们定义好界面上的一个图表展示控件DIV层,如下代码所示。

<div class="tab-char" id="container1" style="height: 300px;max-width:500px"></div>

然后通过JS动态创建对应的图表对象,并设置图表的数据即可。

       var chart1 = new Highcharts.Chart({
            chart: {
                renderTo: "container1",
                plotBackgroundColor: null,
                plotBorderWidth: null,
                plotShadow: false,
            },
            title: {
                text: '集团分子公司人员组成'
            },
            tooltip: {
                pointFormat: '{series.name}: <b>{point.y}</b>'
            },
            plotOptions: {
                pie: {
                    allowPointSelect: true,
                    cursor: 'pointer',
                    dataLabels: {
                        enabled: true,
                        format: '<b>{point.name}</b>: {point.percentage:.1f} %',
                        style: {
                            color: (Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black'
                        }
                    },
                    //showInLegend: true
                }
            },
            series: [{
                type: 'pie',
                name: '人员数量',
                data: []
            }]
        });

动态构建数据是通过Ajax方式实现的,如下所示。

        //通过Ajax获取图表1数据
        $.ajaxSettings.async = false;
        var data1 = [];
        $.getJSON("/User/GetCompanyUserCountJson", function (dict) {                
            for (var key in dict) {
                if (dict.hasOwnProperty(key)) {
                    data1.push([key, dict[key]]);
                }
            };
            chart1.series[0].setData(data1);
        });

这里值得注意的是,我们获取一个图表对象,是通过下面代码方式获取才行

 var chart1 = new Highcharts.Chart({

这种方式可以获得对应的chart1对象,并进行设置图表属性或者调用API接口。

又如对于传入一个数组对象的图表

image

它的动态设置数据的代码如下所示。

        var chart4 = new Highcharts.Chart({
            chart: {
                renderTo: 'container4',
                type: 'column',
                margin: 75,
                options3d: {
                    enabled: true,
                    alpha: 15,
                    beta: 15,
                    depth: 50,
                    viewDistance: 25
                }
            },
            title: {
                text: 'Chart rotation demo'
            },
            subtitle: {
                text: 'Test options by dragging the sliders below'
            },
            plotOptions: {
                column: {
                    depth: 25
                }
            },
            series: [
                { 
                    data: null//[29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
                }
            ]
        });

        //模拟动态设置,chartData数据可以通过Ajax动态获取
        var chartData = [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4];
        chart4.series[0].setData(chartData);

如果对于柱状图的数据,我们又是需要分析它的数据结构,然后进行相应的数据的

image

柱状图的数据格式大概如下所示。

image

完整的柱状图JS对象处理代码如下所示。

        //柱状图的展示
        var linechart1 = new Highcharts.Chart({
            chart: {
                renderTo: 'lineContainer1',
                type: 'column',
            },
            title: {
                text: '销售出货日报表'
            },
            xAxis: {
                categories: []//['Apples', 'Oranges', 'Pears', 'Grapes', 'Bananas']
            },
            yAxis: {
                allowDecimals: false,
                min: 0,
                title: {
                    text: '销售金额'
                }
            },
            tooltip: {
                formatter: function () {
                    return '<b>' + this.x + '</b><br/>' +
                        this.series.name + ': ' + this.y + '<br/>' +
                        'Total: ' + this.point.stackTotal;
                }
            },
            plotOptions: {
                column: {
                    stacking: 'normal'
                }
            },
            series: [
            //{
            //    name: 'John',
            //    data: [5, 3, 4, 7, 2],
            //    stack: 'male'
            //}, {
            //    name: 'Joe',
            //    data: [3, 4, 4, 2, 5],
            //    stack: 'male'
            //}, {
            //    name: 'Jane',
            //    data: [2, 5, 6, 2, 1],
            //    stack: 'female'
            //}, {
            //    name: 'Janet',
            //    data: [3, 0, 4, 4, 3],
            //    stack: 'female'
            //}
            ]
        });

我们上面注释掉的 categories 和 series 数据,就是为了让我们方便通过JS脚本动态添加进去,实现图标数据的动态化设置的。

例如对于销售出货数据的统计,我们模拟的部分数据来进行展示。

        //设置数据,这里可以通过JSON获取
        var category = ['2018-7-1', '2018-7-2', '2018-7-3', '2018-7-4', '2018-7-5'];
        var seriesData = [{
            name: 'AB',
            data: [500, 300, 400, 700, 200]
        }, {
            name: 'BC',
            data: [300, 400, 400, 200, 500]
        }, {
            name: 'CD',
            data: [200, 500, 600, 200, 100]
        }, {
            name: 'EF',
            data: [300, 0, 400, 400, 300]
        }];
        //先移除选来的series对象,然后加入
        while (linechart1.series.length > 0) {
            linechart1.series[0].remove(true);
        }
        for (var i = 0; i < seriesData.length; i++) {
            //加入categories
            linechart1.xAxis[0].setCategories(category);
            //加入series
            linechart1.addSeries(seriesData[i]);
        }

通过这样的处理,我们的数据就可以实现动态的显示了。

image

其他的图表也是通过类似的方式,通过获取到对应的图表对象,然后动态构建数据,并将数据设置到对应的图表属性上即可。

这样处理方式的差异,我们也可以参考下官网提供的一些属性或者接口的定义来进行处理,本篇案例也是综合了很多其他例子的说明进行测试,并获得正常的数据展示效果。

本篇主要介绍Highcharts插件的动态设置属性的处理,对于其他图表插件,如EChart等也是一个很好的参考,比较图表的数据格式都是很接近的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容