Graph 如何创建计算和设置图表间隔的方法
我正在学习flex。我需要你的帮助,我想创建一个方法,根据数据提供者的值计算垂直轴的间隔值Graph 如何创建计算和设置图表间隔的方法,graph,flex3,intervals,Graph,Flex3,Intervals,我正在学习flex。我需要你的帮助,我想创建一个方法,根据数据提供者的值计算垂直轴的间隔值 <mx:verticalAxis> <mx:LinearAxis labelFunction="usageColumnSerieLabelFn" interval="0.0001"/> </mx:verticalAxis> 正如你所看到的,在这段代码中,我对间隔进行了硬编码。就像我说的,我需要你的帮助来创建一个新的方法来计算和设置这个值
<mx:verticalAxis>
<mx:LinearAxis labelFunction="usageColumnSerieLabelFn" interval="0.0001"/>
</mx:verticalAxis>
正如你所看到的,在这段代码中,我对间隔进行了硬编码。就像我说的,我需要你的帮助来创建一个新的方法来计算和设置这个值
我相信,如果我们在dataProvider中取较大的值,然后将该值设置为较大值+0.1的间隔。我会成功的。但是我不知道如何在mx:LinearAxis组件之外设置属性
我举了个例子,如果你有时间,请帮我一把
问候
<?xml version="1.0"?>
<!-- charts/BasicColumn.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
import flash.external.ExternalInterface;
import mx.charts.HitData;
import mx.formatters.SwitchSymbolFormatter;
import mx.charts.series.items.LineSeriesItem;
import mx.charts.HitData;
import mx.formatters.NumberFormatter;
import mx.core.UIComponent;
import mx.effects.easing.Bounce;
import mx.managers.PopUpManager;
private var decimalFormatter:NumberFormatter = new NumberFormatter();
[Bindable]
public var expenses:ArrayCollection = new ArrayCollection([
{hour:"00", Expenses:0.0},
{hour:"01", Expenses:0.0},
{hour:"02", Expenses:0.0},
{hour:"03", Expenses:0.0},
{hour:"04", Expenses:0.0},
{hour:"05", Expenses:0.0},
{hour:"06", Expenses:0.0},
{hour:"07", Expenses:0.0},
{hour:"08", Expenses:0.0},
{hour:"09", Expenses:0.0},
{hour:"10", Expenses:0.00009},
{hour:"11", Expenses:0.00009},
{hour:"12", Expenses:0.0},
{hour:"13", Expenses:0.0},
{hour:"14", Expenses:0.0},
{hour:"15", Expenses:0.0},
{hour:"16", Expenses:0.0},
{hour:"17", Expenses:0.0},
{hour:"18", Expenses:0.0},
{hour:"19", Expenses:0.0},
{hour:"20", Expenses:0.0},
{hour:"21", Expenses:0.0},
{hour:"22", Expenses:0.0},
{hour:"23", Expenses:0.00009}
]);
private function customDataTipFunc(item:HitData):String{
decimalFormatter.precision = 4;
var dataTip:String = "";
dataTip += "<B>kWh</B>\n";
dataTip += item.item.hour + "\n";
if (item.item.Expenses == 0) {
dataTip += decimalFormatter.format(item.item.Expenses).toString() + " kWh";
} else {
if(item.item.Expenses < 0.0001) {
dataTip += "<0.0001 kWh";
} else {
dataTip += decimalFormatter.format(item.item.Expenses).toString() + " kWh";
}
}
return dataTip;
}
public function axisLabelFn(cat:Object,pcat:Object,ax:LinearAxis):String{
var nf1:NumberFormatter = new NumberFormatter();
nf1.useThousandsSeparator = true;
nf1.precision = 4;
var tempNumber:Number = Number(cat.toString());
var out:String = ""
if (tempNumber == 0) {
out = nf1.format(cat) + " kWh";
}else {
if (tempNumber < 0.0001) {
out = "<" + nf1.format(cat) + " kWh";
} else {
out = nf1.format(cat) + " kWh";
}
}
//return nf1.format(cat) + " kWh";
return out;
}
]]></mx:Script>
<mx:Panel title="Column Chart Kwh" width="1200">
<mx:ColumnChart id="myChart" showDataTips="true" height="100%" width="100%" dataProvider="{expenses}" minHeight="150" dataTipFunction="customDataTipFunc">
<mx:horizontalAxis>
<mx:CategoryAxis
dataProvider="{expenses}"
categoryField="hour"
/>
</mx:horizontalAxis>
<mx:verticalAxis>
<mx:LinearAxis labelFunction="axisLabelFn" interval="0.0001"/>
</mx:verticalAxis>
<mx:series>
<mx:ColumnSeries
xField="hour"
yField="Expenses"
displayName="Kwh"
/>
</mx:series>
</mx:ColumnChart>
<mx:Legend dataProvider="{myChart}"/>
</mx:Panel>
</mx:Application>
谢谢宙斯的话。我尝试了一些方法,这是最终的解决方案
<?xml version="1.0"?>
<!-- charts/BasicColumn.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="calculateInterval()">
<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
import flash.external.ExternalInterface;
import mx.charts.HitData;
import mx.formatters.SwitchSymbolFormatter;
import mx.charts.series.items.LineSeriesItem;
import mx.charts.HitData;
import mx.formatters.NumberFormatter;
import mx.core.UIComponent;
import mx.effects.easing.Bounce;
import mx.managers.PopUpManager;
private var decimalFormatter:NumberFormatter = new NumberFormatter();
[Bindable]
public var expenses:ArrayCollection = new ArrayCollection([
{hour:"00", Expenses:0.0},
{hour:"01", Expenses:0.0},
{hour:"02", Expenses:0.0},
{hour:"03", Expenses:0.0},
{hour:"04", Expenses:0.0},
{hour:"05", Expenses:0.0},
{hour:"06", Expenses:0.0},
{hour:"07", Expenses:0.0},
{hour:"08", Expenses:0.0},
{hour:"09", Expenses:0.0},
{hour:"10", Expenses:0.00009},
{hour:"11", Expenses:0.00009},
{hour:"12", Expenses:0.0},
{hour:"13", Expenses:0.0},
{hour:"14", Expenses:0.0},
{hour:"15", Expenses:0.0},
{hour:"16", Expenses:0.0},
{hour:"17", Expenses:0.0},
{hour:"18", Expenses:0.0},
{hour:"19", Expenses:0.0},
{hour:"20", Expenses:0.0},
{hour:"21", Expenses:0.0},
{hour:"22", Expenses:0.0},
{hour:"23", Expenses:0.00009}
]);
public function calculateInterval():void{
var maxValue:Number = 0;
for ( var x:int = 0; x < expenses.length; ++x ) {
if (maxValue < expenses.getItemAt(x).Expenses){
maxValue = expenses.getItemAt(x).Expenses;
}
}
MyLinearAxis.interval = maxValue + 0.0001;
}
private function customDataTipFunc(item:HitData):String{
decimalFormatter.precision = 4;
var dataTip:String = "";
dataTip += "<B>kWh</B>\n";
dataTip += item.item.hour + "\n";
if (item.item.Expenses == 0) {
dataTip += decimalFormatter.format(item.item.Expenses).toString() + " kWh";
} else {
if(item.item.Expenses < 0.0001) {
dataTip += "<0.0001 kWh";
} else {
dataTip += decimalFormatter.format(item.item.Expenses).toString() + " kWh";
}
}
return dataTip;
}
public function axisLabelFn(cat:Object,pcat:Object,ax:LinearAxis):String{
var nf1:NumberFormatter = new NumberFormatter();
nf1.useThousandsSeparator = true;
nf1.precision = 4;
var tempNumber:Number = Number(cat.toString());
var out:String = ""
if (tempNumber == 0) {
out = nf1.format(cat) + " kWh";
}else {
if (tempNumber < 0.0001) {
out = "<" + nf1.format(cat) + " kWh";
} else {
out = nf1.format(cat) + " kWh";
}
}
return out;
}
]]></mx:Script>
<mx:Panel title="Column Chart Kwh" width="1200">
<mx:ColumnChart id="myChart" showDataTips="true" height="100%" width="100%" dataProvider="{expenses}" minHeight="150" dataTipFunction="customDataTipFunc">
<mx:horizontalAxis>
<mx:CategoryAxis
dataProvider="{expenses}"
categoryField="hour"
/>
</mx:horizontalAxis>
<mx:verticalAxis>
<mx:LinearAxis id="MyLinearAxis" labelFunction="axisLabelFn" />
</mx:verticalAxis>
<mx:series>
<mx:ColumnSeries
xField="hour"
yField="Expenses"
displayName="Kwh"
/>
</mx:series>
</mx:ColumnChart>
<mx:Legend dataProvider="{myChart}"/>
</mx:Panel>
</mx:Application>
如您所见,我在mx:Application中使用调用方法creationComplete调用函数calculateInterval。在这个方法中,我计算时间间隔,并在数据提供程序中设置一个偏移量为最大值
我还为linearAxis设置了一个id,用这个id设置间隔
如果你有更好的想法,请告诉我
注意。如果不希望在线性轴之外执行此操作,则扩展线性轴并将其设置在那里,使用此自定义组件代替线性轴?嗯。。我想这样做,在线性轴之外。在不同的功能中。我正在读关于何延伸线性轴的书。但我不知道怎么做。谢谢你的回复,但是如果你能给我举个例子,那就太好了!谢谢