我是Flex和Actionscript的新手(2周)。
我试图使用一个Chart,其DataProvider是一个包含Objects的ArrayCollection '人'例如。人的属性是年龄和薪水。
我的图表将是ColumnChart,xField = Age,yField将是年龄相同的人的AVG(或SUM)薪水。
有什么简单的方法吗? 使用我刚刚学到的方法,每个人都会在图表中拥有一个列。
我的mxml代码:
< mx :ColumnChart id="myChart" height="100%" color="0x323232"
showDataTips="true" dataProvider="{GraphArray}">
< mx:series>
< mx:ColumnSeries xField="age" yField="salary"/>
< /mx:series>
< /mx:ColumnChart>
答案 0 :(得分:1)
据我所知,标准图表只会准确显示您提供给他们的内容,因此您需要创建一个新的数据提供者,其中包含每个年龄段的数据的平均值/总和。
要使派生的提供程序保持最新的GraphArray更改,您可以向GraphArray添加侦听器,或者,如果GraphArray仅设置且未修改,则可以将变量分解为getter和setter ,像这样(未经测试的)代码:
如果你有
[Bindable]
public var GraphArray:ArrayCollection;
将其替换为
private var _GraphArray:ArrayCollection;
[Bindable]
private var DerivedGraphArray:ArrayCollection;
[Bindable]
public function get GraphArray():ArrayCollection
{
return _GraphArray;
}
public function set GraphArray(value:ArrayCollection):void
{
var ageBucketedArray:Array = new Array(121);
var ageBucketedCountsArray:Array = new Array(121);
//Compute salary sums
for each (var o:Object in value)
{
if (ageBucketedArray[o["age"]])
{
ageBucketedArray[o["age"]] += o["salary"];
ageBucketedCountsArray[o["age"]] += 1;
}
else
{
ageBucketedArray[o["age"]] = o["salary"];
ageBucketedCountsArray[o["age"]] = 1;
}
}
//Compute averages
for (var age:int = 0; age < ageBucketedArray.length; age++)
{
if (ageBucketedArray[age])
{
ageBucketedArray[age] /= ageBucketedCountsArray[age];
}
else
{
ageBucketedArray[age] = 0;
}
}
_GraphArray.removeAll();
_GraphArray.addAll(value);
DerivedGraphArray = new ArrayCollection(ageBucketedArray);
}