惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
I
InfoQ
D
Docker
F
Fortinet All Blogs
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
月光博客
月光博客
B
Blog
Engineering at Meta
Engineering at Meta
T
Tailwind CSS Blog
罗磊的独立博客
博客园_首页
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog RSS Feed
IT之家
IT之家
V
V2EX

博客园 - 剑廿三

AirExcel -用于导出 Excel 2007 文件的 Flex AIR 组件 初版发布 Flex SQLite Batch Insert Datas from Array Flex 遍历 ArrayCollection, Array Flex SQLite: 一次执行多个SQL,查询两个表的数据,导入datagrid Flex AIR SQLite Flex AIR: 使用透明 NativeWindow 窗体呈现 Line Chart 的一个 bug (Exception in CartesianChart/updateMultipleAxesStyles) Flex AIR:用 mx:Image 实现的动态图片按钮 Flex AIR:Line Chart 示例-用 XML 画图表很简单 Flex: 抓取网页,通过 XML 获取部分内容 Flex: 通过 DataGrid 操作 XML 文件 PSP 使用 Web FTP (JSP, on EeeBox) 的两项设定 PS3 的 UserAgent PSP2000 的 UserAgent Windows Vista Ultimate 上基于 IE7 的 Maxthon 2.1.5 的 UserAgent OEM正版Windows Vista Home Premium上的 IE8 的 UserAgent EeeBox B202 上基于 Windows XP Pro SP2 的 IE7 的 UserAgent EeeBox B202上基于 Windows XP Pro SP2 IE7 的 Maxthon 2.1.5 的 UserAgent OEM正版Windows Vista Home Premium上的 Firefox 3.5.5 中文版的 UserAgent OEM正版Windows Vista Home Premium上基于IE8的 Maxthon 2.5.9 的 UserAgent
Flex AIR:Line Chart 示例-从 XML 原始数据运算得出增长率图表
剑廿三 · 2010-06-14 · via 博客园 - 剑廿三

从 XML 原始数据运算得出增长率图表,主要方法是遍历 XML 子节点。通过 reverse() 函数还可以先把 XML 倒序排列,便于以不同角度观察数据。

效果如下图:

ChartTest.mxml 内容如下:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s
="library://ns.adobe.com/flex/spark" 
                       xmlns:mx
="library://ns.adobe.com/flex/mx"
                       xmlns:flexlib
="http://code.google.com/p/flexlib/"
                       creationComplete
="init()"
                       width
="800" height="450" >
    
<fx:Declarations>
        
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
    
</fx:Declarations>
    
<fx:Script>
        
