2009-11-11 5 views
0

Je montre un graphique à barres empilées avec Flex, et je change dynamiquement les données du fournisseur de données. Cependant, le minimum et le maximum de l'axe y ne sont pas réinitialisés avec les nouvelles données. Donc, si un jeu de données a une valeur de -100 000, mais que l'ensemble de données suivant n'a que des valeurs positives, l'axe des ordonnées commence toujours à -100 000.Flex réinitialiser l'axe du graphique minimum/maximum

Comment puis-je forcer le graphique à redessiner. J'ai essayé myChart.validateNow(), dataprovider.refresh(), etc.

<mx:ColumnChart id="myChart" 
        dataProvider="{_arrCol_chartData}" 
        columnWidthRatio="0.8" 
        type="stacked" 
        width="100%" 
        height="100%"> 
     <mx:annotationElements> 
      <mx:CartesianDataCanvas id="canvas" 
            includeInRanges="true"/> 
     </mx:annotationElements> 

     <mx:horizontalAxis> 
      <mx:CategoryAxis dataProvider="{_arrCol_chartData}" 
          categoryField="Month" 
          id="a1"/> 
     </mx:horizontalAxis> 
     <mx:verticalAxisRenderers> 
      <mx:AxisRenderer axis="{a1}" 
          tickPlacement="none" 
          showLabels="false" 
          showLine="false"/> 
     </mx:verticalAxisRenderers> 

     <mx:series> 
      <mx:ColumnSeries yField="invisible" 
          displayName="invisible" 
          showDataEffect="slideIn" 
          hideDataEffect="slideOut"> 
       <mx:fill> 
        <!--Set alpha to 0 to hide invisible column.--> 
        <mx:SolidColor color="0xFFFFFF" 
            alpha="0"/> 
       </mx:fill> 
      </mx:ColumnSeries> 
      <mx:ColumnSeries yField="freeCashflow" 
          styleName="standardSeries" 
          labelFunction="setCurrencyLabel"> 
       <mx:fill> 
        <mx:SolidColor color="0xCCCCCC" 
            alpha="1"/> 
       </mx:fill> 
      </mx:ColumnSeries> 
      <mx:ColumnSeries yField="invisibleTop" 
          displayName="invisible" 
          showDataEffect="slideIn" 
          hideDataEffect="slideOut"> 
       <mx:fill> 
        <!--Set alpha to 0 to hide invisible column.--> 
        <mx:SolidColor color="0xFFFFFF" 
            alpha="0"/> 
       </mx:fill> 
      </mx:ColumnSeries> 
      <mx:ColumnSeries yField="bottom" 
          styleName="standardSeries" 
          labelFunction="setCurrencyLabel"> 

       <mx:fill> 
        <mx:SolidColor color="0x1B95D5" 
            alpha="1"/> 
       </mx:fill> 
      </mx:ColumnSeries> 
      <mx:ColumnSeries yField="top" 
          id="topColumn" 
          styleName="standardSeries" 
          labelFunction="setCurrencyLabel"> 
       <mx:fill> 
        <mx:SolidColor color="0x00FF00" 
            alpha="1"/> 
       </mx:fill> 
      </mx:ColumnSeries> 
     </mx:series> 
    </mx:ColumnChart> 

[Bindable] 
private var _arrCol_chartData : ArrayCollection = new ArrayCollection([ 
      { ID: FREE_CASHFLOW, Month: "Free Cashflow", freeCashflow: 0, invisible: 0, invisibleTop: 5000 }, 
      { ID: CAPITAL_RESERVES, Month: "Capital Reserves", bottom: 0, invisible: 0 }, 
      { ID: REINVESTMENT_MONEY, Month: "Reinvestment Money", bottom: 0, invisible: 0 }, 
      { ID: PROFIT_SHARING, Month: "Profit Sharing", bottom: 0, invisible: 0 }, 
      { ID: DISTRIBUTABLE, Month: "Distributable", top: 0, invisible: 0 }]); 


function changeDate() : void { 
    _arrCol_chartData.getItemAt(0).bottom = 1000; 
    _arrCol_chartData.refresh(); 
} 

Thx, Martin

+0

Publiez du code à partir de votre graphique où vous initialisez et définissez les propriétés sur l'axe, et du code expliquant comment vous modifiez les données dans le fournisseur de données. –

Répondre

0

Cela devrait faire le travail. `

a1.maximum = NaN; 
a1.minimum = NaN; // or 0 if you want it based at zero{ 

`

modifier:

J'ai changé le code pour ressembler à ceci:

<mx:horizontalAxis> 
    <mx:CategoryAxis dataProvider="{_arrCol_chartData}" 
     categoryField="Month" 
     id="a1"/> 
</mx:horizontalAxis> 
<mx:horizontalAxisRenderers> 
<mx:AxisRenderer axis="{a1}" 
    tickPlacement="none" 
    showLabels="true" 
    showLine="false"/> 
</mx:horizontalAxisRenderers> 

et l'axe linéaire mis à jour parfaitement.

+0

Eh bien, je veux que ce soit toujours le minimum de toutes les barres visibles dans le tableau. Je sais que je pourrais itérer sur le fournisseur de données et récupérer la valeur minValue, mais n'y a-t-il aucun moyen de demander au tableau Flex de réajuster l'axe (juste en réinitialisant l'axe en fonction des nouvelles valeurs de données)? – martin

+0

ces propriétés n'existent pas sur a1, des idées? – martin

+0

ouais, ma solution est pour un LinearAxis, pas CategoryAxis :). Je regarde le code mais je n'ai pas encore de réponse. – susichan

0

Essayez d'ajouter le tableau au module ou à l'application dynamique en actionscript. Cela l'enlèverait de la mémoire et s'assurerait que l'axe est réinitialisé.

Questions connexes