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,这是它的目标。
我遇到了有关在最新版本的 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,这是它的目标。