<![CDATA[
            import mx.charts.HitData;
            import mx.charts.series.items.LineSeriesItem;
            
            /**
             * XML 数据源。
             */
            private var xml:XML = 
                <data>
                    <stock>
                        <term>Season 1</term>
                        <value1>10</value1>
                        <value2>40</value2>
                    </stock>
                    <stock>
                        <term>Season 2</term>
                        <value1>20</value1>
                        <value2>30</value2>
                    </stock>
                    <stock>
                        <term>Season 3</term>                
                        <value1>25</value1>
                        <value2>35</value2>
                    </stock>
                    <stock>
                        <term>Season 4</term>                
                        <value1>50</value1>
                        <value2>25</value2>
                    </stock>
                </data>;
            
            /**
             *  AIR 主窗口初始化,为 Line Chart 绑定数据源。
             */
            protected function init():void
            {                
                this.ctLine.dataProvider = this.xml.children();
                this.calcIncrement(this.xml);
                this.ctLineIncrease.dataProvider = this.xml.children();
            }

            /**
             * 令 XML 数据源倒序排列。
             * 
             * 用法:
             * var result:XML = &lt;data&gt;&lt;/data&gt;;
             * result = this.reverse(this.xml, result);
             * 
             * @param source XML 数据源。
             * @param root 倒序排列后的 XML 结果,须传入一个顶层节点,以便遍历数据源子节点后依次添加到此顶层节点。
             * 
             * 
             * 
             */
            private function reverse(source:XML, root:XML):XML
            {
                var list:XMLList = source.children();
                for(var i:int=list.length()-1;i>-1;i--)
                {
                    root.appendChild(list[i]);
                }
                return root;
            }
            
            /**
             * 计算 XML 数据源中前后两个 value 节点的值的增长率,储存到 increase 节点。
             * @ram source XML 数据源
             */
            private function calcIncrement(source:XML):void
            {
                var list:XMLList = source.children();
                for(var i:int=list.length()-1;i>-1;i--)
                {
                    if(i>0)
                    {
                        var next:XML = list[i];
                        var prior:XML = list[i-1];
                        var increase1:Number = Number((next.value1 - prior.value1))/Number(prior.value1);
                        next.increase1 = increase1;
                        
                        
                        var increase2:Number = Number((next.value2 - prior.value2))/Number(prior.value2);
                        next.increase2 = increase2;
                    }
                    else
                    {
                        list[i].increase1 = 0;
                        list[i].increase2 = 0;
                    }
                    trace(list[i].value1 + " " + list[i].increase1 + "\t" + list[i].value2 + " " + list[i].increase2);
                }
            }
            
            /**
             * 原始数据 Line Chart 的数值提示
             */
            protected  function ctLine_dataTips(hd:HitData):String {   
                var curObj:Object = hd.item;   
                var curSeries:LineSeries = LineSeries(hd.chartItem.element); // 获得当前的Series 
                var value:Number = Number((hd.chartItem as LineSeriesItem).yValue); // 获得当前指向的值
                return curObj.term + "\n" + curSeries.displayName + "\n = " + value;
            }  
            
            /**
             * 增长率 Line Chart 的数值提示
             */
            protected  function ctLineIncrease_dataTips(hd:HitData):String {   
                var curObj:Object = hd.item;   
                var curSeries:LineSeries = LineSeries(hd.chartItem.element); // 获得当前的Series
                var increase:Number = Number((hd.chartItem as LineSeriesItem).yValue); // 获得当前指向的值
                return curObj.term + "\n" + curSeries.displayName + "\n = " + Number(increase*100).toFixed(2) + "%";   
            }  

]]>
    
</fx:Script>
    
<!---
        呈现原始数据的 Line Chart
    
-->
    
<mx:LineChart x="80" y="60" width="300" height="300" id="ctLine" showDataTips="true" dataTipFunction="ctLine_dataTips">
        
<mx:series>
            
<mx:LineSeries displayName="Value 1" yField="value1"/>
            
<mx:LineSeries displayName="Value 2" yField="value2"/>
        
</mx:series>
        
<!---
            定义橫坐标的标题
        
-->
        
<mx:horizontalAxis>
            
<mx:CategoryAxis categoryField="term" title="Season"/>
        
</mx:horizontalAxis>
    
</mx:LineChart>
    
<!---
    呈现原始数据的 Line Chart 的图例
    
-->
    
<mx:Legend x="5" y="5" dataProvider="{ctLine}" id="ctLegendValue"/>
    
    
<!---
    呈现增长率的 Line Chart
    
-->
    
<mx:LineChart x="400" y="60" width="300" height="300" id="ctLineIncrease" showDataTips="true" dataTipFunction="ctLineIncrease_dataTips">
        
<mx:series>
            
<mx:LineSeries displayName="Increase Rate 1" yField="increase1"/>
            
<mx:LineSeries displayName="Increase Rate 2" yField="increase2"/>
        
</mx:series>
        
<!---
        定义橫坐标的标题
        
-->
        
<mx:horizontalAxis>
            
<mx:CategoryAxis categoryField="term" title="Season"/>
        
</mx:horizontalAxis>
    
</mx:LineChart>
    
<!---
    呈现增长率的 Line Chart 的图例
    
-->
    
<mx:Legend x="385" y="5" dataProvider="{ctLineIncrease}" id="ctLegendIncrease"/>
</s:WindowedApplication>