2012-01-12 10 views
0

私は、オブジェクトのタイムラインとY軸の値を示すX軸のグラフを持っています。タイムラインの値は「ミリ秒」です。私はタイムラインを選択する方法をユーザーに与え、ユーザーは日/週/月/月を選択することができます。だから私のチャートでは、選択した範囲のすべてのデータポイントを表示したいが、X軸に表示される日付ラベルを制限したい。例:ユーザーが週を選択した場合、X軸にMon to Sunを表示します。ユーザーが1日を選択した場合、その3時間ごとのラベルを表示したい...Flexで動的DateTimeAxisを作成

実行時に選択した時間範囲を見て、 t1)と終了(t2)の時間、私は決定を下す。これを達成するためにFlexのDateTimeAxisに利用できるAPIはありますか?またはこれを得る方法に関する他のアイデア? extend

おかげで、 ラヴィ

答えて

0

は私が発見した何

は、このような専門的な状況のために、より頻繁に動作します:-Pます私にDateTimeAxisオブジェクトを曲げしようとしている困難の多くを持っていたありますCategoryAxis。気になる日付だけの配列を生成し、それらをカテゴリ軸として使用することができます。これがあなたの状況ではうまくいくかどうかはわかりませんが、それは私が見ている最初の場所です。

これはもちろん、軸アイテムの表示を日付や時刻のようにカスタマイズする必要があるため、もっと手間がかかりますが、カスタムの状況では機能すると思います。

0

さて、ここで私はこの問題の解決策を見つけました。上記の@fotomutと同様です。私は、 'udpate()'メソッドを書き換えることを除いて、 'CategoryAxis'のすべてのコードをコピーしました。ここでラベルが生成されます。ここに更新方法の私の実装は、完璧な解決策ではないかもしれません....

しかし、私はここで問題に直面している。何らかの理由で、グラフとラベルが少し手前にシフトして見えます。私は、ファイルをアップロードしないように制限されているので、私はCustomDateAxisとFlexを比較して、これをよりよく説明するためにCategoryAxisを提供する画像を投稿できません。私はこれを解決しようとしていますが、解決策を見つけることはまだありません。

if (!_labelSet) 
{ 

    //I do not need label for each item in my dataprovider. 
    //Hence creating a 'categoryValues' array with limited labels. 
    var chartDP:ArrayCollection = this.dataProvider as ArrayCollection; 
    var axisLabels:Array /* of AxisLabel */ = []; 
    var labelsArr:Array = []; 
    var categoryItems:Array = []; 
    var dataMap:Object = {}; 
    _catMap = {}; 
    _categoryValues = []; 
    _labelsMatchToCategoryValuesByIndex = []; 

    if(chartDP.length != 0) { 

     for(var indx:int=0; indx<chartDP.length; indx++){ 

      // Add each item to the map. 
      //This is mandatory as it's being used internally to draw the Y-value 
      _catMap[chartDP.getItemAt(indx).timeStamp.toString()] = indx; 
     } 

     var firstItem:Object = chartDP.getItemAt(0); 
     var lastItem:Object = chartDP.getItemAt(chartDP.length - 1); 
     var incrCounter:int; 

     var timeDiffInMillis:Number = (lastItem.timeStamp) - (firstItem.timeStamp); 
     var arrIndx:int=0; 
     if(timeDiffInMillis <= MILLISECONDS_IN_HOUR){ 
      LIMIT_LABEL_CNT = 12; 
      INT_LBL_UNITS = "MINUTES"; 
     }else if(timeDiffInMillis > MILLISECONDS_IN_HOUR && timeDiffInMillis <= MILLISECONDS_IN_DAY){ 
      LIMIT_LABEL_CNT = 12; 
      INT_LBL_UNITS = "HOURS"; 
     }else if(timeDiffInMillis > MILLISECONDS_IN_DAY && timeDiffInMillis <= MILLISECONDS_IN_WEEK){ 
      LIMIT_LABEL_CNT = 7; 
      INT_LBL_UNITS = "DAYS"; 
     }else if(timeDiffInMillis > MILLISECONDS_IN_WEEK && timeDiffInMillis <= MILLISECONDS_IN_MONTH){ 
      LIMIT_LABEL_CNT = 4; 
      INT_LBL_UNITS = "WEEKS"; 
     }else if(timeDiffInMillis > MILLISECONDS_IN_MONTH && timeDiffInMillis <= MILLISECONDS_IN_YEAR) { 
      LIMIT_LABEL_CNT = 12; 
      INT_LBL_UNITS = "MONTHS" 
     } 

     if(chartDP.length <= LIMIT_LABEL_CNT) 
      incrCounter = 1; 
     else 
      incrCounter = chartDP.length/LIMIT_LABEL_CNT; 
     var i:int=0; 
     for(i=0,arrIndx=0; i<chartDP.length; i=i+incrCounter){ 

      arrIndx = i; 
      _categoryValues[arrIndx] = chartDP.getItemAt(i).timeStamp; 
      dataMap[arrIndx] = chartDP.getItemAt(i); 

      //There is a very good chance for the incrCounter to omit 
      //the last items in the DataProvider. 
      if((chartDP.length-i) <= incrCounter){ 
       arrIndx=arrIndx+incrCounter; 
       _categoryValues[arrIndx] = chartDP.getItemAt(chartDP.length-1).timeStamp; 
       dataMap[arrIndx] = chartDP.getItemAt(chartDP.length-1); 
      } 
     } 

     var min:Number = -_padding; 
     var max:Number = _categoryValues.length - 1 + _padding; 
     var alen:Number = max - min; 
     var label:AxisLabel; 

     var n:int = _categoryValues.length; 
     if (_labelFunction != null) 
     { 
      var previousValue:Object = null; 
      for (i=0; i<n; i++) 
      { 
       if (_categoryValues[i] == null) 
        continue; 

       if(previousValue != null && _categoryValues[i] != null){ 
        if(previousValue == _categoryValues[i]) 
         continue; 
       } 
       label = new AxisLabel((i - min)/alen, _categoryValues[i], 
        timeLblFormatFunction(_categoryValues[i], previousValue, 
         this, dataMap[i])); 
       _labelsMatchToCategoryValuesByIndex[i] = label; 
       axisLabels.push(label); 

       previousValue = _categoryValues[i]; 
      } 
     } 
     else 
     { 
      for (i = 0; i < n; i++) 
      { 
       if (!_categoryValues[i]) 
        continue; 

       label = new AxisLabel((i - min)/alen, _categoryValues[i], 
        _categoryValues[i].toString()); 
       _labelsMatchToCategoryValuesByIndex[i] = label; 
       axisLabels.push(label); 
      }    
     } 
    } 

    _labelSet = new AxisLabelSet(); 
    _labelSet.labels = axisLabels; 
    _labelSet.accurate = true; 
    _labelSet.minorTicks = minorTicks; 
    _labelSet.ticks = generateTicks();   
} 
+0

さて、ラベルが右にシフトされている問題の答えを見つけました。 '_パディング'プロパティは、トリックをやっていた。私はクラスのドキュメントから、 'padding'の値がlinecharts/areachartの場合は '0'にリセットされ、columnchart/barchartの場合は0.5にリセットされることがわかりました。しかし、何らかの理由で、これが私には起こっていなかったので、私はそれを行うために「0」にしています。さて、私のチャートは一般的なX軸で期待どおりに動作します。ありがとう.... – Ravi

関連する問題