2012-10-24 6 views
1

다양한 데이터가 올 수있는 누적 기둥 형 차트가 있습니다. 세로축의 autoAdjust가 true로 설정되어 있고 일부 계열이 표시되지 않으면 (축 값이 계열 값의 범위에 도달하지 않았기 때문에) 문제가 발생합니다. 자동 축을 false로 설정하고 수동으로 최대 값과 최소값을 설정하면 모든 시리즈가 올바르게 표시되지만 수동 축 설정은 데이터에 대해 이미 알고있는 경우에만 가능합니다. 내 데이터가 동적이며 최대 축 값에 대한 아이디어가 없습니다. 문제에 대한 해결 방법이 있습니까? 미리 감사드립니다. 누적 기둥 형 차트의 동적 시리즈가 때때로 표시되지 않습니다.

답변

1

"render"이벤트를 사용하여 차트의 모든 시리즈 데이터를 순환하는 함수를 추가 할 수 있습니다. 이 이벤트는 아무 것도 렌더링되기 바로 전에 전달되고 차트에서 렌더링 할 수있는 최대 값을 계산하는 데 사용할 수 있습니다.

다음 예제에서 "min"계산을 활용하려면 세로 축 "baseAtZero"속성을 "false"로 설정하십시오. 여기

은 예이다 : 용액 용

<mx:Canvas 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    creationComplete="init()" 
    click="generateRandomData()" 
    > 

    <mx:Script> 
     <![CDATA[ 
      import mx.charts.chartClasses.AxisBase; 
      import mx.charts.chartClasses.ChartBase; 
      import mx.charts.chartClasses.Series; 
      import mx.collections.ArrayCollection; 

      [Bindable] 
      public var testData:ArrayCollection = new ArrayCollection(); 

      public function init():void{ 
       generateRandomData(); 
      } 

      public function generateRandomData():void{ 
       var randomNumberOfObject:int = Math.floor((Math.random() * 100)); 
       var i:int = 0; 
       var resultData:ArrayCollection = new ArrayCollection(); 

       if(randomNumberOfObject <= 1){ 
        randomNumberOfObject = 2; 
       } 

       while(i < randomNumberOfObject){ 
        var dataObject:Object = new Object(); 
        dataObject.date = i; 
        dataObject.value = Math.floor((Math.random() * 10)); 
        dataObject.value2 = Math.floor((Math.random() * 10)); 
        dataObject.value3 = Math.floor((Math.random() * 10)); 

        resultData.addItem(dataObject); 
        i++; 
       } 

       testData = resultData; 
      } 

      public function adjustVerticalLabels(e:Event = null):void{ 
       var chartSeries:Array = (e.currentTarget as ChartBase).series; 
       var vAxis:* = null; 
       var size:int = chartSeries.length; 
       var max:Number = 0; 
       var min:Number = NaN; 

       for each(var series:* in chartSeries){ 
        if(vAxis == null){ 
         vAxis = (series as Series).getAxis(ChartBase.VERTICAL); 
        } 
        if(series.enabled == true){ 
         var dataField:String = series.yField; 
         for each(var item:* in series.dataProvider){ 
          if(item[dataField] > max){ 
           max = item[dataField]; 
          } 
          if(isNaN(min)){ 
           min = item[dataField]; 
          }else{ 
           if(item[dataField] < min){ 
            min = item[dataField]; 
           } 
          } 
         } 
        } 
       } 

       vAxis.minimum = min; 
       if(max > 2){ 
        vAxis.maximum = max; 
       }else{ 
        //Used when the chart values are very small 
        vAxis.maximum = 2; 
       } 
      } 
     ]]> 
    </mx:Script> 

    <mx:BarChart id="lineChart" 
     width="100%" height="100%" 
     showDataTips="true" 
     dataTipMode="single" 
     seriesFilters="{[]}" 
     dataProvider="{testData}" 
     render="adjustVerticalLabels(event)" 
     > 
     <mx:horizontalAxis> 
      <mx:CategoryAxis id="testXAxis" 
       dataProvider="{testData}" 
       categoryField="date" 
       /> 
     </mx:horizontalAxis> 

     <mx:verticalAxis> 
      <mx:LinearAxis id="textYAxis" 
       baseAtZero="false" 
       /> 
     </mx:verticalAxis> 

     <mx:series> 
      <mx:ColumnSeries 
       yField="value" 
       displayName="Value" 
       /> 
      <mx:ColumnSeries 
       yField="value2" 
       displayName="Value2" 
       /> 
      <mx:ColumnSeries 
       yField="value2" 
       displayName="Value3" 
       /> 
     </mx:series> 
    </mx:BarChart> 

</mx:Canvas> 
+0

감사합니다. 사실 내 문제는 다르지만 여기서 코딩 한 렌더링 이벤트는 내 차트에서 문제를 식별하는 데 도움이되었습니다. :-) 계속 기부하십시오. – ankurtr

+0

일부 사람이이 [LINK] (http://www.scottlogic.com/blog/2009/04/14/missing-values-in-flex-charts.html)의 도움을받는다면 좋습니다. – manjs

관련 문제