| |
VB.NET - Ein- und UmsteigerHäufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 14:44 |
| Und schon wieder eine Frage, die zweite, die mich heute stundenlang beschäftigt hat.
Ich habe herausgefunden wie ich ein DataTable nutze um ein Tortendiagramm zu befüllen.
Mein Problem ist aber folgendes:
Ich habe in einer Spalte eine Reihe von möglichen Werten, die restlichen Spalten eines Datensatzes können völig anders aussehen. z.b.
Jürgen, Spanisch, mittelgut
Herbert, Französisch, brilliant
Lisa, Spanisch, brilliant
Nun muss ich die Zahl der Vorkommen dieser Begriffe zählen, also dass von 3 Leuten 2 Spanisch sprechen und 1 Französisch. Das soll dann in ein Tortendiagramm, "2 Drittel Torte Spanisch, 1 Drittel Französisch". Wie die Leute heißen ist wurst. Ebenso würde ich dann auch die letzte Spalte ("Lernerfolg") in ein Diagramm packen. Ein bisschen Statistik
Und auch hier bin ich vollkommen ratlos. Ich finde einfach keine Funktion, die es mir erlaubt zu zählen, wie oft in einem DataTable ein bestimmter Wert identisch vorkommt.
Beitrag wurde zuletzt am 19.09.11 um 14:47:20 editiert. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 15:03 |
| Hallo!
In einer generischen Dictionary(of String, Integer) prüfst Du beim
Durchlaufen der Zeilen jeweils, ob der Schlüssel-Eintrag z.B. "spanisch"
schon vorhanden ist (Contains-Methode).
Falls nein: Neuen Schlüssel in Dictionary eintragen, aktuelle Sprache als
Schlüssel verwenden und den Wert auf 1 setzen.
Falls ja: Wert des Bezeichners bei diesem Schlüssel (=Sprache) um 1
hochsetzen.
MfG
Manfred | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 15:11 |
| Vielen Dank für die Antworten!
Das Blöde ist dass ich vorher nicht wissen kann, wie die Werte heißen könnten. Ich kann also nicht nach "Spanisch" suchen, weil das nicht unbedingt dabei sein muss. Kann man das auch so machen, dass man generell alles was da ist zählt und dann daraus ein DataTable macht.
Beispiel:
Die Daten sind wie oben
Jürgen, Spanisch, mittelgut
Herbert, Französisch, brilliant
Lisa, Spanisch, brilliant
Ich wende die Funktion auf die spalte 2 (also index 1) an. Herauskommen soll dann ein DataTable mit 2 Spalten
Spanisch, 2
Französisch, 1
das ich dann als Quelle für ein Toertendiagramm nutzen kann.
Man kommt sich echt doof vor wenn man keine Ahnung hat - aber irgendwann muss man es ja mal lernen
EDIT:
Die Daten sind übrigens in einem DataTable mit dem sinnreichen Namen dt. Dieses wird aus einer Textdatei befüllt, aber das klappt zum Glück
Beitrag wurde zuletzt am 19.09.11 um 15:13:15 editiert. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 15:18 |
| Hallo!
Bei beiden Vorschlägen ist es nicht erforderlich, vorher zu wissen,
welche Sprachen in den Datenzeilen vorkommen.
MfG
Manfred | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 15:19 |
| Mm, wahrscheinlich reicht es, aber ich bin wohl zu doof den Code anzuwenden. Das hier hab ich gemacht:
Dim counts = From d As DataRow In dt.AsEnumerable() Group d By _
Language = d.Field(Of String)(6) Into g = Group _
Select Language, g.Count
TextBox1.Text = counts.ToString Die Zeile d.Field(Of String)(6) verweist auf den Index 6 im DataTable dt, das ist die Sprachenspalte. Ich kann die nicht mit ihrem Namn ansprechen, weil der sich zur Laufzeit verändert (Lokalisierung). Ich mache wohl was falsch.
EDIT:
Ok,das Problem wird wohl sein dass VB jetzt ja gar keine Liste mehr bastelt, sondern einen String. Eine Liste lässt es mich aber nirgens anzeigen, wollte die Ausgabe halt mal sehen.
Und irgendwie klappt auch die Zuweisung auf Spalte 7 (Index 6) des DataTables nicht.
Zweiter EDIT:
Oh bin ich blöd. Dein Code klappt wunderbar. Klar, kann ja nicht klappen wenn ich dadraus eine Liste mache. Jetzt muss ichs nur noch hinbekommen, die Liste als DataSource für die Torte zu nehmen.
Beitrag wurde zuletzt am 19.09.11 um 15:28:30 editiert. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: DaveS (Moderator) | Datum: 19.09.11 15:29 |
| Warum sollten die DataTable Spalten lokalisiert werden? Das hat nichts damit zu tun was in einem DGV oder Graph sichtbar wird, das bestimmen Eigenschaften des Controls. Aber ein numerischer Index geht auch. Das beiseite, du kannst auch aus den Daten eine DataTable bauen, wenn das eher vertraut ist, etwa so
Dim dt1 As New DataTable("Sprachenhäufigkeit")
dt1.Columns.Add("Sprache", GetType(String))
dt1.Columns.Add("Anzahl", GetType(Integer))
For Each d1 In From d As DataRow In dt.AsEnumerable() Group d By _
Sprache = d.Field(Of String)(6) Into g = Group _
Select Sprache, g.Count
Dim dr1 As DataRow = dt1.NewRow
dr1("Sprache") = d1.Sprache
dr1("Anzahl") = d1.Count
dt1.Rows.Add(dr1)
Next
DataGridView2.DataSource = dt1 Und wie Manfred X schreibt, du musst nicht vorher wissen welche Werte in der Spalte auftauchen.
________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 15:37 |
| Ja, vielen Dank. Jetzt hab ichs gepeilt. Fehlt nur noch die Anbindung an die Torte.
Graph1.DataSource = dt1 klappt leider nicht Ich nehme an ich muss das noch irgendwie der Series1 dort zuweisen. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 16:12 |
| Hallo!
Angenommen dt ist die Datatable mit den Angaben/Spalten zur Language und zu Count:
With Chart1
.Series.Clear()
.Series.Add("default")
.Series("default").ChartType = _
DataVisualization.Charting.SeriesChartType.Pie
.DataSource = dt
.Series("default").XValueMember = "Language"
.Series("default").YValueMembers = "Count"
End With MfG
Manfred
Beitrag wurde zuletzt am 19.09.11 um 16:14:48 editiert. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 18:41 |
| Es wird immer seltsamer, egal was ich mache, es kommt immer eine Exception dass die zweite Spalte nicht gefunden wurde.
Hier der komplette Code:
Dim dt1 As New DataTable("Sprachenhäufigkeit")
dt1.Columns.Add("Sprache", GetType(String))
dt1.Columns.Add("Zahl", GetType(Integer))
For Each d1 In From d As DataRow In dt.AsEnumerable() Group d By _
Sprache = d.Field(Of String)(6) Into g = Group _
Select Sprache, g.Count
Dim dr1 As DataRow = dt1.NewRow
dr1("Sprache") = d1.Sprache
dr1("Zahl") = d1.Count
dt1.Rows.Add(dr1)
Next
DataGridView1.DataSource = dt1
With Chart1
.Series.Clear()
.Series.Add("default")
.Series("default").ChartType = _
DataVisualization.Charting.SeriesChartType.Pie
.DataSource = dt
.Series("default").XValueMember = "Sprache"
.Series("default").YValueMembers = "Zahl"
End With Das Data Grid View zeigt alles wunderbar an, inklusive der "Zahl" Spalte, nur das Diagramm beschwert sich. Ratlos... | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 18:45 |
| Hallo!
Die Datasource des Graphen muss bei Dir "dt1" heißen. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 18:47 |
| Ach Gott bin ich dämlich - ich hab den Code bestimmt 100mal gelesen und es trotzdem übersehen, danke! | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 18:51 |
| Hallo!
Verwende "Option Strict On" und "Option Explicit On" im Kopf der Codedateien oder als IDE-Voreinstellung. Nicht deklarierte Bezeichner werden dann angemahnt.
Beitrag wurde zuletzt am 19.09.11 um 18:53:07 editiert. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 18:56 |
| Beides ist an, das doofe ist dass es "dt" ja gibt - das ist der data table, der ein anderes Grid View befeuert. Aber das bringt mich auf die geniale Idee, den jetzt mal etwas intelligenter zu benennen
Schade dass die Diagramme so altbacken aussehen. Aber extra nur dafür 300$ für DotNetBar auszugeben ist mir ein bisschen viel... | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 19:01 |
| Hallo!
Man kann die Standardeinstellungen der Charts "aufpeppen".
Farbverläufe, 3D-Charts usw. sind durchaus möglich. Dafür ist nur
ein wenig Einarbeitung in die Klassen/Methoden dieses recht komplexen
Steuerelements notwendig.
Allerdings: Für wissenschaftlich-technische Anwendungen ist "Firlefanz"
meist überflüssig. Hier kommt es z.B. bei Pie-Charts eher darauf an,
dass die relativen Häufigkeiten sich nicht extrem unterscheiden oder dass
zu viele Tortenstücke (mehr als 12-15) entstehen. In solchen Fällen sollte man
automatisch auf Bars umschalten und ggf. logarithmische Skalen einsetzen.
MfG
Manfred | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 19:21 |
| Klappt alles vorzüglich, wunderbar!
Wahrscheinlich eine saublöde Frage: Kann man irgendwie einem Balkendiagramm beibringen, Scrollbalken zu bekommen wenn es zu groß wird? Also quasi genau wie im ListView, dass ma scrollen muss wenn zu viele Balken da sind? | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 19:32 |
| Hallo!
Du kannst die Breite des Chart-Control von der Anzahl der Bars
abhängig machen (und z.B. noch Platz für die Legende vorsehen).
Dieses ChartControl setzt Du in ein Panel, dessen Autoscroll-Eigenschaft
auf "true" steht. Das Chart-Control im Panel z.B. links andocken.
MfG
Manfred
Beitrag wurde zuletzt am 19.09.11 um 19:33:57 editiert. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 19:45 |
| Schlau
Ich finde aber irgendwie keine AutoSize-Eigenschaft, oder muss man das von Hand machen? | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 20:00 |
| Hallo!
Hatte ich nicht "AutoScroll" geschrieben ... ???? | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 20:04 |
| Ja, Auto Scroll beim Panel finde ich, aber ich schaffe es nicht, dass der Chart automatisch größer wird, da finde ich kein Auto Scroll. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Manfred X | Datum: 19.09.11 20:22 |
| Hallo!
Du mußt eine gewünschte Breite pro Bar (in Pixel) definieren und dann
anhand der Anzahl der Bars die erforderliche Breite des Graphen selbst
setzen (Width-Eigenschaft). Das Graph-Objekt kann nicht "automatisch"
wissen, wie breit/hoch die Darstellung werden soll. Die (Bar-) Graphik wird
automatisch in die jeweils verfügbare (vorgegebene) Breite/Höhe des Graph-
Control eingepasst (unter Beachtung der weiteren Elemente: Titles, Legends
usw.).
Übrigens: Das Scrollen eines Chart ist in den meisten Fällen keine gute
Lösung. Man sollte Diagrammen möglichst auf einem Blick die relevanten
Informationen entnehmen können.
Beitrag wurde zuletzt am 19.09.11 um 20:31:38 editiert. | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Novatlan | Datum: 19.09.11 22:16 |
| Ok, danke!
Ich habe mich jetzt mal mit Bleistift und Papier hingesetzt und erstmal Mockups gebastelt. Für die extrem datenintensiven Statistiken werde ich Tabellen nehmen, wodurch ich dann tatsächlich ohne riesige Grafiken auskomme.
Irgendwie macht es Spaß, nach 6 Jahren Pause mal wieder ein bisschen zu programmieren, auch wenns nur was kleines ist | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Erichbru | Datum: 20.02.24 13:43 |
| ist ja schon ein älterer Post, aber ich frag trotzdem mal nach
und wer kann mir sagen was genau sind eigentlich "Buchungsarten"
- Ausgabe
- Einnahmen
- ??
wie kann man denn da noch eine Spalte bekommen mit der "Summe" von den Einzelposten der jeweiligen Position
bei mir heißt die Spalte in der Datenherkunft Betrag (Double)
das funktioniert ja nicht!
Private Sub Kategoriehäufigkeit()
Dim dt1 As New DataTable("Kategoriehäufigkeit")
dt1.Columns.Add("Kategorie", GetType(String))
dt1.Columns.Add("Anzahl", GetType(Integer))
dt1.Columns.Add("Gesamtbetrag", GetType(Double))
For Each d1 In From d As DataRow In ArchivDB.Kontodetails.AsEnumerable( _
) Group d By _
Kategorie = d.Field(Of String)("Kategorie") Into g = Group _
Select Kategorie, g.Count
Dim dr1 As DataRow = dt1.NewRow
dr1("Kategorie") = d1.Kategorie
dr1("Anzahl") = d1.Count
dr1("Gesamtbetrag") = ??
dt1.Rows.Add(dr1)
Next
DataGridView1.DataSource = dt1
With ChartKategorie
.Series.Clear()
.Series.Add("default")
.Series("default").ChartType = _
DataVisualization.Charting.SeriesChartType.Pie
.DataSource = dt1
.Series("default").XValueMember = "Kategorie"
.Series("default").YValueMembers = "Anzahl"
End With
End Sub | |
Re: Häufigkeit eines Wertes in einem DataTable zählen und in Tortendiagramm anzeigen | | | Autor: Erichbru | Datum: 20.02.24 18:37 |
| mittlerweile habe ich es gecheckt, oder ?
jetzt soll das Chart noch angepasst werden Prozente wäre doch nicht schlecht oder ?
wer hat da Ideen ? und was sagt ihr zu der Lösung ?
Private Function Category_output(year As Integer) As DataTable
Dim dt As DataTable = ArchivDB.Kontodetails
Dim cal As Globalization.Calendar = _
Globalization.CultureInfo.CurrentCulture.Calendar
Dim q = From row As DataRow In dt
Let Ausgaben = row.Field(Of Double)("Betrag")
Let Kategorie = row.Field(Of String)("Kategorieausgabe")
Let ID = row.Field(Of Integer)("KategorieausgabeID")
Where year = row.Field(Of Date)("Buchungsdatum").Year _
AndAlso ID > 0
Group By Kat = Kategorie Into Sum(Ausgaben), Count()
'--------Ende deklarieren
Dim df As New DataTable
With df.Columns
.Add("Kategorie", GetType(String))
.Add("Anzahl", GetType(Integer))
.Add("Ausgaben", GetType(Double))
End With
For Each el In q
df.Rows.Add(el.Kat, el.Count, el.Sum)
Next el
DataGridView1.DataSource = df
With ChartKategorie
.Series.Clear()
.Series.Add("default")
.Series("default").ChartType = _
DataVisualization.Charting.SeriesChartType.Pie
.DataSource = df
.Series("default").XValueMember = "Kategorie"
.Series("default").YValueMembers = "Anzahl"
End With
Return df
End Function | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere Infos
|