如何画Flot柱形图

柱形图常被用来比较各组数据的相互关系, 直条的高度越高, 所代表的值越大. 除了柱形图之外, 还有条形图, 柱形图和条形图的做法一样, 差别只在一个属性值"horizontal", 如果设为true, 就会以条形图呈现, 另外x轴与y轴的数据需要互相对调位置.

本章会提供柱形图以及条形图的范例. 制作柱形图的做法和制作折线图做法大同小异, 只要你有看过上一章折线图的做法, 相信在这一章也能轻易上手.

柱形图范例

柱形图做法

在这个范例里, 我们用的是2012世界城市的年平均温度做为绘图数据, 为了让范例简单一点, 我们只抓了6个城市的数据.

一开始的做法和折线图一样, 先插入定位点到页面中, 并指定其id以及长度和宽度
   
        <div id="flot-placeholder" style="width:400px;height:300px"></div>
        
接下来就是准备数据, 柱形图的数据和折线图的数据不太一样, 因为柱形图通常是用来比较各组数据的关系, 所以在这里我们加入6个数组数据, 分别代表6个城市的年均温, 因为这范例没有用到时间数据格式, 我们将x轴用序号编码, y轴数据则是年平均温度.  最后再把数组数据加到dataset变量里, 并指定标签(label)为"2012 Average Temperature", 另外我们用color属性指定了柱形图的颜色为#5482FF, 若你有多个资料组时, 将各数据组用不同的颜色来区分, 有助于用户在看图表时的便利性.
   
        var data = [    
            [0, 11], //London, UK
            [1, 15], //New York, USA
            [2, 25], //New Delhi, India
            [3, 24], //Taipei, Taiwan
            [4, 13], //Beijing, China
            [5, 18]  //Sydney, AU
        ];

        var dataset = [
            { label: "2012 Average Temperature", data: data, color: "#5482FF" }
        ];
        
因为此范例不是用时间数据格式做为x轴的数据, 如果没有指定x轴的刻度资料, x轴就只会显示0, 1, 2, ....所以我们要自行建立x轴的刻度数据, 建立方式和数据源一样是用数组, 你也可以直接复制data变量来修改. x轴一样是从0开始的序号, 而y轴就是要显示的刻度数据, 这里我们填上各城市的名称.

刻度数据完成后就可以指定到options里的xaxis.ticks里去, x轴就会显示你所设定的城市名称. y轴也可以自定义刻度数据, 如果是用在y轴上, 就指定到yaxis.ticks去即可.
   
        var ticks = [
            [0, "London"], [1, "New York"], [2, "New Delhi"], [3, "Taipei"], [4, "Beijing"], [5, "Sydney"]
        ];

        xaxis: {           
          ticks: ticks
        }
        
画条图时需要将options里的series.bars.show设为true, 条图才会出现, 若没有设定, 预设会出现折线图. 另外bars.align控制柱形图对齐的方向, 可设定的值有"left", "right"和"center". 另外我们还可以设定bars.barWidth控制条图的宽度, barWidth是指x轴或y轴的单位宽度, 而不是像素, 在这里我们设定为0.5.
             series: {
                bars: {
                    show: true
                }
            },
            bars: {
                align: "center",
                barWidth: 0.5
            }
        
我们刚刚解释了自定义刻度的方法,但如果你想在原有的刻度加上单位如°C或是金钱单位如$要如何办到,Flot提供了一个函式tickFormatter, 这函式传入了2个参数, tick value和axis object, 并且会传回字符串, 所以我们在这范例里要将y轴的刻度都加上°C的单位写法如下
   
        yaxis: {                
            tickFormatter: function (v, axis) {
                return v + "°C";
            }
        }        
        
此范例里也用了轴标签的外挂, 由于上一章已经介绍过了, 在这里就不赘述, 有兴趣的可以回到上一章如何画Flot折线图查看.
   
        xaxis: {
            axisLabel: "World Cities",
            axisLabelUseCanvas: true,
            axisLabelFontSizePixels: 12,
            axisLabelFontFamily: 'Verdana, Arial',
            axisLabelPadding: 10
        }

        yaxis: {
            axisLabel: "Average Temperature",
            axisLabelUseCanvas: true,
            axisLabelFontSizePixels: 12,
            axisLabelFontFamily: 'Verdana, Arial',
            axisLabelPadding: 3
        }
        
