Graph 如何创建计算和设置图表间隔的方法

Graph 如何创建计算和设置图表间隔的方法,graph,flex3,intervals,Graph,Flex3,Intervals,我正在学习flex。我需要你的帮助,我想创建一个方法,根据数据提供者的值计算垂直轴的间隔值 <mx:verticalAxis> <mx:LinearAxis labelFunction="usageColumnSerieLabelFn" interval="0.0001"/> </mx:verticalAxis> 正如你所看到的,在这段代码中,我对间隔进行了硬编码。就像我说的,我需要你的帮助来创建一个新的方法来计算和设置这个值

我正在学习flex。我需要你的帮助,我想创建一个方法,根据数据提供者的值计算垂直轴的间隔值

    <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 += "&lt;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 = "&lt;" + 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 += "&lt;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 = "&lt;" + 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设置间隔

如果你有更好的想法,请告诉我


注意。

如果不希望在线性轴之外执行此操作,则扩展线性轴并将其设置在那里,使用此自定义组件代替线性轴?嗯。。我想这样做,在线性轴之外。在不同的功能中。我正在读关于何延伸线性轴的书。但我不知道怎么做。谢谢你的回复,但是如果你能给我举个例子,那就太好了!谢谢