AllesMeins: Skala bestimmen

Hiho,

ich bräuchte mal eure Hilfe, denn irgendwie sehe ich im Moment den Wald vor lauter Bäumen nicht. Folgendes Problem:

Ich habe eine Hand voll Daten die ich in ein Diagramm eintragen möchte. Dazu muss ich nun aber zuvor eine sinnvolle Skala zeichnen die diesen Daten in maximal 15 Einträgen entspricht. Ich denke das Problem lässt sich am besten an einem beispiel erlklären:

Sagen wir ich hätte die Daten 5, 14, 67, 98, 145. In diesem Fall wäre es sinnvoll eine Skala mit den einträgen 0, 10, 20 ... 150 zu erzeugen. Habe ich nun aber die Daten 1450, 1672, 1898, 2756 wäre es sinnvoll eine Skala vielleicht von 1400 anfangen zu lassen und dann in hunderter Schritten bis 2900 zu gehen. Ich denke die Problematik ist klar.

Rein mathematisch wäre es ja kein Problem irgend eine Skala zu erzeugen, aber das Ding soll irgendwie menschlich gut lesbar sein (also möglichst glatte Werte mit vielen Nullen am Ende) und nicht aus 17,896 und 29,54423 bestehen.

Hat irgendwer eine Idee für einen effektiven Algorithmus, der sich den passenden Anfangswert (eine glatte Zahl unter dem niedrigsten Wert) sucht [der niedrigste und der höchste wert sind bekannt, muss also nicht erst ermittelt werden] und eine sinnvolle gleichmässige Skala bis zum höchsten Wert bastelt? Mir fällt nämlich absolut keine gute Lösung dafür ein. Falls irgendwer eine Idee hat (entweder in einem Pseudocode, ausformuliert oder von mir aus auch in irgendeiner Programmier-Sprache - gerne PHP aber die meisten anderen sind mir auch Recht, solange es kein Brainfuck ist) wäre ich froh wenn ihr mir nen Hinweis geben könntet.

Grüsse

