C#: grafice cu Chart și agregarea datelor
Construiește un grafic C# din date agregate, cu etichete și valori verificabile. Separă calculul totalurilor de reprezentarea vizuală în controlul Chart.
În acest material
Un grafic convingător trebuie să reprezinte datele corecte. Pentru o bibliotecă numărăm împrumuturile pe categorii. Întâi calculăm totalurile, apoi le transmitem controlului Chart. Nu deducem valorile din înălțimea barelor și nu amestecăm rânduri individuale cu totaluri fără să explicăm unitatea de măsură.
Cum lucrezi cu exemplul
Exemplul complet se compilează ca Windows Forms App pe .NET Framework 4.8, cu C# 7.3. Deschide Lesson.csproj din arhivă în Visual Studio pe Windows. Rulează scenariile descrise mai jos; verificarea compilării nu înlocuiește testarea ferestrei și a dispozitivelor folosite.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
În proiectul .NET Framework adaugă referința System.Windows.Forms.DataVisualization. ChartArea definește zona axelor, iar Series definește seria de date și tipul reprezentării. Fiecare punct primește categoria pe axa X și numărul pe axa Y. IsValueShownAsLabel face rezultatul numeric vizibil și verificabil.
Gruparea este urmată de o ordonare explicită, astfel încât două rulări să arate aceeași ordine. Pentru o actualizare a datelor, golește punctele vechi înainte de a adăuga noua serie de rezultate. Altfel poți dubla vizual valorile la fiecare refresh.
Exemplu și rezultat așteptat
Datele conțin trei apariții pentru Programare și două pentru Literatura. Graficul are două bare etichetate 3 și 2. Suma înălțimilor numerice este cinci, egală cu numărul înregistrărilor. Axa Y pornește de la zero pentru a nu exagera diferența dintre categorii.
5 împrumuturi → GroupBy categorie → Programare 3; Literatură 2 → Chart: două bare etichetate.Mărește schema ↗
Codul complet
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LessonForm());
}
}
class LessonForm : Form
{
public LessonForm() {
Text="Imprumuturi pe categorii";ClientSize=new Size(640,360);
var chart=new System.Windows.Forms.DataVisualization.Charting.Chart {Dock=DockStyle.Fill};
var area=new System.Windows.Forms.DataVisualization.Charting.ChartArea("Totaluri");
area.AxisY.Minimum=0;area.AxisY.Title="Numar imprumuturi";chart.ChartAreas.Add(area);
var series=new System.Windows.Forms.DataVisualization.Charting.Series("Imprumuturi") {
ChartType=System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column,IsValueShownAsLabel=true};
string[] categories={"Programare","Literatura","Programare","Literatura","Programare"};
foreach(var group in categories.GroupBy(x=>x).OrderBy(x=>x.Key,StringComparer.Ordinal))
series.Points.AddXY(group.Key,group.Count());
chart.Series.Add(series);Controls.Add(chart);
}
}
Greșeli și limite
Nu reprezenta numărul de înregistrări ca procent fără un numitor clar. Nu ascunde categoria fără date dacă cerința solicită explicit toate categoriile. Culorile singure nu sunt suficiente pentru identificare: păstrează etichetele. Pentru multe categorii, o listă sau un tabel poate fi mai lizibil decât un grafic înghesuit.
Exersează
Adaugă o categorie cu o singură apariție și verifică totalul șase. Reîncarcă datele de două ori și confirmă că numărul punctelor nu se dublează. Construiește alături un tabel cu aceleași totaluri și compară valorile. Explică de ce o axă care începe la 1,9 ar face diferența dintre 2 și 3 să pară disproporționată.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: drag and drop cu tipuri și limite explicite
Lecția următoare: C#: rapoarte tipărite și paginare cu PrintDocument.
Referință: documentația Microsoft.
Întrebări frecvente
De unde vine controlul Chart?
În acest proiect Framework, din assembly-ul System.Windows.Forms.DataVisualization, adăugat ca referință.
Calculez totalurile în grafic?
Preferabil le calculezi separat și trimiți graficului valori deja verificate.
De ce se dublează barele după refresh?
Verifică dacă ai golit punctele sau seria înainte de adăugarea rezultatelor noi.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.