tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
1022
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Nanatsusaia Nanatsusaia ist offline Grünschnabel
    Registriert seit
    Nov 2008
    Beiträge
    2
    Hallo Allerseits.
    wie soviele hier suche ich auch Lösungen für das ein oder andere kleine aber entscheidenes Problem

    Also, ich habe ein seeehr klenies mxml welches eine .as-Datei aufruft. In diesem Actionscript wird eine XML eingelesen, welche Daten für mehrere Serien und Konfigurationsdaten für ein LineChart, ColumnChart und PieChart beinhaltet.
    Das gesamte Script zeig ich mal lieber nicht, ist mit 2000 LoC wohl ein wenig zu viele '. Kurzzusammenfassung vom Skript:
    Nachdem eine XML-Datei auf Fehler untersucht wurde, werden dynamisch mehrere Elemente wie VBox und Canvas u.s.w. erstellt. Anschließend werden je nachdem, welche Diagramme gewünscht sind (steht in der XML) diese erzeugt. In einer weiteren Methode "fülle ich die Diagramme mit den Wert aus der XML auf". Man kann dann im Flash durch anklicken von Bildern zwischen den einzelnen Diagrammen hin und her schalten.
    Das zur Grundidee des Progs.

    Nun zu meinem Problem: Für jede Serie erstelle ich im Line-/ColumnChart eine separate y-Achse (erste links, zweite rechts, dritte links, ...). Das funktioniert auch soweit gut. Die min- und maxWerte der einzelnen y-Achsen sind gleich der Min-und MaxWerte der zugehörigen Serien. Wenn ich nun aber eine (oder mehrere) Serie habe mit negativen Werten, dann möchte ich gerne die Nulllinie auf allen y-Achsen auf der selben Höhe haben. Denn sonst ist die Anzeige sehr verschoben (eine Serie beginnt "unten" die andere mitten im Diagramm), sodass man Mühe hat die Werte richtig zu verstehen.
    Der Codeteil für das bisherige LineChart as Bsp:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    
    // datenausgabe ist die verwendete XML
     
     
    private function TabellenMitWertenAuffuellen(y:String):void{
                        /* In dieser Funktion werden die Diagramme mit Werten aus der XML gefüllt */
        var tmp1:Array = Lchart.series;
        var tmp2:Array = Cchart.series;
                        // Dieses Arrays werden mit den Serien der Diagramme gefüllt um anschließend den Diagrammen hinzugefügt. 
        var VertikalStellung:Number = 0;
                        // HilfsVariable: Hier wird sich gemerkt, ob eine vertikale Achse Links oder Rechts postiert wird. 
        var hAxisDate:DateTimeAxis = new DateTimeAxis();
                        // DateTimeAxis wird verwendent, wenn die Horizontale Achse eine Datumsachse sein soll.
        var hAxisCategory:CategoryAxis = new CategoryAxis();
                        // CategoryAxis wird verwendent, wenn die Horizontale Achse Zahlen oder Strings anzeigen sein soll.
        var SerienName:Array = new Array();
                        // HilfsArray, in der die Namen der einzellnen Serien der Reihenfolge nach gespeichert werden.
        var l:Number = new Number();
                        // HilfsVariable für Styles 
        for ( var i:Number = 0; i < SerienAnzahl; i++ ) {
                        // Merkt sich die Namen der Serien für den "displayName".
            SerienName[i] = datenausgabe.data.series[i].@name;
        }
        if ( xAchsenType_art == "date" ) {
                        // Wenn die Horizontalachse vom Type "date" ist, wird hier die hAxisDate formatiert.
            if ( dateformat_sollGeaendertWerden == true ) {
                        // In der Funktion FormatDate wird das Datum nach der im XML angegebenen Art formatiert.
                hAxisDate.labelFunction = FormatDate;
            }
            hAxisDate.dataUnits = "days";
            hAxisDate.labelUnits = "days";
            if ( datenausgabe.data.series[laengsteSerie].item.length() <= 10 ) {
                hAxisDate.alignLabelsToUnits = false;
            }
            else {
                hAxisDate.alignLabelsToUnits = true;
            }
            if ( achsenName_sollAngezeigtWerden == true ) {
                        // Hier wird die Achsenüberschrift zugewiesen, wenn sie erwünscht ist
                hAxisDate.title = datenausgabe.configuration.axis_name.x;
            }
        }
        if ( ( yAchsenType_art == "number" ) || ( yAchsenType_art == "text" ) ) {
                        // Wenn die Horizontalachse vom Type "number" oder "text" ist, wird hier die hAxisCategory formatiert.
            if ( achsenName_sollAngezeigtWerden == true ) {
                hAxisCategory.title = datenausgabe.configuration.axis_name.x;
            }
        }
     
        /* -- Horizontalachsenstyle -- */
                        // Hier wird das Style der Horizontalachse geändet
        if ( ( style_horizontalAchseFarbe_sollGeaendertWerden == true ) || ( style_horizontalAchseBreite_sollGeaendertWerden == true ) ) {
            var axisr:AxisRenderer = new AxisRenderer();
                var axisStorke:Stroke = new Stroke();
                if ( style_horizontalAchseFarbe_sollGeaendertWerden == true ) {
                    axisStorke.color = datenausgabe.configuration.style.horizontalachse.color;
                }
                if ( style_horizontalAchseBreite_sollGeaendertWerden == true ) {
                    axisStorke.weight = datenausgabe.configuration.style.horizontalachse.weight;
                }
                axisr.setStyle('axisStroke', axisStorke);
                axisr.setStyle('originStroke', axisStorke);
            axisr.setStyle("canDropLabels", "true");
                        // canDropLabels: alle Daten (jedes Datum) angezeigt werden, oder nur Teile 
            axisr.placement="bottom";
                        // Wo soll die Horizontalachse stehen. Top, Bottom etc.
            axisr.setStyle("tickPlacement", "none");
                        // tickPlacement: Striche der Horizontalachse innen oder außen oder aus (none)
            axisr.axis = hAxisDate;
            if ( xAchsenType_art == "date" ) {
                axisr.axis = hAxisDate;
            }
            else {
                axisr.axis = hAxisCategory;
            }
        }
     
     
        /* - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - */
        /* - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - */
        /* - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - LINE - */
     
        if ( y == "line" ) {
                        // Hier wird ein Liniendiagramm mit Werten gefüllt.
            Lchart.dataProvider = datenausgabe.data;
        
        /* -- Horizontalachse -- */
            if ( xAchsenType_art == "date" ) {
                        // Wenn die Horizontalachse vom Type "date" ist, verwendet Lchart die hAxisDate .
                Lchart.horizontalAxis = hAxisDate;
            }
     
            if ( ( xAchsenType_art == "number" ) || ( xAchsenType_art == "text" ) ) {
                        // Wenn die Horizontalachse vom Type "number" oder "text" ist, verwendet Lchart die hAxisCategory.
                hAxisCategory.dataProvider = datenausgabe.data.series[laengsteSerie].item.x;
                Lchart.horizontalAxis = hAxisCategory;
            }
            if ( ( style_horizontalAchseFarbe_sollGeaendertWerden == true ) || ( style_horizontalAchseBreite_sollGeaendertWerden == true ) ) {
                Lchart.horizontalAxisRenderers = [axisr];
            }
     
            for (var j:Number=0; j<SerienAnzahl; j++) {
                        // In dieser Schleife wird jede Serie und deren Achsen einzelln dem Array hinzugefügt.
     
        /* -- Vertikalachse -- */
                var lSvAxis:LinearAxis = new LinearAxis;
                lSvAxis.labelFunction = FormatDecimal;
                var lSSerienItemLaenge:Number = datenausgabe.data.series[j].item.length();
                var lSmax:Number = 0;
                        // Größter Wert der Vertiaklachse
                var lSmin:Number = 0;
                        // Kleinster Wert der Vertiaklachse
                var lSHilfsVari:Number = 0;
                for (var n:Number=0; n<lSSerienItemLaenge; n++) {
                        // Suchen der größten und kleinsten Werte für die Vertikalachse.
                    if ( lSmax <= datenausgabe.data.series[j].item[n].y ) {
                        lSmax = datenausgabe.data.series[j].item[n].y;
                    }
                    if ( lSHilfsVari == 0 ) {
                        lSHilfsVari = 1;
                        lSmin = datenausgabe.data.series[j].item[n].y;
                    }
                    else {
                        if ( lSmin >= datenausgabe.data.series[j].item[n].y) {
                            lSmin = datenausgabe.data.series[j].item[n].y;
                        }
                    }
                }
                if ( diagrammbeginntBeiNull == true ) {
                            // Falls es gewünscht wird, dass das Diagramm immer bei Null beginnen soll, wird dies hier gesetzt. 
                    lSmin = 0;
                }
                else {
                    if ( lSmin == lSmax ) {
                            // Falls der größte Wert gleich dem Kleinsten ist, wird das Diagramm automatisch auf Start 0 gesetzt.
                        lSmin = 0;
                    }               
                }
                lSvAxis.maximum = lSmax;
                lSvAxis.minimum = lSmin;
                if ( ( achsenName_sollAngezeigtWerden == true ) && ( j == 0 ) ) {
                        // Hier die vertikale Achsenüberschrift einmal (!) zugewiesen, wenn sie erwünscht ist. Eventuell auch als heightletter.
                    lSvAxis.title = datenausgabe.configuration.axis_name.y;
                }
     
        /* -- Vertikalachsenstyle -- */
                var lSVAxisRenderer:AxisRenderer = new AxisRenderer();
                lSVAxisRenderer.axis = lSvAxis;
     
                lSVAxisRenderer.setStyle("verticalAxisTitleAlignment", "vertical");
                if (VertikalStellung == 0) {
                        // Vertikalachse links oder rechts setzen.
                    lSVAxisRenderer.placement = "left";
                    VertikalStellung = 1;
                }
                else {
                    lSVAxisRenderer.placement = "right";
                    VertikalStellung = 0;
                }
                lSVAxisRenderer.setStyle("labelGap", 1);
                        // Abstand zwischen Vertikalachse und deren Beschriftung.
                for (l = 0; l<datenausgabe.configuration.style.series_style.serie.length(); l++) {
                    if ( style_serieVertikalAchsenFarbe_sollGeaendertWerden2[l] == SerienName[j] ) {
                        var s1:Stroke = new Stroke();
                        s1.color = datenausgabe.configuration.style.series_style.serie[l].verticalachse.color;
                        lSVAxisRenderer.setStyle("axisStroke", s1);
                    }
                    if ( style_serieVertikalAchsenSchriftFarbe_sollGeaendertWerden2[l] == SerienName[j] ) {
                        lSVAxisRenderer.setStyle("color", datenausgabe.configuration.style.series_style.serie[l].verticalachse.font.fontcolor);
                    }
                    if ( style_serieVertikalAchsenSchriftGroesse_sollGeaendertWerden2[l] == SerienName[j] ) {
                        lSVAxisRenderer.setStyle("fontSize", datenausgabe.configuration.style.series_style.serie[l].verticalachse.font.fontsize);
                    }
                    if ( style_serieVertikalAchsenSchriftFamilie_sollGeaendertWerden2[l] == SerienName[j] ) {
                        lSVAxisRenderer.setStyle("fontFamily", datenausgabe.configuration.style.series_style.serie[l].verticalachse.font.fontfamily);
                    }
                    if ( style_serieVertikalAchsenSchriftBreite_sollGeaendertWerden2[l] == SerienName[j] ) {
                        lSVAxisRenderer.setStyle("fontWeight", datenausgabe.configuration.style.series_style.serie[l].verticalachse.font.fontweight);
                    }
                }
                Lchart.verticalAxisRenderers.push(lSVAxisRenderer);

    Nächter Post gehts weiter
     

  2. #2
    Nanatsusaia Nanatsusaia ist offline Grünschnabel
    Registriert seit
    Nov 2008
    Beiträge
    2
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    
        /* -- Serienwerte -- */
                        // Der aktuellen Serie werden die Werte zugewiesen
                var lS:LineSeries = new LineSeries();
                lS.dataProvider = datenausgabe.data.series[j].item;
                lS.xField = "x";
                lS.yField = "y";
                lS.displayName = SerienName[j];
     
        /* -- Serienstyle -- */
                lS.interpolateValues = true;
                lS.setStyle("form","segment");
                for (l = 0; l<datenausgabe.configuration.style.series_style.serie.length(); l++) {
                    if ( style_serieFarbe_sollGeaendertWerden2[l] == SerienName[j] ) {
                        // Mit lineStroke1 ist die Hauptfarbe und die Breite der Kurve angegeben. Die Daten erhält die Vari direkt aus dem XML.
                        var lineStroke1:Stroke = new Stroke();
                        lineStroke1.color = datenausgabe.configuration.style.series_style.serie.(@name == SerienName[j]).color;
                        lS.setStyle("lineStroke",lineStroke1);
                    }
                }
     
        /* -- Hinzufügen der Serie -- */
                lS.verticalAxis = lSvAxis;
                tmp1.push(lS)
                Lchart.series = tmp1;
            }
        }
     
        .
        .
        .
        // Hier stehen nun die anderen Diagramme
        .
        .
    }

    Wie kann ich nun also das LineChart so formatieren, dass die Nulllinie auf der selben Ebene (bzw. Höhe) ist, aber die Min- und MaxWerte für jede y-Achse dennoch gleich dem Min- und MaxWerten Serie sind?

    Darüberhinaus habe ich noch das eine oder andere Problem:

    - Wie kann ich die Schrift der Legende dynamisch ändern? Ich habe es über LegendItem versucht. Habe diesem via .setStyle(...) neue Werte gegeben und mit leg.addChild(legItem); der Legende übergeben wollen. Aber irgendwie geht das nicht o.O.
    - Genauso macht mir das Formatieren der Achsenüberschrift (z.B. hAxisDate.title ) sorgen. Bisher weis ich nicht, wie man diese dynamisch ändern kann und habe es über feste Werte in der MXML mit <mx:Style>..CSScode..</mx:Style> gemacht. Aber eigentlich sollte das auch dynmaisch gemacht werden.
    - Außerdem funktioniert (wieso auch immer) das Rotieren der y-Achsenbeschriftung nicht und ich weis nicht wieso? Bisher habe ich es immer über mit dem Befehl lSVAxisRenderer.setStyle("rotation", 45); probiert, und es hat nie funktioniert. Kann mir da jemand einen ratschlag geben?


    So, dass wars aber fürs erste. Ich würde mich riesig freuen wenn mir jemand ein paar Ratschläge für mein Problem (vorallem mein Hauptprob mit der 0-Linie) geben könnte


    Grüße
    Nana
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 25.11.09, 09:05
  2. Xpresso > Höhe von mehreren Objekten ändern
    Von digital art im Forum Cinema 4D
    Antworten: 5
    Letzter Beitrag: 14.11.08, 15:37
  3. nach mehreren verschiedenen Attributen in einer Spalte suchen
    Von NiciB im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 08.08.06, 14:49
  4. Antworten: 1
    Letzter Beitrag: 12.06.05, 02:01
  5. 2 Tabellen aber Spalten mit selber breite
    Von xbtequila im Forum HTML & XHTML
    Antworten: 2
    Letzter Beitrag: 10.02.05, 14:36