Apache flex 堆叠柱形图中的动态序列有时不显示
我有一个堆叠的柱状图,其中可能会出现不同的数据。如果将“垂直轴中的自动调整”设置为“真”,则会出现此问题,此时某些系列不会显示(因为轴值未达到系列值的范围)。如果我们将autoaxis设置为false,并手动设置最大值和最小值,则所有系列都会正确显示,但手动轴设置只有在我们已经知道数据时才可能。我的数据是动态的,不知道轴的最大值。这个问题有解决办法吗?Apache flex 堆叠柱形图中的动态序列有时不显示,apache-flex,actionscript,charts,flex4,adobe,Apache Flex,Actionscript,Charts,Flex4,Adobe,我有一个堆叠的柱状图,其中可能会出现不同的数据。如果将“垂直轴中的自动调整”设置为“真”,则会出现此问题,此时某些系列不会显示(因为轴值未达到系列值的范围)。如果我们将autoaxis设置为false,并手动设置最大值和最小值,则所有系列都会正确显示,但手动轴设置只有在我们已经知道数据时才可能。我的数据是动态的,不知道轴的最大值。这个问题有解决办法吗? 提前感谢。您可以添加一个函数,使用“渲染”事件循环浏览图表中的所有系列数据。此事件在渲染任何内容之前发出,可用于计算图表可以渲染的最大值 如果要
提前感谢。您可以添加一个函数,使用“渲染”事件循环浏览图表中的所有系列数据。此事件在渲染任何内容之前发出,可用于计算图表可以渲染的最大值 如果要利用以下示例中的“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>
最大值){
最大值=项目[数据字段];
}
如果(isNaN(最小)){
最小值=项目[数据字段];
}否则{
如果(项目[数据字段]2){
vAxis.max=最大值;
}否则{
//当图表值非常小时使用
vAxis.max=2;
}
}
]]>
您可以添加一个函数,该函数使用“渲染”事件在图表中的所有系列数据中循环。此事件在渲染任何内容之前发出,可用于计算图表可以渲染的最大值
如果要利用以下示例中的“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>
最大值){
最大值=项目[数据字段];
}
如果(isNaN(最小)){
最小值=项目[数据字段];
}否则{
如果(项目[数据字段]2){
vAxis.max=最大值;
}否则{
//当图表值非常小时使用
vAxis.max=2;
}
}
]]>
感谢您提供的解决方案。实际上,我的问题不同,但您在此处编写的渲染事件帮助我在图表中确定了问题。:-)继续贡献。如果有人能从中得到帮助,那就太好了。谢谢你的解决方案。实际上,我的问题不同,但您在此处编写的渲染事件帮助我在图表中确定了问题。:-)继续贡献。如果有人能从中得到帮助,那就好了