`

Jquery flot multi bars 多个柱状图并列显示问题

 
阅读更多

最近在用jquery的flot画图,折线图饼图都没啥问题,一到柱状图就来事了,如果多个数据源,柱子都重叠到一起了,像这样:



 

度娘谷哥搜了一大圈,找了一个插件,专门处理这种情况的,但是郁闷的调了半天愣是没反应,该什么样还什么样,眼看工期将至,一咬牙,看源码吧。原来这个插件是在动态调整每个bar的barLeft属性,见代码红色处(jquery.flot.multibar.js):

(function ($) {
    function init(plot) {
        var multiple = true;
        var sArray = [];
        var totWidth = 0;
        
        function procRawData(plot, series, data, datapoints) {
            if(series.bars.show) {
                sArray.push(series);
                
            }
        }
        
        function procDatapoints(plot, series, datapoints) {
            //Ensure we only process these once
            if(series.bars.show && series.bars.barLeft==undefined) {
                if(totWidth==0) {
                    for(var j = 0; j < sArray.length; j++) {
                        totWidth+=sArray[j].bars.barWidth;
                    }
                }
                var runWidth=0;
                for(var k = 0; k < sArray.length; k++) {
                    s=sArray[k];
                    if(s==series) {
                        break;
                    }
                    runWidth+=s.bars.barWidth;
                }
                series.bars.barLeft = runWidth-(totWidth/2);
            }
        }
        
        function checkMultipleBarsEnabled(plot, options) {
            if (options.multiplebars) {
                multiple = options.multiplebars;
                sArray=[];
                totWidth=0;

                plot.hooks.processRawData.push(procRawData);
                plot.hooks.processDatapoints.push(procDatapoints);
            }
        }
    
        plot.hooks.processOptions.push(checkMultipleBarsEnabled);
    }
    
    var options = { multiplebars: true };

    $.plot.plugins.push({
        init: init,
        options: options,
        name: "multiplebars",
        version: "0.1"
    });
})(jQuery); 

 

但是可恶的是,jquery.flot.js自己却重新给barLeft赋值了,见红色代码(jquery.flot.js):

function drawSeriesBars(series) {
            function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
                var points = datapoints.points, ps = datapoints.pointsize;

                for (var i = 0; i < points.length; i += ps) {
                    if (points[i] == null)
                        continue;
                    drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
                }
            }

            ctx.save();
            ctx.translate(plotOffset.left, plotOffset.top);

            // FIXME: figure out a way to add shadows (for instance along the right edge)
            ctx.lineWidth = series.bars.lineWidth;
            ctx.strokeStyle = series.color;

            var barLeft;
            
	            switch (series.bars.align) {
	                case "left":
	                    barLeft = 0;
	                    break;
	                case "right":
	                    barLeft = -series.bars.barWidth;
	                    break;
	                default:
	                    barLeft = -series.bars.barWidth / 2;
	            }
          
            var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
            plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
            ctx.restore();
        }

 所以,果断的加上判断,要用bars自己的barLeft:

function drawSeriesBars(series) {
            function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) {
                var points = datapoints.points, ps = datapoints.pointsize;

                for (var i = 0; i < points.length; i += ps) {
                    if (points[i] == null)
                        continue;
                    drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth);
                }
            }

            ctx.save();
            ctx.translate(plotOffset.left, plotOffset.top);

            // FIXME: figure out a way to add shadows (for instance along the right edge)
            ctx.lineWidth = series.bars.lineWidth;
            ctx.strokeStyle = series.color;

            var barLeft;
            if(series.bars.barLeft != undefined){
            	barLeft = series.bars.barLeft;
            }else{
	            switch (series.bars.align) {
	                case "left":
	                    barLeft = 0;
	                    break;
	                case "right":
	                    barLeft = -series.bars.barWidth;
	                    break;
	                default:
	                    barLeft = -series.bars.barWidth / 2;
	            }
          }

            var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null;
            plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis);
            ctx.restore();
        }

 

终于显示成如下样子了:



 

  • 大小: 8.7 KB
  • 大小: 12.2 KB
0
1
分享到:
评论
2 楼 zylucky 2016-02-24  
bars自己的barLeft怎么设置
1 楼 hoodlq 2015-11-23  
dataDetail.push({ lable: index + '月', data: [[index, table.rows[row].Value1]],bars: { show: true, align: "left" }, color: '#F1' + index },
{ lable: index + '月', data: [[index, table.rows[row].Value2]], bars: { show: true, align: "center" }, color: '#7B' + index },
{ lable: index + '月', data: [[index, table.rows[row].Value3]], bars: { show: true, align: "right" }, color: '#1C' + index });

相关推荐

    jquery flot 使用笔记

    jQuery Flot 是一个用于在网页上绘制高质量图形的开源库,它基于 jQuery,因此易于集成到任何使用 jQuery 的项目中。这个库提供了丰富的选项和插件,可以创建出各种各样的图表,包括折线图、柱状图、饼图等。在本文...

    jquery flot 实现实时折线图

    `jQuery Flot` 是一个基于 jQuery 的开源图表库,它允许开发者轻松地在网页上创建出各种复杂的图形,包括折线图、柱状图、饼图等。在本实例中,我们将关注如何使用 `jQuery Flot` 实现实时更新的折线图。实时更新的...

    JQuery Flot 统计图

    - **bars**:改进柱状图显示,支持水平柱状图。 - **stack**:实现堆叠图,方便对比各组数据的总和。 - **cursor**:添加鼠标光标,展示当前坐标值。 - **selection**:允许用户通过拖动选择图表区域,进行数据聚焦...

    jquery flot 时间曲线图

    首先,jQuery Flot是一款基于jQuery的开源图表库,它通过简单的API接口,让开发者可以轻松地在网页上绘制各种类型的图表,包括线图、饼图、柱状图等。对于时间序列数据,Flot特别擅长处理,因为它提供了对时间轴的...

    jQuery flot API文档 中文版

    jQuery flot API文档 中文版 以下是从给定的文件信息中生成的相关知识点: 1. jQuery flot API的plot函数调用方法: var plot = $.plot(placeholder, data, options) 其中,placeholder可以是JQuery对象、DOM...

    jquery绘图插件-flot

    Flot支持多种图表类型,包括线条图(lines)、折线图(points)、柱状图(bars)以及饼图(pie)。每种图表都有不同的配置选项,可以通过设置`series`参数来调整。 **3. 数据格式** Flot接受两种基本的数据格式:...

    jQuery flot 0.5jar包

    1. **多种图表类型**:Flot 支持绘制线图、面积图、柱状图、饼图等多种常见的图表类型,能够满足大部分数据展示的需求。 2. **实时更新**:由于 Flot 基于 JavaScript,它可以实现实时数据更新,这在监控系统、数据...

    jquery之绘图工具flot,统计图表的强大利器。

    Flot支持绘制多种类型的图表,包括折线图、柱状图、饼图、面积图、散点图等,涵盖了数据可视化的主要需求。此外,还可以通过组合不同的图表类型,实现更复杂的可视化效果。 ### 6. 扩展性和社区支持 Flot拥有活跃...

    JQuery Flot 画图插件 +实例源码 使用非常方便,效果非常漂亮

    - **Flot**:作为jQuery的一个插件,Flot专门用于生成各种类型的图表,如折线图、柱状图、饼图等,支持时间序列数据和实时更新的数据流。 2. **特性** - **高效性能**:Flot利用HTML5的canvas元素进行绘图,提供...

    jQueryflot图表插件

    1. **基本概念**:jQuery Flot是用纯JavaScript编写的,它可以生成线图、饼图、面积图、柱状图等多种图形。它支持实时数据更新,适合于动态展示数据变化的情况,如股票价格或者传感器读数。 2. **安装与引入**:...

    jquery.flot.js

    Flot类库基于jQuery,支持绘制实时和可进行交互的图表

    flot_基于jQuery的插件

    Flot提供了多种图表类型,包括折线图、柱状图、饼图以及面积图等,这些图表类型能够满足大部分数据可视化的基础需求。通过简单的配置选项,你可以定制图表的颜色、线条样式、标记点、轴的范围和刻度等,以达到理想的...

    Jquery Flot Pyramid Master

    **jQuery Flot Pyramid Master** 是一个基于 jQuery 的数据可视化库,专门用于创建金字塔图表。Flot 是一个流行的、开源的 JavaScript 图表库,它利用 HTML5 的 Canvas 元素来绘制图表,支持多种类型的图表,如线图...

    jquery flot画图

    jQuery Flot 是一个基于jQuery的开源图形库,它允许开发者用纯JavaScript在网页上绘制各种类型的图表,包括线图、条形图、饼图和堆栈图等。其优点在于简单易用的API和良好的浏览器兼容性。 ### 二、Flot 堆栈图绘制...

    jQuery_flot的相关文件.rar

    Flot社区提供了许多插件,如时间轴支持(`jquery.flot.time.js`)、图像数据(`jquery.flot.image.js`)和堆积图(`jquery.flot.stack.js`)。根据项目需求,可以引入并使用这些插件以扩展Flot的功能。 ### 8. **...

    flot一个基于jQuery有吸引力的JavaScript图表

    Flot允许开发人员在网页上以动态、交互式的方式展示各种类型的数据,包括折线图、柱状图、饼图等,从而帮助用户更好地理解和分析数据。 ### Flot的特点 1. **轻量级**:Flot库的大小相对较小,加载速度快,对网页...

    jquery.flot.axislabels.js

    jquery.flot.axislabels.js

    jquery 图表插件Flot

    3. **多样化图表类型**:Flot提供了多种图表类型,如折线图、柱状图、饼图、散点图等,满足了各种数据展示的需求。此外,还支持组合图表,可以在同一图表上混合显示不同类型的图。 4. **实时更新**:Flot支持动态...

    使用SignalR、jQueryFlot和ASP.NETMVC创建图表以显示实时实时数据_JavaScript_C#_下.zip

    接下来是jQuery Flot,这是一个轻量级的JavaScript库,用于创建各种类型的图表,如折线图、柱状图和饼图等。Flot具有良好的性能和灵活性,可以轻松定制图表样式和交互性。在我们的示例中,Flot将用于接收SignalR推送...

    漂亮的jQuery饼状图、柱状图、折线图

    折线图可以有多个数据系列,每个系列以不同颜色区分,支持添加网格线、数据点标记和时间轴,使得动态数据的演变一目了然。 在提供的压缩包中,`index.htm`很可能是示例代码的入口文件,它包含了HTML结构和引入的...

Global site tag (gtag.js) - Google Analytics