最后一样呼叫$.plot函式, 并且指定定位点, 带入dataset和options参数后绘图即完成. 下一章我们将会介绍条形图的做法, 柱形图和条形图做法大同小异, 差别在建立数据时需要把x轴及y轴相互对调, 细节我们会再详细说明.
   
        $(document).ready(function () {
            $.plot($("#flot-placeholder"), dataset, options);    
        });
        

本范例完整程序代码

   
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="/js/lib/jquery-1.8.3.min.js" type='text/javascript'></script>  
    <!--[if lte IE 8]><script language="javascript" type="text/javascript" src="/js/flot/excanvas.min.js"></script><![endif]-->
    
    <script type="text/javascript" src="/js/flot/jquery.flot.min.js"></script>    
    <script type="text/javascript" src="/js/flot/jquery.flot.symbol.js"></script>
    <script type="text/javascript" src="/js/flot/jquery.flot.axislabels.js"></script>
    
    <script type="text/javascript">
        //******* 2012 Average Temperature - BAR CHART
        var data = [[0, 11],[1, 15],[2, 25],[3, 24],[4, 13],[5, 18]];
        var dataset = [{ label: "2012 Average Temperature", data: data, color: "#5482FF" }];
        var ticks = [[0, "London"], [1, "New York"], [2, "New Delhi"], [3, "Taipei"],[4, "Beijing"], [5, "Sydney"]];

        var options = {
            series: {
                bars: {
                    show: true
                }
            },
            bars: {
                align: "center",
                barWidth: 0.5
            },
            xaxis: {
                axisLabel: "World Cities",
                axisLabelUseCanvas: true,
                axisLabelFontSizePixels: 12,
                axisLabelFontFamily: 'Verdana, Arial',
                axisLabelPadding: 10,
                ticks: ticks
            },
            yaxis: {
                axisLabel: "Average Temperature",
                axisLabelUseCanvas: true,
                axisLabelFontSizePixels: 12,
                axisLabelFontFamily: 'Verdana, Arial',
                axisLabelPadding: 3,
                tickFormatter: function (v, axis) {
                    return v + "°C";
                }
            },
            legend: {
                noColumns: 0,
                labelBoxBorderColor: "#000000",
                position: "nw"
            },
            grid: {
                hoverable: true,
                borderWidth: 2,
                backgroundColor: { colors: ["#ffffff", "#EDF5FF"] }
            }
        };

        $(document).ready(function () {
            $.plot($("#flot-placeholder"), dataset, options);
            $("#flot-placeholder").UseTooltip();
        });

        function gd(year, month, day) {
            return new Date(year, month, day).getTime();
        }

        var previousPoint = null, previousLabel = null;

        $.fn.UseTooltip = function () {
            $(this).bind("plothover", function (event, pos, item) {
                if (item) {
                    if ((previousLabel != item.series.label) || (previousPoint != item.dataIndex)) {
                        previousPoint = item.dataIndex;
                        previousLabel = item.series.label;
                        $("#tooltip").remove();

                        var x = item.datapoint[0];
                        var y = item.datapoint[1];

                        var color = item.series.color;

                        //console.log(item.series.xaxis.ticks[x].label);                

                        showTooltip(item.pageX,
                        item.pageY,
                        color,
                        "<strong>" + item.series.label + "</strong><br>" + item.series.xaxis.ticks[x].label + " : <strong>" + y + "</strong> °C");
                    }
                } else {
                    $("#tooltip").remove();
                    previousPoint = null;
                }
            });
        };

        function showTooltip(x, y, color, contents) {
            $('<div id="tooltip">' + contents + '</div>').css({
                position: 'absolute',
                display: 'none',
                top: y - 40,
                left: x - 120,
                border: '2px solid ' + color,
                padding: '3px',
                'font-size': '9px',
                'border-radius': '5px',
                'background-color': '#fff',
                'font-family': 'Verdana, Arial, Helvetica, Tahoma, sans-serif',
                opacity: 0.9
            }).appendTo("body").fadeIn(200);
        }
    </script>
</head>
<body>
    <div style="width:450px;height:300px;text-align:center;margin:10px">        
        <div id="flot-placeholder" style="width:100%;height:100%;"></div>        
    </div>
</body>
</html>
        


练习

本章的完整范例程序代码可以在这里找到并做在线练习 Go to Example Tester