Rubrik: Grafik und Font · Sonstiges | VB-Versionen: VB4, VB5, VB6 | 28.11.04 |
Histogramm erstellen Dieser Tipp zeigt, wie ein Histogramm (Säulendiagramm) zur Darstellung von (meist stetigen) Häufigkeitsverteilungen erstellt werden kann. | ||
Autor: Malte Treckmann | Bewertung: | Views: 22.775 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Ein Histogramm ist ein Säulendiagramm zur Darstellung von (meist stetigen) Häufigkeitsverteilungen. Der nachfolgende Tipp zeigt, wie ein solches Diagramm erstellt werden kann. Dazu sind folgende Arbeitsschritte notwendig:
- Wertebereich festlegen
Damit die x-Achse skaliert werden kann, wird der Abstand zwischen der maximalen und dem minimalen Wert bestimmt.
- Klassengrenzen bestimmen
Ausgehend von der Anzahl der Klassen und der Breite einer Klasse werden die Grenzen festgelegt.
- Klassifizierung
Die Werte werden in die Klassen, die ja nun anhand der Klassengrenzen bekannt sind, einsortiert. Dazu werden zwei geschachtelte For-Schleifen verwendet. Die äussere iteriert durch alle Werte. Die innere Schleife prüft, beginnend bei der kleinsten Klassengrenze, in welche Klasse der aktuelle Wert der äusseren Schleife passt. Ist diese Klasse gefunden, wird die Gewichtung dieser Klasse erhöht und der nächste Wert geprueft.
- Berechnung der relativen Häufigkeiten
Da es sich im Histogramm um eine flächentreue Darstellung handelt, ist die Berechnung der relativen Häufigkeiten optional. Die Darstellung des Histogramms verändert sich dadurch nicht, sondern nur die Skalierung der y-Achse. Die Anzahl der Werte wird nun nicht mehr absolut, sondern in Prozent angegeben.
- Darstellung
Die Darstellung erfolgt in diesem Tipp im MSChart. Alternativ werden die absoluten Klassengewichtungen in einer Text-Datei gespeichert. Damit kann das Histogramm dann beispielsweise auch unter Excel oder Origin erzeugt werden.
Der Code:
' Aus einer Textdatei ("eingabe.txt") werden unsortierte ' (Mess-)werte eingelesen. Die Werte werden in eine zu ' wählende Anzahl von Klassen einsortiert. ' Dann erfolgt eine Darstellung der Klassenhäufigkeiten ' in einem Histogramm. Die Darstellung des Histogramms wird ' vom MSChart uebernommen. Gleichzeitig erfolgt eine Ausgabe ' der absoluten Klassenhäufigkeiten in eine Textdatei ' ("ausgabe.txt"). ' ' Benötigt werden: ' 1 Form ' 1 CommandButton ' 1 TextBox (für die Vorgabe der Klassenanzahl) ' 1 MSChart ' 1 ListBox ' 1 CheckBox (relative oder absolute Häufigkeit)
Private Sub Command1_Click() Dim wert() As Double Dim KlassenGrenze() As Double Dim KlassenWichte() As Double Dim AnzKlassen As Integer Dim AnzWerte As Long Dim delta As Double Dim s As String Dim min As Double, max As Double Dim i As Integer, j As Integer, Filenumber As Integer ' ----------------------------- ' Werte aus Datei einlesen ' ----------------------------- Filenumber = FreeFile AnzWerte = 0 Open "eingabe.txt" For Input As #Filenumber Do While Not EOF(Filenumber) ' Zähler erhöhen AnzWerte = AnzWerte + 1 ReDim Preserve wert(1 To AnzWerte) Line Input #1, s wert(AnzWerte) = CDbl(s) ' kleinster und größer Wert If AnzWerte = 1 Then min = wert(1) max = wert(1) Else If wert(AnzWerte) < min Then min = wert(AnzWerte) If wert(AnzWerte) > max Then max = wert(AnzWerte) End If ' Ausgabe der Werte in eine Listbox (optional) List1.AddItem (wert(AnzWerte)) Loop Close #Filenumber ' ----------------------------- ' Histogramm "bauen" ' ----------------------------- ' wieviele Klassen? AnzKlassen = CInt(Text1.Text) ReDim KlassenGrenze(1 To AnzKlassen) ReDim KlassenWichte(1 To AnzKlassen) ' Breite eines Histogrammbalkens delta = (max - min) / AnzKlassen ' Festlegung der Grenzen For i = 1 To AnzKlassen KlassenGrenze(i) = i * delta + min Next i ' Klassifizierung ' die Werte in die entsprechenden Klassen einsortieren For i = 1 To AnzWerte For j = 1 To AnzKlassen If wert(i) <= KlassenGrenze(j) Then KlassenWichte(j) = KlassenWichte(j) + 1 Exit For End If Next j Next i ' relative oder absolute Häufigkeit? If Check1.Value = 1 Then ' --> relative For i = 1 To AnzKlassen KlassenWichte(i) = KlassenWichte(i) / AnzWerte Next i End If ' ----------------------------- ' Ausgabe ' ----------------------------- ' in Datei Filenumber = FreeFile Open "ausgabe.txt" For Output As #Filenumber For i = 1 To AnzKlassen s = Format(KlassenGrenze(i), "#0.00000") Print #Filenumber, s, KlassenWichte(i) Next i Close #Filenumber ' im MSChart MSChart1.chartType = VtChChartType2dStep MSChart1.ColumnCount = 1 MSChart1.RowCount = AnzKlassen For i = 1 To AnzKlassen MSChart1.Column = 1 MSChart1.Row = i MSChart1.Data = KlassenWichte(i) ' Beschriftung der X-Achse MSChart1.RowLabel = KlassenGrenze(i) Next i End Sub