čtvrtek 31. ledna 2008

ZedGraph 1.

Tento článek je prvním z celé řady článků, které budou následovat, a zaměřuje se na komponentu pro .NET, která nabízí velice jednoduché a účelné řešení pro vytváření velkého množství grafů. ZedGraph spadá pod LGPL Licenci, můžete jej tedy volně používat v aplikacích, pokud neměníte kód této komponenty. Pokud byste přece jen kód měnili, LGPL licence Vám ukládá povinnost změněný kód zveřejnit.

V době psaní tohoto článku, byl ZedGraph ve verzi 5.1.4 + 4.6.4 (ze dne 28.listopadu 2007). Plus znamená, že byly sloučeny tyto verze, kde 5.1.4 byla pro .NET framework 2.0 a 4.6.4 pro .NET framework 1.1. Více informací naleznete na oficiálních stránkách www.zedgraph.org.
Na codeProjectu je této komponentě věnován douhý článek, míněný jako tutoriál, kterého se budu trochu držet. Protože VB umím pouze číst a ne psát, budou veškeré zdrojové kódy psány v C#.

Jaké grafy tedy budeme moci vytvořit? Různé spojnicové grafy, koláčové, sloupcové horizontální i vertikální, bodové, procentuální, sloupcové součtové grafy, grafy pro znázorňování obchodních grafů (akcie apod.), japonské svíčkové grafy (candle-stick). Na druhou stranu neumožňuje 3D grafy.

Pokud chcete hned začít používat ZedGraph, stáhněte si nejnovější verzi zde, v projektu přidejte referenci na dll knihovnu ZedGraph.dll a nezapomeňte na using ZedGraph. Pokud máte projekt založen jako Windows Aplikaci, můžete v designeru přetáhnout ZedGraph z toolboxu na Váš formulář. Objeví se malý základní graf - nebo spíše soustava souřadnic.
Trošku si zvětšete formulář i graf, ať vidíte změny, které budeme provádět.

Pokud byste chtěli graf vytvořit programově, použijete bezparametrický konstruktor:
ZedGraphControl zgcGraf = new ZedGraphControl();
Nejdůležitějším prvkem grafu, pomocí kterého můžeme ovlivňovat většinu jeho vlastností je MasterPane, což je prvek, který slučuje všechny plochy grafu. Dalším prvkem je GraphPane, což je první plochou v seznamu ploch MasterPane. Pokud chcete používat jen jednu plochu (což v 90 % budete), vystačíte si právě s GraphPane.

Plochu pro graf máme, dále tedy potřebujeme osy. Všechny objekty os jsou podědeny z třídy Axis, která poskytuje mnoho vlastností jako je interval hodnot osy, typ osy, mřížka, barvy, fonty, popisky apod. Nejdůležitější osy jsou: XAxis, YAxis, X2Axis a Y2Axis.

Nastavíme si tedy osy:
ZedGraphControl zgcGraf = new ZedGraphControl();
// Typ osy nastavime na zobrazovani datumu a casu
zgcGraf.GraphPane.XAxis.Type = AxisType.Date;
// Zviditelnime si hlavni i vedlejsi mrizku pro obe osy
zgcGraf.GraphPane.XAxis.MinorGrid.IsVisible = true;
zgcGraf.GraphPane.XAxis.MajorGrid.IsVisible = true;
zgcGraf.GraphPane.YAxis.MinorGrid.IsVisible = true;
zgcGraf.GraphPane.YAxis.MajorGrid.IsVisible = true;
// Popisek osy a grafu
zgcGraf.GraphPane.XAxis.Title.Text = "Datum";
zgcGraf.GraphPane.YAxis.Title.Text = "Počet zobrazení stránky";
zgcGraf.GraphPane.Title.Text = "Znázornění návštěvnosti stránek";
// Nastavenim Min a Max urcime rozmezi viditelne casti osy
zgcGraf.GraphPane.XAxis.Scale.Min = new DateTime(2008, 1, 1).ToOADate();
zgcGraf.GraphPane.XAxis.Scale.Max = new DateTime(2008, 1, 10).ToOADate();
// Jeste nastavime jednotku - hlavni a vedlejsi
zgcGraf.GraphPane.XAxis.Scale.MajorUnit = DateUnit.Day;
zgcGraf.GraphPane.XAxis.Scale.MinorUnit = DateUnit.Hour;
// Velice dulezita funkce, ktera prepocita vsechny hodnoty a upravi rozsah os tak,
// aby byly vsechny body viditelne. Pokud nechcete osy prepocitavat a prizpusobovat
// datum, funkci nevolejte
zgcGraf.AxisChange();
Tím máme sice pěkně nastavené osy, ale chtělo by to nějaké body. Pojďme tedy přidat data. Data budete většinou odněkud načítat (z databáze apod.), my si je vytvoříme natvrdo:
double pocetZobrazeni = 0;
DateTime datumZobrazeni = new DateTime(2007, 12, 31);
Random r = new Random();
// Kolekce pro jednotlive body krivky
PointPairList seznamBodu = new PointPairList();
for (int i = 0; i <>
{
pocetZobrazeni = r.Next(200);
datumZobrazeni = datumZobrazeni.AddDays(1);
// protoze do kolekce lze pridat hodnoty typu double,
// musime cas prevest na double hodnotu
seznamBodu.Add(datumZobrazeni.ToOADate(), pocetZobrazeni);
}
// LineItem znazornuje objekt krivky.
// Podivejte se, ze krivku grafu jednoduse vytvorime zavolanim funkce AddCurve.
// Prvni argument je popis krivky, druhy je seznam bodu, dalsi je barva krivky
// a posledni je symbol jednotlivych bodu.
LineItem krivka = zgcGraf.GraphPane.AddCurve("Počet zobrazení / den",
seznamBodu, Color.Red, SymbolType.Plus);
// Protoze jsme pridali body, musime prizpusobit osy
zgcGraf.AxisChange();
Toto je metoda, která obsluhuje událost XScaleFormatEvent, která nastane pokaždé, když měníme rozsah os. Pomocí této metody určíme styl zobrazování jednotek na ose x.
internal static string XScaleFormatEvent(GraphPane pane, Axis axis, double val, int index)
{
return DateTime.FromOADate(val).ToString("d");
}
Nesmíme zapomenout handler události přihlásit:
zgcGraf.GraphPane.XAxis.ScaleFormatEvent += XScaleFormatEvent;
Výsledný graf by mohl vypadat například takto (použili jsme náhodné generování čísel, takže každý bude mít trochu jiné hodnoty na ose Y):

Žádné komentáře:

Okomentovat