Marc

  1. Hi,

    ich bräuchte mal eure Hilfe, denn irgendwie sehe ich im Moment den Wald vor lauter Bäumen nicht. Folgendes Problem:

    Ich habe eine Hand voll Daten die ich in ein Diagramm eintragen möchte. Dazu muss ich nun aber zuvor eine sinnvolle Skala zeichnen die diesen Daten in maximal 15 Einträgen entspricht. Ich denke das Problem lässt sich am besten an einem beispiel erlklären:

    Sagen wir ich hätte die Daten 5, 14, 67, 98, 145. In diesem Fall wäre es sinnvoll eine Skala mit den einträgen 0, 10, 20 ... 150 zu erzeugen. Habe ich nun aber die Daten 1450, 1672, 1898, 2756 wäre es sinnvoll eine Skala vielleicht von 1400 anfangen zu lassen und dann in hunderter Schritten bis 2900 zu gehen. Ich denke die Problematik ist klar.

    wenn ich Dich richtig verstehe, versuchst Du zu verstehen, was "Skalierung" bedeutet, oder?
    Eigentlich kinderleicht:

    Schrittweite = (Max_Wert - Min_Wert) / Schrittzahl

    Damit Du nicht 5 Nachkommastellen bekommst, rundest Du eben.

    Gruß
    Reiner

    1. Hi,

      Damit Du nicht 5 Nachkommastellen bekommst, rundest Du eben.

      in C / C++ gibt es den typcast-Operator. Aus der float-Variable 16543.453 wird damit z.b. die int-Variable 16543.
      Um nun noch eine ordentliche Schrittweite zu erhalten könntest du folgendes rechnen:

      int zahl = 1;
      for (int i = 1; i < strlen((char)Schrittweite)); i++) //statt i = 1 geht auch i = 2, kommt auf die Genauigkeit an, die du brauchst...
         zahl *= 10;
      Schrittweite -= Schrittweite % zahl;

      Im Beispiel sähe das so aus:

      Schrittweite = 16543 - Rest von (16543 / 10000)
      Schrittweite = 16543 - 6543
      Schrittweite = 10000

      Bei i = 2 wäre die Schrittweite 16000...

      Ich hoffe, da ist kein Fehler drin. Ist schon ziemlich spät.

      MfG Hopsel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
  2. Moin!

    Sagen wir ich hätte die Daten 5, 14, 67, 98, 145. In diesem Fall wäre es sinnvoll eine Skala mit den einträgen 0, 10, 20 ... 150 zu erzeugen. Habe ich nun aber die Daten 1450, 1672, 1898, 2756 wäre es sinnvoll eine Skala vielleicht von 1400 anfangen zu lassen und dann in hunderter Schritten bis 2900 zu gehen. Ich denke die Problematik ist klar.

    Rein mathematisch wäre es ja kein Problem irgend eine Skala zu erzeugen, aber das Ding soll irgendwie menschlich gut lesbar sein (also möglichst glatte Werte mit vielen Nullen am Ende) und nicht aus 17,896 und 29,54423 bestehen.

    Die Messwerte 0,045, 0,065, 0,032 und 0,048 sind aber kaum ohne Nachkommastellen einzutragen. :)

    Aber zum Problem: Irgendeine Art von Flexibilität brauchst du zwingend. Wenn du Schrittweiten von 100 für die Skalenstriche als notwendig für eine Messwertreihe ermittelt hast (weil dir 117,356 als Schrittweite blöd erscheint), dann bedeutet das, dass nicht immer zwingend 15 Skalenstriche gesetzt werden können.

    Mal so ganz zum allgemeinen Vorgehen:
    Aus den Werten ist das Maximum und Minimum zu ermitteln. Das sind wahrscheinlich krumme Werte.

    Die Differenz dieser Werte ergibt den mindesten Skalenumfang. Und anhand dieser Differenz und der möglichen/gewünschten Skalenteilung (10 bis 15 Stück) kann man schon ungefähr errechnen, wo die Skala denn tatsächlich beginnen und enden soll. Du benötigst aber an dieser Stelle irgendeine manuelle Festlegung, welche erlaubten Skalenschritte es denn nun sein sollen. Also beispielsweise "1, 2, 5", wobei das auch für 10er, 20er, 50er, 100er, 200er, 500er-Schritte stehen kann. Natürlich kannst du auch nur "1" festlegen und erhälst dann eben nur 10er, 100er, 1000er (oder 0,1er, 0,01er)-Schritte - das macht dann die Skalenteilung aber evtl. etwas unhandlicher.

    Grundlage: Angestrebte Skalenstriche 10 bis 15 Stück, erlaubte Schrittweiten "1, 2, 5" in den entsprechenden Zehnerpotenzen.

    Dein Zahlenbeispiel 1:
    5, 14, 67, 98, 145 -> MIN: 5, MAX: 145, Diff: 140

    Mit den minimalen und maximalen Skalenstrichen kommt als Schrittweite minimal und maximal 14 (140/10 Skalenstriche) bzw. 9,3333 (140/15 Skalenstriche) heraus. Das bedeutet: Die Schrittweite 10 liegt hier im Bereich des möglichen.

    Der Minimalwert 5 wird abgerundet auf den nächsttieferen Wert, der Maximalwert 145 wird aufgerundet, jeweils auf einen Wert, der ein Vielfaches der Schrittweite 10 ist: 5 -> 0, 145 -> 150. Und schon liegen die Skalendaten fest:
    Min: 0, Max: 150, Schrittweite 10, Skalenstriche: 15 (könnte übrigens sein, dass bei grenzwertigen Daten 16 Skalenstriche entstehen).

    Dein Zahlenbeispiel 2:
    1450, 1672, 1898, 2756 -> MIN: 1450, MAX: 2756, Diff: 1306
    10 Skalenstriche: 130,6 Schrittweite, 15 Skalenstriche: 87,33 Schrittweite. Die Schrittweite wäre also "100", dadurch der Beginn bei 1400, das Ende bei 2800, die Zahl der Striche 14.

    Mein Zahlenbeispiel:
    0,045, 0,065, 0,032 und 0,048 -> MIN: 0,032, MAX: 0,065, Diff: 0,033
    10 Skalenstriche: 0,0033 Schrittweite, 15 Skalenstriche: 0,0022 Schrittweite
    Und schon gibts ein Problem, weil 0,005 als Schrittweite zu groß, 0,002 aber zu klein ist, um in 10 bis 15 Teilstrichen abgebildet zu werden. Entweder nimmt man weniger Teilstriche und 0,005 als Schrittweite (die Skala ginge dann von 0,030 bis 0,070 und hätte 8 Striche), oder man passt die möglichen Schrittweiten an auf 1, 2,5, 5, dann wäre die Schrittweite 0,025 möglich.

    Tja, das ist eben das dumme an der Realität: Die Probleme halten sich selten an eine vorgegebene Lösung. :) Der Grund hier liegt darin, dass die gegebenen Parameter (10 - 15 Teilstriche, Schritte 1, 2 oder 5) nicht alle möglichen Wertemengen abdecken können. Wenn statt 15 Strichen aufgrund der Werte eher 16 Striche notwendig würden, müßte man eigentlich mit 8 Strichen und der doppelten Schrittweite arbeiten. 8 Striche sind aber nicht erlaubt, und auch die Schrittweiten sind nicht so dicht. Entweder man ist flexibler bei den Skalenstrichen, oder bei den Schrittweiten.

    • Sven Rautenberg