Как исключить серию в легенде (Flex) - PullRequest
5 голосов
/ 22 марта 2010

В гибком графике я хочу нарисовать что-то вроде «опорных линий», которые связаны с конкретными сериями, поэтому эти линии не являются независимыми сериями и не должны отображаться в легенде.Можно ли исключить некоторые серии из легенды диаграммы?Спасибо!

Ответы [ 5 ]

10 голосов
/ 24 января 2011

Я подробно остановился на ответе Луиса Б., чтобы он динамически отражался на поставщике данных линейной диаграммы. Таким образом, легенда показывает только те поля, которые доступны на графике. Вроде классный.

Вот то, что я придумал, и это хорошо работает:

        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 и подключить прослушиватель событий к самой линейной диаграмме. Это потому, что я испытывал "условия гонки" с поставщиком данных легенды. Иногда это будет работать, иногда нет. Использование прослушивателя событий устраняет эту проблему и фильтрует легенду только после завершения загрузки данных линейной диаграммой.

ЧУВСТВУЙТЕ БЕСПЛАТНО, ЧТОБЫ ОТВЕТИТЬ НА ЭТО ОТВЕТ

7 голосов
/ 22 марта 2010

Можно исключить некоторые серии из легенды диаграммы.

Каждый класс диаграммы (расширяющий ChartBase) имеет свойство legendData Array. Эта легенда имеет данные о LegendItem. Если вы создаете newArray на основе legendData, но только с тем LegendItem, который вам нужен; затем вы можете установить этот массив как dataProvider для вашей легенды.

Кроме того, вы можете создать свой собственный массив LegendItem на основе LegendItems, который вы создаете с нуля. И использовать этот массив в качестве 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

4 голосов
/ 05 сентября 2011

ОК, еще одна версия ответа 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 в том, что вам не нужно переписывать код каждый раз, когда вы добавляете другую линейную диаграмму в свое приложение.

1 голос
/ 11 октября 2012

Другая альтернатива ...

Извлеките новый класс из одного из классов серии диаграмм, затем переопределите метод получения для legendData() и верните пустой массив. Вот пример для PlotSeries:

public class PlotSeriesNoLegend extends PlotSeries
{
    public function PlotSeriesNoLegend()
    {
        super();
    }

    override public function get legendData():Array /* of LegendData */
    {
        return [ ];
    }
}
0 голосов
/ 07 мая 2013

Некоторые комментарии к предыдущим ответам.При создании нового массива, который будет использоваться в качестве легенды, будьте осторожны, потому что он не такой, как описано.Для меня это работает так:

Когда вы пытаетесь получить доступ к значению в существующем pie.legendData, вы должны сделать это следующим образом: pie.legendData [0] [0] или pie.legendData [0] [1]

Кроме того, чтобы получить эти данные в новом массиве и использовать их для создания новой легенды, следует подождать, пока пирог уже будет создан.

Для этого япросто используйте событие рендеринга пирога.

Надеюсь, он вам поможет.

...