flot 图表功能

前段时间上级领导让我研究一下flot图表,因为网站以前的图表采用的是flash,很多都不支持,所以改用一个的图表控件,以下是本人花了一个礼拜才研究出来的一个图表功能js

可以实现鼠标在当前点的垂直方向上,高亮显示改点数据,如果是两条数据线,则选择较近的那条线的数据。


以下是JS代码

//均价图======================================================
function onDataReceived(date, size) {
    /*var data = [
                    { data: a, label: "珠海" },
                    { data: b, label: "吉大" }
		        ];*/
    var data = date;//date表示传来的参数格式如[{data:[1,2],label:'remark'}]
    var options = {
        canvas: true,
        colors: ["#E3563A", "#4572A7"], //每条线的颜色
        xaxes: [{ mode: "time", //X轴是以时间轴显示
            tickFormatter: function (value) {//格式化时间
                value = new Date(parseInt(value));
                value = "{0}月{1}日 ".format((value.getMonth() + 1), value.getDate());
                return value;
            },
            minTickSize: size=="small" ? [2, "month"] : null //如果为小图,则将X轴的刻度设为两个月
        }],
        yaxes: [{//Y轴的显示格式
            tickFormatter: function (value) {
                return fmoney(value) + "元";
            },
            autoscaleMargin: 0.35
        }],
        legend: { position: "nw", //图表的标题显示位置
            noColumns: 2, //标题显示多少列(保证在同一行显示)
            backgroundOpacity: 1.5//
        },
        series: {//图表线条的设置
            lines: {
                show: true//是否显示线
            },
            points: {
                show: false//是否显示点
            }
        },
        /*crosshair: {//显示鼠标跟随的那条线
        mode: "x"
        },*/
        grid: {//
            hoverable: true, //允许鼠标移动事件
            clickable: true, //允许点击事件
            borderWidth: { left: 2, right: 0.2, top: 0.2, bottom: 2 }, //边框的显示宽度
            mouseActiveRadius: 5//鼠标距离最近数据点的半径
        }
    };

    var plot = $.plot("#placeholder", data, options);//显示数据线
    $("#placeholder").bind("plothover", function (event, pos, item) {//鼠标移动事件
        latestPosition = pos; //鼠标的位置
        if (!updateLegendTimeout) {//执行鼠标移动后的方法规定
            updateLegendTimeout = setTimeout(function () { updateLegend(item); }, 50); //
        }
    });
    
    var updateLegendTimeout = null;
    var latestPosition = null;
    //鼠标移动方法
    function updateLegend(item) {
        updateLegendTimeout = null;
        var pos = latestPosition;//鼠标的位置
        var axes = plot.getAxes(); //数据线中的参数
        var i, j, dataset = plot.getData(); //定义数据线中的数据
        //鼠标的位置不出线型图的最大最小值范围
        if (pos.x < axes.xaxis.min || pos.x > axes.xaxis.max ||
            pos.y < axes.yaxis.min || pos.y > axes.yaxis.max) {
            $("[name=tooltip]").hide(); //
            for (i = 0; i < dataset.length; ++i) {
                var seriess = dataset[i]; //每条线中各个点的信息数据
                for (j = 0; j < dataset[i].data.length; ++j) {
                    plot.unhighlight(seriess, seriess.data[j]); //删除线上所有的点的高亮属性
                }
            }
            return;
        }
        $("[name=tooltip]").hide(); //当鼠标离开图表时,提示框消失
        var mytime = [];//每条线的X坐标
        var mymoney = [];//每条线的Y坐标
        var myseries = [];//每条线的其他属性信息
        var time = null;
        var money = null;
        var newseries=null;//用来定义显示框中的参数数据
        //循环出传来的数据
        for (i = 0; i < dataset.length; ++i) {
            var series = dataset[i]; //每条线中各个点的信息数据
            for (j = 0; j < series.data.length; ++j) {
                plot.unhighlight(series, series.data[j]); //删除线上所有的点的高亮属性
            }
            for (j = 0; j < series.data.length; ++j) {
                if (series.data[j][0] > pos.x) {
                    break;
                }
            }
            //取一条数据中,鼠标最近的两个点(有时候会是一个点)
            //p1表示第一个点,p2表示第二个点,如:p1[0]表示第一条数据线的第一个点的X坐标
            var p1 = series.data[j - 1], p2 = series.data[j];
            //判断鼠标附件是否有两个点,如果有两个点
            if (series.data[j] != null && series.data[j - 1] != null) {
                //如果鼠标所在X轴的位置距离与中介线
                //平分两个点,判断鼠标的位置在中介线的哪一侧,如果在右侧则取第二个点的数据
                if (pos.x > (p2[0] + p1[0]) / 2 ) 
                {
                    mytime[i] = p2[0];
                    mymoney[i] = p2[1];
                } else {//如果在左侧则取第一个点的数据
                    mytime[i] = p1[0];
                    mymoney[i] = p1[1];
                }
            }else if( series.data[j - 1] ==null) {//第一个点不存在
                mytime[i] = p2[0];
                mymoney[i] = p2[1];
             }
            else {//如果真有一个点,只取第一个点的数据
                mytime[i] = p1[0];
                mymoney[i] = p1[1];
            }
            myseries[i] = series;
            //mymoney[0]表示第一条线的Y轴数据值,mymoney[1]表示第二条线的Y轴数据值
            //如果鼠标的位置在这两个值得中介线的一方
            if (pos.y > (mymoney[0] + mymoney[1]) / 2 ) //
            {
                //哪个值大就选哪个值作为显示的点数
                money = (mymoney[0] - mymoney[1]) > 0 ? mymoney[0] : mymoney[1];
                time = (mymoney[0] - mymoney[1]) > 0 ? mytime[0] : mytime[1];
                newseries = (mymoney[0] - mymoney[1]) > 0 ? myseries[0] : myseries[1];
            } else {
                money = (mymoney[0] - mymoney[1]) > 0 ? mymoney[1] : mymoney[0];
                time = (mymoney[0] - mymoney[1]) > 0 ? mytime[1] : mytime[0];
                newseries = (mymoney[0] - mymoney[1]) > 0 ? myseries[1] : myseries[0];
            }
        }
        var dataPointCrood = plot.pointOffset({ x: time, y: money }); //将点所在的坐标格式化
        var placeholder = plot.getPlaceholder().offset(); //取出当前坐标的绝对位置
        var showPageX = dataPointCrood.left + placeholder.left; //提示信息在图表中位置X
        var showPageY = dataPointCrood.top + placeholder.top; //提示信息在图表中位置Y
        $("[name=tooltip]").hide(); //移动到下一个点时
        var lasttime = new Date(parseInt(time)); //获取X轴时间
        lasttime = "{0}年{1}月{2}日 ".format(lasttime.getFullYear(), (lasttime.getMonth() + 1), lasttime.getDate()); //转化时间
        showTooltip(showPageX, showPageY, lasttime + "<br/>" + newseries.label + fmoney(money) + "元/平方"); //显示提示框
        plot.highlight(newseries, [time, money]);//将点高亮显示
    }
    //显示当鼠标移上某个点时显示的内容
    //x:表示X轴坐标
    //y:表示Y轴坐标
    //contents:表示显示的内容
    function showTooltip(x, y, contents) {
        var $tooltip = $("#tooltip"); //
        if ($tooltip.length == 0) {//防止创建多次显示框,只更改里面的显示数据
            $tooltip = $("<div name='tooltip'></div>");
            $tooltip.css({
                position: "absolute",
                border: "1px black solid",
                padding: "2px",
                "background-color": "#fee",
                color: "#333"
            });
            $tooltip.appendTo("body");
        } 
        $tooltip.css({
            top: y + 3,
            left: x + 3
        });
        $tooltip.html(contents);
    };
};

//显示当鼠标移上某个点时显示的内容
//x:表示
//y:表示
//contents:表示显示的内容


//格式化金额数字
function fmoney(money) {
    var s = parseFloat((money + "").replace( /[^\d\.-]/g , "")) + "";
    var l = s.split(".")[0].split("").reverse(),
        t = "";
    for (var i = 0; i < l.length; i++) {
        t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : "");
    }
    return t.split("").reverse().join("");
}
//=============================================================




页面代码

<div class="simple-tab">房价走势图</div>
<h3 align="center">历史所有珠海老香洲房价走势图</h3>
<div class="demo-container">
    <div id="placeholder" style="width: 980px;height: 328px" class="demo-placeholder"></div>
</div>
//flot 图表操作
            $.jSyAjax.get({
                url: '@(Url.Action("GetmyAvgPriceJson", "XiaoQu", new { id = ViewBag.StringQuery }))',
                onComplete: function(series) {
                    series = $.parseJSON(series);
                    onDataReceived(series);
                }
            });
注:这段js原来从后台取数据用,方法是我们自己封装好的,不外传,调用后台的“GetmyAvgPriceJson”方法返回数据看,转换成json格式

附上flot官方API:flot官网API 介绍(纯英文)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小木木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值