【问题标题】:How to get a simple line for average on a bar chart in jqPlot如何在 jqPlot 中的条形图上获得一条简单的平均线
【发布时间】:2026-01-15 06:45:01
【问题描述】:

我正在使用 jqPlot 中的条形图,我需要在图表上用单独的线显示平均值。我的问题是如何做到这一点?我需要为此使用折线图吗?我看过几个折线图示例,但它们在条形图中显示为趋势,从图表上的第一个条形开始,而不是显示平均值。我需要的是使用显示的所有这些条形的平均值绘制一条线在图表上(截图如下)

我绘制数据的 JSON 字符串如下:

        var commonOption= {    
            title: '' 
            ,stackSeries: true    
            ,captureRightClick: true    
            ,seriesDefaults:{      
                renderer:$.jqplot.BarRenderer      
                ,rendererOptions: {          
                    barMargin: 15          
                    ,highlightMouseDown: true   
                    ,fillToZero: true               
                },      
                pointLabels: {
                    show: true
                    ,formatString: '%.1f'
                    ,seriesLabelIndex:1
                    ,hideZeros:false
                }
            }   
            ,seriesColors: ['#A9CB5E']
            ,axes: {      
                xaxis: {          
                    tickOptions:{angle:-45}
                    ,tickRenderer: $.jqplot.CanvasAxisTickRenderer
                    ,renderer: $.jqplot.CategoryAxisRenderer
                    ,ticks: []
                },      
                yaxis: {   
                    labelRenderer: $.jqplot.CanvasAxisLabelRenderer
                    ,padMin: 0
                    ,pad: 1.1
                    , label: 'Percentage (%)'
                    ,rendererOptions: { forceTickAt0: true}
                    //,min: 0
                    //,tickOptions:{formatString: '%.0f'},
                } 
            }    
            ,negativeSeriesColors:['#F08080']   
            /*,legend: {
                show: true 
                ,location: 'e'
                ,placement: 'outsideGrid'
            }*/
            ,highlighter:{
                show: true
                ,tooltipLocation: 's'
                ,yvalues: 2
                ,bringSeriesToFront:true
                ,showMarker:false
                ,tooltipAxes: 'y'
                ,formatString: "%n%s"
            }
            ,cursor:{
                show: true
                ,zoom:true
                ,showTooltip:false
                ,constrainZoomTo: 'y'
            }
            ,grid:{
                background: '#f8f8f8'
            }               
        };  

【问题讨论】:

    标签: jqplot average bar-chart


    【解决方案1】:

    我相信您正在寻找的是 jqplot CanvasOverlay 功能http://www.jqplot.com/deploy/dist/examples/canvas-overlay.html 在函数中声明所有选项和数据后(在您的示例中,在“网格”选项之后):

    grid:{
        background: '#f8f8f8'
    },
    canvasOverlay: {
                        show: true,
                        objects: [
                            {horizontalLine: {
                                name: 'avergae',
                                y: 20.8, //**AVERAGE_FLOAT_VALUE**
                                lineWidth: 2,
                                color: 'black',
                                shadow: false
                            }}
                        ]
                    }
    

    编辑: 是的,对此感到抱歉。一定不要忘记包含“jqplot.canvasOverlay.min.js”

    【讨论】:

    • 我认为 Ovi Faur 给了你一个很好的答案。您可以在绘制图形之前计算 average_float_value 并使用变量来存储它并在 jqplot 中显示它
    • 感谢您的提醒。我当然需要这个属性。您展示的示例不包括脚本 jqplot.canvasOverlay.min.js ,这是必需的。
    【解决方案2】:

    您好,我认为最好实现一个自动计算数组中数据点平均值的函数。事实上,你的 bar char 的平均值约为 18 而不是 20! 我建议实现一个功能来做到这一点。请参阅this jsFiddle 示例。 有一篇文章展示了如何绘制和计算条形图的统计数据:此链接上的平均值、中位数、众数和标准差: http://www.meccanismocomplesso.org/en/mean-mode-median-barchart/.

    Array.prototype.average=function(){
        var sum=0;
        var j=0;
        for(var i=0;i<this.length;i++){
            if(isFinite(this[i])){
              sum=sum+parseFloat(this[i]);
               j++;
            }
        }
        if(j===0){
            return 0;
        }else{
            return sum/j;
        }
    }
    

    ...

    canvasOverlay: {
                        show: true,
                        objects: [
                            {dashedHorizontalLine: {
                                name: 'average',
                                y: data.average(),
                                lineWidth: 3,
                                color: 'black',
                                shadow: false
                            }}                  
                       ]             
                  }
    

    【讨论】: