Гибкая диаграмма с несколькими осями Y показывает неправильное горизонтальное начало - PullRequest
0 голосов
/ 16 июля 2010

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

Может быть, это потому, что я не сказал GridLines, какую ось использовать в качестве источника?Но я не уверен, что это можно сделать ...

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

<?xml version="1.0" encoding="utf-8"?>
<s:Application 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:local="*" 
           height="450" 
           width="500" xmlns:components="components.*" xmlns:charts="components.charts.*">
<s:layout>
    <s:BasicLayout/>
</s:layout>

<fx:Declarations>
    <mx:ArrayCollection id="arrColl">
        <mx:source>
            <fx:Array>
                <fx:Object name="R Winn"    slg="445" avg="0.300" />
                <fx:Object name="P Feliz"   slg="418" avg="-0.253" />
                <fx:Object name="O Vizquel" slg="316" avg="0.246" />
                <fx:Object name="B Molina"  slg="433" avg="-0.276" />
                <fx:Object name="R Durham"  slg="343" avg="0.218" />
            </fx:Array>
        </mx:source>
    </mx:ArrayCollection>       
</fx:Declarations>

<mx:ColumnChart 
             showDataTips="true"
             dataProvider="{arrColl}"
             width="100%"
             height="100%">

    <mx:backgroundElements>
        <mx:GridLines id="grid1"
                      gridDirection="both"
                      horizontalShowOrigin="true">
            <mx:horizontalOriginStroke>
                <s:SolidColorStroke color="red" weight="3" alpha="1" /> 
            </mx:horizontalOriginStroke>
        </mx:GridLines>
    </mx:backgroundElements>

    <mx:verticalAxisRenderers>
        <mx:AxisRenderer placement="left" axis="{axis1}" />
        <mx:AxisRenderer placement="right" axis="{axis2}" />
    </mx:verticalAxisRenderers>

    <mx:horizontalAxis>
        <mx:CategoryAxis categoryField="name"/>
    </mx:horizontalAxis>

    <mx:series>
        <mx:ColumnSeries yField="avg" xField="name">
            <mx:verticalAxis>
                <mx:LinearAxis id="axis1"/>
            </mx:verticalAxis>
        </mx:ColumnSeries>
        <mx:LineSeries yField="slg" xField="name">
            <mx:verticalAxis>
                <mx:LinearAxis id="axis2"/>
            </mx:verticalAxis>
        </mx:LineSeries>
    </mx:series>
</mx:ColumnChart>

</s:Application>

1 Ответ

1 голос
/ 04 марта 2011

Вы должны расширить класс GridLines, такой как AxisRendererGridLines, и переопределить метод updateDisplayList.Найдите код ниже и удалите / прокомментируйте его

if (horizontalShowOrigin && cache[0].y > 0 && cache[0].y < unscaledHeight) { originStroke=getStyle("horizontalOriginStroke"); originStroke.apply(g, null, null); g.moveTo(0, cache[0].y - sWidth / 2); g.lineTo($width, cache[0].y - sWidth / 2); }

и добавьте код, подобный приведенному ниже

var _verticalAxisRenderer:IAxisRenderer;

            if (!(CartesianChart(chart).verticalAxisRenderers) || CartesianChart(chart).verticalAxisRenderers.length == 0)
            {
                _verticalAxisRenderer=CartesianChart(chart).getLeftMostRenderer();
                if (!_verticalAxisRenderer)
                    _verticalAxisRenderer=CartesianChart(chart).getRightMostRenderer();
            }
            else
                verticalAxisRenderer=CartesianChart(chart).verticalAxisRenderers[0];


            var _axisHeight:Number=unscaledHeight;
            var _minor_ticks:Array=(verticalAxisRenderer as AxisRenderer).minorTicks;
            var _max:Number=((verticalAxisRenderer as AxisRenderer).axis as LinearAxis).maximum;
            var _min:Number=((verticalAxisRenderer as AxisRenderer).axis as LinearAxis).minimum;
            var _zero_radio:Number=_max / (_max - _min);

            var _index_mt:int;

            for (var k:int=0; k < _minor_ticks.length - 1; k++)
            {
                if (_zero_radio >= _minor_ticks[k] && _zero_radio <= _minor_ticks[k + 1])
                {
                    if ((_zero_radio - _minor_ticks[k]) <= (_minor_ticks[k + 1] - _zero_radio))
                    {
                        _index_mt=k;
                    }
                    else
                    {
                        _index_mt=k + 1;
                    }
                    break;
                }
            }
            originStroke=getStyle("horizontalOriginStroke");
            originStroke.apply(g, null, null);
            g.moveTo(0, _minor_ticks[_index_mt] * _axisHeight);
            g.lineTo($width, _minor_ticks[_index_mt] * _axisHeight);

Я попробовал это и хорошо работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...