在弹性图表中, 我想绘制与特定系列相关的“参考线”之类的东西, 因此这些线不是独立的系列,不应在图例中显示。 是否可以从图表图例中排除某些系列? 谢谢!
答案 0 :(得分:10)
我详细阐述了路易斯B的答案,使其动态反映在线图的数据提供者身上。这样,图例仅显示图表中可用的字段。有点漂亮。
这是我提出的,而且运作良好:
protected function onUpdateLinechartComplete(e:FlexEvent):void
{
//empty legend for fresh display
var legendArray:Array = new Array();
legend1.dataProvider = legendArray;
//filter Legend data so that only LineSeries with data can be shown
for(var i:int=0; i< linechart1.legendData.length; i++) {
//if data is found in the line series, let's add it to the chart legend data provider, so it can be displayed in the legend
if (linechart1.legendData[i].element.items.length != 0) {
legendArray.push(linechart1.legendData[i]);
}
}
legend1.dataProvider = legendArray;
legend1.direction = "vertical";
}
//in the page Initialize function, I add a listener event to the linechart component for when the legend update completes so it can filter lineseries on the legend's dataprovider in [onUpdateLegendComplete]
linechart1.addEventListener(FlexEvent.UPDATE_COMPLETE, onUpdateLinechartComplete);
我最终不得不使用EventHandler并将事件监听器附加到线图本身。这是因为我遇到了传奇数据提供者的“竞争条件”。有些东西可以使用,有时它不会。使用事件Listener消除了该问题,并仅在线图完成加载数据时过滤图例。
免费提供这些答案,FLEX FOLKS !!
答案 1 :(得分:7)
可以从图表图例中排除某些系列。
每个图表类(扩展ChartBase)都有一个legendData Array属性。这个legendData有一个LegendItem列表。如果你创建一个基于legendData的newArray,但只有你想要的LegendItem;然后您可以将该数组设置为图例的dataProvider。
此外,您可以根据从头创建的LegendItems创建自己的LegendItem数组。并使用该数组作为Legend的dataProvider。
例如,这里我只在我的图例中显示第一个和第三个系列:
<mx:Script>
<![CDATA[
private function cc(event:Event):void
{
var newArray:Array = new Array();
newArray.push(myChart.legendData[0]);
newArray.push(myChart.legendData[2]);
myActionScriptLegend.dataProvider = newArray;
}
]]>
</mx:Script>
<mx:ColumnChart id="myChart">
<mx:series>
<mx:ColumnSeries id="series0"/>
<mx:ColumnSeries id="series1"/>
<mx:ColumnSeries id="series2"/>
</mx:series>
</mx:ColumnChart>
<mx:Legend dataProvider="{[myChart.legendData[0],myChart.legendData[2]]}" />
<mx:Legend id="myActionScriptLegend" creationComplete="cc(event)" />
http://livedocs.adobe.com/flex/3/langref/mx/charts/chartClasses/ChartBase.html#legendData
http://livedocs.adobe.com/flex/3/langref/mx/charts/LegendItem.html
http://livedocs.adobe.com/flex/3/html/charts_displayingdata_12.html#330954
答案 2 :(得分:4)
确定另一个版本的devtron的答案,如果你已经有了像我一样的自定义线图类,那么把它放进去:
[Bindable] public var activeLegendData:Array;
// this goes in an initialize handler
addEventListener(FlexEvent.UPDATE_COMPLETE, onUpdateChartComplete);
protected function onUpdateChartComplete(e:FlexEvent):void {
activeLegendData = new Array();
for(var i:int=0; i < legendData.length; i++) {
if (legendData[i].element.items.length != 0) {
activeLegendData.push(legendData[i]);
}
}
}
然后将您的图例数据提供者绑定到linechart.activeLegendData而不是linechart。
这个解决方案优于Devtron的优势在于,每次在应用中添加其他线图时,您都不必重写代码。
答案 3 :(得分:0)
对先前答案的一些评论。 当提到创建一个新数组以将其用作图例时,请注意,因为它不像描述的那样。对我而言,它的工作原理如下:
当您尝试访问现有pie.legendData中的值时,您应该这样做: pie.legendData [0] [0]或pie.legendData [0] [1]
除此之外,为了将这些数据转换为新数组并将其用于创建新图例,您应该等待已经创建了饼图。
为此,我只使用饼图的渲染事件。
希望它对你有所帮助。