Jonathan --
The Category Axis maps values to catgegories...it can't know how to map the same value to multiple categories. What's the behavior you're looking for? Let me suggest one possibility. In a fully specified situation, the series names its xField, loads the value out of that field, and uses the category axis to map it to a category. But most of the time, developers don't bother to specify an xField. When that happens, the series just assumes that the data appears in the same order as the categories, and maps the nth item to the nth category. In that case, it's theoretically possible to have multiple categories representing the same value, since no one is actually trying to map values against the categories. If that's the case you're looking for, then I would suggest you: 1) remove the categoryFIeld from the category axis. 2) add a lableFuntion to the cat axis that pulls the name field out of the data and uses it as the label. Ely. -----Original Message----- From: Jonathan Miranda [mailto:[EMAIL PROTECTED] Sent: Thursday, November 02, 2006 3:28 PM To: Ely Greenfield; [email protected] Subject: FilteredLineSeries and Printing - ChartMan Ely, we need you! Alright, I've got it working - so for those following along, here's a working filter at a LineSeries not LineChart level....but hit another framework show-stopper and need your expertise Ely (sorry for bugging ya directly Ely, thought ya missed my reply earlier and getting slammed with a deadline - I promise I'll share my Gantt when its finished :). Anyways, below is my FilteredLineSeries (which works) and my mxml file I'm using to test it. My problem is the horizontalAxis/categoryAxis isn't smart when it filters data - if you change the dataprovider of the categoryAxis back between the hAxisData and the alteredData, you will see what the problem is. In a nut shell, the categoryAxis is filtering the data completely meaning that once it sees a value for the x-axis, it clips/skips the other instances of it - aka, even though I have a number:1 for blue and red, I only see blue. How do I get around this? I need to show both lines for red/blue starting at 1. If you uncomment the basic LineSeries addition, you can see it easier. In pure basic terms: If I have in my dataProvider: name="1" amount="200" brand="blue" name="1" amount="400" brand="red" how do I get 2 lines starting at name="1" and not two entries for "1" in the x-axis? I'm assuming this is a change on CategoryAxis, not the FilteredLineSeries I'll need to mess with. **Also** Side note: Printing of Charts, usually with PrintJobs you have to create a sprite and do an addChild - but a problem in the FlexFramework, is that if I do an addChild of something I'm displaying, I'll lose it because of parenting problems. Is there some nice way to print charts ala cacheAsBitmap or something similar? I'd rather not recreate charts via actionscript for each print job. I know there's some way to say "take what I see and make it a bitmap" but I'm not savy to that and I'm guessing Ely you know how to print charts :) Some advice? ====FilteredLineSeries==== package com.NoTouchie.chart { import mx.charts.series.LineSeries; import mx.charts.ChartItem; import mx.charts.series.items.LineSeriesSegment; import mx.graphics.IStroke; import mx.charts.series.renderData.LineSeriesRenderData; public class FilteredLineSeries extends LineSeries{ public function FilteredLineSeries(customFilters:Array = null) { super(); this._customFilters = customFilters; } public function set customFilters(newFilterSet:Array):void { _customFilters = newFilterSet; invalidateData(); } override protected function updateFilter():void { super.updateFilter(); // No customFilters, then don't run if(_customFilters.length > 0) { var validSegments :Array = new Array(); var validFrom :int = 0; var validTo :int = -1; var getLastValid :Boolean = false; var newCache :Array = new Array(); // For every point in the line... for(var i:int = 0; i < renderData.filteredCache.length; i++) { var currentItem:ChartItem = renderData.filteredCache[i]; // For every custom filter... var currentItemPassed:Boolean = true; for(var j:int = 0; j < _customFilters.length; j++) { var customFieldName:String = _customFilters[j].name; // Considered using FilterVO.equals, but wouldn't work with dynamic name as is // and wasn't sure if it is used elsewhere so I left it. Possible Fix Needed if(currentItem.item[customFieldName] != _customFilters[j].value) { // Only add segments that are lines (*NOT* dots) if(validFrom < validTo) { validSegments.push({validF:validFrom,validT:validTo}); } validFrom = i+1; validTo = i; getLastValid = false; // Filter causes failure, reject value currentItemPassed = false; } else { validTo++; getLastValid = true; } } if(currentItemPassed) { newCache.push(renderData.filteredCache[i]); } } // Add last segment if it wasn't added yet if(getLastValid && (validFrom < validTo)) { validSegments.push({validF:validFrom,validT:validTo}); } // Clear all Segments renderData.segments = []; if(interpolateValues == false) { for(var i:int=0; i < validSegments.length; i++) { // Push segments on that meet our customFilters var newLine:LineSeriesSegment = new LineSeriesSegment(this,i,renderData.filteredCache,validSegments[i].valid F,validSegments[i].validT); renderData.segments.push(newLine); } } else { renderData.filteredCache = newCache; // Only push if it's a line if(renderData.filteredCache.length > 1 ) { var newLine:LineSeriesSegment = new LineSeriesSegment(this,0,renderData.filteredCache,0,renderData.filteredC ache.length-1); renderData.segments.push(newLine); } } renderData.validPoints = renderData.filteredCache.length; } } private var _customFilters:Array = []; } } =====testChart.mxml===== <?xml version="1.0" encoding="utf-8"?> <mx:Application layout="vertical" verticalGap="100" creationComplete="initApp()" xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:view="*"> <mx:Script> <![CDATA[ import mx.charts.series.LineSeries; import mx.charts.chartClasses.Series; import mx.graphics.Stroke; private function initApp():void { var myFilters:Array=[ [{name:"brand",value:"blue"}], [{name:"brand",value:"red"}]]; var mySeries:Array=new Array(); for(var i:int=0; i<2 ; i++) { var newLineSeries:FilteredLineSeries = new FilteredLineSeries(myFilters[i]); newLineSeries.filterData = true; newLineSeries.interpolateValues = true; newLineSeries.yField = "amount"; newLineSeries.form = "curve"; //var newStroke:Stroke = new Stroke(0x000000,3,1,false); //newLineSeries.setStyle("lineStroke",newStroke); mySeries.push(newLineSeries); } /*var newBasicSeries:LineSeries = new LineSeries(); newBasicSeries.filterData = true; newBasicSeries.interpolateValues = true; newBasicSeries.yField = "amount"; newBasicSeries.form = "curve"; mySeries.push(newBasicSeries); */ myLineChart.series = mySeries; } private var __alteredData : Array = [{name:1,amount:"100",brand:"red",category:"soap"}, {name:2,amount:"20",brand:"red",category:"soap"}, {name:3,amount:"350",brand:"red",category:"food"}, {name:4,amount:"220",brand:"red",category:"soap"}, {name:5,amount:"578",brand:"red",category:"soap"}, {name:6,amount:"900",brand:"red",category:"food"}, {name:7,amount:"89",brand:"red",category:"soap"}, {name:8,amount:"198",brand:"red",category:"food"}, {name:9,amount:"287",brand:"red",category:"soap"}, {name:10,amount:"568",brand:"red",category:"soap"}, {name:11,amount:"013",brand:"red",category:"food"}, {name:12,amount:"298",brand:"red",category:"food"}, {name:1,amount:"1000",brand:"blue",category:"soap"}, {name:2,amount:"200",brand:"blue",category:"soap"}, {name:3,amount:"3500",brand:"blue",category:"food"}, {name:4,amount:"2200",brand:"blue",category:"soap"}, {name:5,amount:"5780",brand:"blue",category:"soap"}, {name:6,amount:"9000",brand:"blue",category:"food"}, {name:7,amount:"890",brand:"blue",category:"soap"}, {name:8,amount:"1980",brand:"blue",category:"food"}, {name:9,amount:"2870",brand:"blue",category:"soap"}, {name:10,amount:"5680",brand:"blue",category:"soap"}, {name:11,amount:"0130",brand:"blue",category:"food"}, {name:12,amount:"2980",brand:"blue",category:"food"}]; private var __hAxisData : Array = [{name:1}, {name:2}, {name:3}, {name:4}, {name:5}, {name:6}, {name:7}, {name:8}, {name:9}, {name:10}, {name:11}, {name:12}]; ]]> </mx:Script> <mx:LineChart id="myLineChart" dataProvider="{__alteredData}" width="100%" height="100%" showDataTips="true"> <mx:horizontalAxis> <mx:CategoryAxis dataProvider="{__alteredData}" categoryField="name"/> </mx:horizontalAxis> <mx:verticalAxis> <mx:LinearAxis maximum="10000"/> </mx:verticalAxis> </mx:LineChart> </mx:Application> -- Flexcoders Mailing List FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com Yahoo! Groups Links <*> To visit your group on the web, go to: http://groups.yahoo.com/group/flexcoders/ <*> Your email settings: Individual Email | Traditional <*> To change settings online go to: http://groups.yahoo.com/group/flexcoders/join (Yahoo! ID required) <*> To change settings via email: mailto:[EMAIL PROTECTED] mailto:[EMAIL PROTECTED] <*> To unsubscribe from this group, send an email to: [EMAIL PROTECTED] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/

