Dojo Stacked Bars/Columns 图表标签位置不正确

Dojo Stacked Bars/Columns chart labeling in incorrect position

我遇到了有关在最新版本的 Dojo 中标记堆叠条形图和柱形图的问题。 标签被放置在 bar/column 的中心,因为它是从 0 开始绘制的,而不是从前一个 bar/column 的末尾绘制的。这意味着标签经常在 bar/column 的中间重叠,或者出现在 bar/column.

的错误部分

示例:借用StackExchange post中的JS fiddle来说明问题:在“1.10.4”和"nightly"之间更改Dojo版本,您将看到标签位置搬家。


我找到了问题的原因,"GetValue" 函数已从版本 1.10.6 和 1.11.1 之间的 StackedBars 和 StackedColumn (Dojox\charting\plot2d\StackedColumn.js) 文件中删除。此函数使用以前的 bar/column 值来调整标签位置,因为它现在丢失了,这不会发生。

我正在使用 ESRI JavaScript API,其中包括 Dojo 1.11.1。我试过从旧版本的 dojo 复制(和修改)该函数,但似乎许多其他图表函数都发生了变化,我没有成功地让它工作。

我对 JavaScript 和 Dojo 还是很陌生,但是是否可以在不修改 ESRI API 中的文件的情况下重新添加此功能?

失败了,有没有办法成功地将旧功能改装到新版本中?

谢谢!


编辑:这是我修改后的内容 StackedBars.js:

//>>built
define("dojox/charting/plot2d/StackedBars",["dojo/_base/declare","dojo/_base/lang","./Bars","./commonStacked"],function(c,e,f,d){
    return c("dojox.charting.plot2d.StackedBars",f,{
    getSeriesStats:function(){
        var a=d.collectStats(this.series,e.hitch(this,"isNullValue")),b;
        a.hmin-=0.5;
        a.hmax+=0.5;
        b=a.hmin;
        a.hmin=a.vmin;
        a.vmin=b;
        b=a.hmax;
        a.hmax=a.vmax;
        a.vmax=b;
        return a
    },
    rearrangeValues:function(a,b,c){
        return d.rearrangeValues.call(this,a,b,c)
    },
    // COPIED THIS FUNCTION FROM 1.10.6
    getValue:function(_5,_6,_7,_8){
        var y,x;
        if(_8){
            x=_6;
            y=d.getIndexValue(this.series,_7,x,e.hitch(this, "isNullValue"));
        }
        else{
            x=_5.x-1;
            y=d.getValue(this.series,_7,_5.x);
            y=[y[0]?y[0].y:null,y[1]?y[1]:null];
        }
        return {x:x,y:y[0],py:y[1]};
    }
})});

我最初的问题是 "e.hitch(this, "isNullValue")",我打错了。

我仍然有一个问题,这个功能不适用于具有负值的图表(没有错误,只是错误位置的标签),以及如何在不修改 Dojo 源文件的情况下应用这个功能?

在 Dojo StackedBars 和 StackedColumns 图表上正确定位标签的解决方案是创建一个新的 class,它继承自 dojox/charting/plot2d/StackedBars 或 dojox/charting/plot2d/StackedColumns,并包含缺少的 GetValue 函数。

这是 StackedBars 的工作 class:

define(["dojo/_base/declare", "dojox/charting/plot2d/StackedBars", "dojox/charting/plot2d/commonStacked", "dojo/_base/lang"], 
function(declare, StackedBars, commonStacked, lang){

return declare("FixedStackedBars", dojox.charting.plot2d.StackedBars, {
    getValue: function(value, index, seriesIndex, indexed){
        var y,x;
        if(indexed){
            x = index;
            y = commonStacked.getIndexValue(this.series, seriesIndex, x, lang.hitch( this, "isNullValue" ) );
        }else{
            x = value.x - 1;
            y = commonStacked.getValue(this.series, seriesIndex, value.x);
            y = [  y[0]?y[0].y:null, y[1]?y[1]:null ];
        }
        // in py we return the previous stack value as we need it to position labels on columns
        return { x: x, y: y[0], py: y[1] };
    }
});
});

在您的代码中使用这个新的 class 代替 dojox/charting/plot2d/StackedBars。

然而,此方法并不完美,因为它不会考虑可能已经在 StackedBar/StackedColumn classes 中包含 GetValue 函数的旧版或未来版本的 Dojo。需要某种机制来检查基础 class 是否包含 GetValue 方法。

它确实适用于 ESRI JavaScript API 3.17 和 3.18,这是它的目标。