Diagramm Y-Achse richtig einteilen, brauche hilfe!



  • Hallo,
    ich sitze hier irgendwie schon ewig vor diesem Problem, ich wollte mir eine Klasse schreiben, mit der ich ein einfaches Linien-Diagramm darstellen lassen kann. Aber es schleift bei mir bei der Frage, wie lasse ich die Einteilung fuer die Y-Achse richtig bzw. klever berechnen?

    Ich habe schon versucht von MS Excel irgendwelche Ideen zubekommen, wie das da gemacht wird und habe mir ein paar Diagramme gebaut und mit den Werten herum gespielt, aber ehrlich gesagt bin ich kein bischen schlauer.

    Ich habe eine Methode der Klasse die liefert mir den höchsten Wert fuer die Y-Achse aller Graphen die in das Diagramm gezeichnet werden sollen. Doch weiter komm ich auch nicht. Sagen wir mal ich gehe von aus das ich meine Y-Achse standart gemäß immer in 5Punkten unterteilen will und ich habe den höchsten Wert 34149 oder 0.123, das durch 5 ergibt nur 1423563 sone Zahlen ich haette sie aber gern wie in MS Excel, wenn ich also 1245 habe, das die Punkte so aussehen: 250/500/750/1000/1250/1500 sprich wenns nicht ganz reicht das er einen Punkt dazu nimmt.

    Ich brauch hier echt mal nen bissel hilfe und hoffe ihr koennt mir hier helfen.

    Gruß Tobi.



  • Wenn du 10 Markierungen an der Y-Achse hast und dein höchster Wert 5365 ist, dann nimmst du eben 5365/(10-1) = 561,11 als Einteilung. Nimm vielleicht noch ein paar Prozent dazu, damit dir dein Graph nicht direkt an die Decke stößt. Wenn du keine "krummen" Einteilungen möchtest, musst du sie noch dem Bereich entsprechend auf 0.5er, 1er, 2er, 5er... aufrunden.

    Edit: deine Frage bezog sich wohl hauptsächlich auf den letzten Punkt.

    int anzahlabschnitte=5;
    double hoechsterpunkt=6;
    double ykrumm=hoechsterpunkt/(anzahlabschnitte-1)*1.1,ybesser;
    for (int i=0;i<14;++i)
    {
      for (int j=0;j<3;++j)
      {
        ybesser=(j ? (j==1 ? 2 : 5) : 1)*pow(10,i-5);
        if (ybesser>=ykrumm)
        {
          i=999;
          break;
        }
      }
    }
    

    Das geht möglicherweise auch eleganter, aber ein Ansatz wäre es 😉



  • Sorry aber irgendwie blick ich da bei dir gerade nicht wirklich durch.
    - Wieso i < 14?
    -Wieso j < 3?

    ybesser=(j ? (j==1 ? 2 : 5) : 1)*pow(10,i-5);
    if (ybesser>=ykrumm)
    {
    i=999;
    break;
    }

    check ich au net ganz?!

    Kannste es evtl. noch mal fuer Dumme wiederholen was du da meinst?

    Gruß Tobi.



  • Alles klar, ich habs selber gelöst. hehe.. eigentlich gar nicht mal so schwer.
    Wens interessiert hier meine Lösung:

    long highestValue = m_GetHighestValue( );
        long steps = 0;
        int iNull = 1;
        char szBuffer[ 64 ];
             szBuffer[ 0 ] = 0;
    
        // ***** 1. Get step size *****
        steps = highestValue / ( m_iYMarks - 1 );
    
        sprintf( szBuffer, "%d", steps );
    
        for( int i = 0; i < (int)( strlen( szBuffer ) - 1 ); i++ ) {
    
            iNull *= 10; // Nullstellen der Zahl ermitteln( 1, 10, 100, 1000 ... )
        }
    
        szBuffer[ 1 ] = '\0';       // Die Nullstelen mal die erste Ziffer der Zahl
        iNull *= atoi( szBuffer );  // schon hat man die Weiten
        steps = iNull;
    

    Trotzdem danke,

    Gruß Tobi.


Anmelden zum Antworten