Linux E X P R E S

Facebook

Knihovna JFreeChart vyrobí z nudných čísel hezké grafy

chart.jpg

Programujete v Javě a chcete, aby váš software generoval pěkné grafy a diagramy? Kvalitní všestranně použitelná open-source knihovna JFreeChart rozhodně stojí za zvážení.


V oblasti grafické reprezentace dat se česká terminologie dosud neustálila. Kolísání mezi pojmy "graf", "diagram" a "schéma" tato recenze dále vyrovnává vždy ve prospěch pojmu "graf". U synonymních přívlastků v souslovích respektuje názvosloví české verze Wikipedie. Konkrétně třeba místo o koláčovém diagramu mluví o kruhovém grafu.

Knihovna staví na renomované platformě Java a vykreslování provádí standardním Java 2D API. To zajišťuje "univerzálnost" použití:

  • JFreeChartem lze vybavit běžné desktopové aplikace
  • u webové aplikace na straně klienta může JFreeChart běžet v appletu
  • u webové aplikace na straně serveru může JFreeChart běžet v servletu
  • standardními prostředky lze výsledek exportovat do oblíbených formátů (png, svg, pdf, jpg)...

Oproti tomu třeba nasazení některé z "neuniverzálních" knihoven pro javascriptový framework JQuery (např. JQPlotu) vás omezí pouze na stranu klienta.

Co JFreeChart zvládne?

Všechny ilustrace zde pocházejí z oficiálního demoprogramu, jejž si můžete spustit na stránkách JFreeChartu odkazem JFreeChart Demo (web start). Z mnoha funkcí objasněných v demu se článek soustředí jen na ty nejdůležitější.

Mezi samozřejmosti patří bodový, spojnicový, kruhový, krabicový, sloupcový, prstencový, polární graf a histogram.

Kruhový graf Kruhový graf

Bodový graf Bodový graf

Krabicový graf Krabicový graf

Histogram Histogram

Z méně obvyklých grafů knihovna disponuje "manažerským" ganttovým grafem, "burzovním" schodovým grafem a "burzovním" svícovým grafem. Ganttův graf zobrazuje návaznost úkolů, plánované lhůty jejich plnění a jejich aktuální splněnost. Schodový graf u každé obchodní seance zaznamenává pravou horizontální linkou počáteční cenu, horní linkou maximální, dolní minimální a pravou závěrečnou. Totéž zaznamenává svícemi svícový graf, v němž barva jednotlivých svíc odlišuje pokles od růstu.

Ganttův graf Ganttův graf

Schodový graf Schodový graf

Svícový graf Svícový graf

Knihovnu JFreeChart ozvláštňují budíky, kompasy, měřáky a teploměry, jakoby z nějaké laboratorní SCADA aplikace.

Teploměr Teploměr

U vynášených bodů lze znázornit kvalitu/kvantitu příslušného jevu. Dodatečné informace se sdělují volbou symbolu, barvami, poloměry bublin, směrem vektoru a délkou vektoru.

Bubliny rozdílných barev a velikostí Bubliny rozdílných barev a velikostí

Přepínače, na předchozím obrázku dole, schovávají jednotlivé datové řady. Následující obrázek dokládá další interaktivnost plátna grafu. Přes nabídku vlastnosti jsem přepsal nadpis z "Normal distribution demo 2" na "Gaussovo rozdělení" a chystám se zoomovat grafem.

Čtenář si přizpůsobuje graf Čtenář si přizpůsobuje graf

Více různých grafů "přes sebe" vykreslených naráz může sdílet jednu nebo obě osy. Kombinováním se získají nové typy grafů (např. Paretův graf).

Paretův graf Paretův graf

Aby grafy nepůsobily sterotypně a fádně, počítá JFreeChart i s barevnými přechody, prolamováním do hloubky, poloprůhledností a s dalšími efekty zatrativňujícími vzhled. Vedle ryze estetických efektů JFreeChart nabízí i "funkční" efekty, jež brání mylné interpretaci grafu. Z těchto praktických efektů zdůrazněme vybarvování plochy pod křivkou, mezi křivkami a nad křivkou, která zjednoznační průběh jednotlivých křivek. Škála dostupných efektů pochopitelně odvisí od vybraného typu grafu.

Sloupcový graf s 3D efektem Sloupcový graf s 3D efektem

Co JFreeChart nezvládne?

JFreeChart neumí zobrazovat dynamické procesy v reálném čase, ale pochopitelně je možno v grafu postřehnout změny dat rychlým periodickým překreslováním celého grafu. Tento klasický fígl však může neúnosně zvýšit výpočetní nároky aplikace. Knihovna vynáší body jen do dvou rozměrů, tedy neumí ani 3D grafy. Požadujete-li zobrazení trojrozměrného děje, například výstupů numerického modelování fyzikálních systémů, sáhněte po aplikaci typu ParaView.

S relacemi, tedy grafy ve smyslu teorie grafů, si JFreeChart neporadí. Oč přesně běží, naznačuje obrázek vytvořený specializovanou aplikací Tulip. Graf, převzatý z této galerie, ukazuje strukturu odkazů na Wikipedii.

Struktura odkazů Wikipedie Struktura odkazů Wikipedie

Alternativu ke knihovnám jako JFreeChart představují statistická prostředí (např. R) a utility pro tvorbu grafů (např. gnuPlot). Ve prospěch knihoven svědčí některé přirozené přednosti oproti externí utilitě. Odpadají starosti se serializací dat, s kódováním a konverzí formátů (např. datumů), ruší se režií okolo spuštění externí utility, nevnáší se softwarová závislost na externí aplikaci... Daní za integraci do Javy je pochopitelně ztráta přenositelnosti, takže na JFreeChart nedosáhnete například přímo z bashového skriptu.

V dřívějším článku GnuPlot: generujte grafy přímo ze svého programu naleznete řešený příklad na propojení Bashe, skriptů v Pythonu a gnuPlotu.

JFreeChart v praxi?

Tvůrci knihovně zvolili slabě copyleftovou licenci LGPL, jež neupravuje problematiku linkovaní. Práva garantována uživateli vůči samotné knihovně tedy přestávají být garantována vůči funkčnímu celku. Tedy licence programátora nesvazuje a nechává mu volnou ruku při licencování jeho kódu, koncový uživatel softwaru obsahujícího JFreeChart však pozbývá práv plynoucích z open-source licence. Jinými slovy JFreeChart se hodí jak pro tvůrce proprietárního softwaru, tak i pro fanoušky open source.

Principy programování s JFreeChartem se podobají klasickým principům programování u takovýchto knihoven. Není zde žádných záludností a celý postup se skládá z:

  1. vytvoření datového modelu zavoláním konstruktoru třídy,
  2. naplnění proměnné datového modelu prezentovanými daty,
  3. vytvoření grafu,
  4. provedení nastavení,
  5. zobrazení grafu.

Tuto posloupnost ozřejmí osekaná kostra kódu s logikou vytvoření kruhového grafu.:

  1. DefaultPieDataset moje_data = new DefaultPieDataset();
  2. moje_data.setValue("osmdesátiprocentní položka", 80.); moje_data.setValue("zbytek", 20.);
  3. JFreeChart muj_graf = ChartFactory.createPieChart("Nadpis grafu", moje_data, true, true, false);
  4. Ponechám graf bez úprav.
  5. ChartFrame frame = new ChartFrame("Nadpis okna", muj_graf); frame.setVisible(true);

Kompletní zdrojové kódy generující kruhové grafy naleznete na webu java2s.com.

Poněvadž se svědomitý komerční vývojář obvykle nespokojí s předpřipraveným designem, námaha při programování grafů spočívá především v precizním dodefinování kýženého vzhledu. Programátor musí zadáváním nejrůznějších příkazů rozhodovat o rozsahu os, typu stupnic, popisku stupnic, legendě, orientaci grafu, zobrazení pomocných linek, různých popiscích, rozhodnutí specifických pro vybraný typ grafu, nadpisu, grafických symbolech u jednotlivých datových řad, zobrazení proložení dat teoretickou závislostí... Chce-li být programátor skutečně produktivním, potřebuje vizuálního průvodce, v němž by si vše naklikal, nebo kvalitní zevrubnou dokumentaci nebo detailní znalost celé knihovny, což vyžaduje čas na učení a fenomenální paměť.

Naše knihovna postrádá vizuálního průvodce, přesto se bezplatná dokumentace omezuje jen na automaticky vygenerovaný popis aplikačních rozhraní. Za plnohodnotnou elektronickou dokumentaci (tzv. Developer Guide) se platí, a to přibližně 1300 Kč (65 USD) za osobní licenci, 10000 Kč (500 USD) za licenci určenou provozovně a 30000 Kč (1500 USD) za plnohodnotnou firemní licenci. Nebyl jsem s to nalézt bezplatnou alternativu k poměrně drahé autorské dokumentaci, nalezl jsem pouze drobnosti roztříštěné do celého internetu.

V kontextu běžných zvyklostí, kdy se obvykle u svého produktu usilujeme o maximální dostupnost co nejlepší dokumentace, se jeví zpoplatnění jako nepřátelský akt. Běžné praktiky předveďme u konkurenčního softwaru Matplotlib, podobně zaměřené knihovny pro Python. Web Matplotlibu obsahuje uživatelskou příručku, shrnutí a galerii ukázkových grafů s komentovanými zdrojovými kódy a za cenu uživatelské příručky JFreeChartu si obstaráte tištěnou knihu. Samozřejmě klíčové projekty jdou ještě dál, třeba statistickým prostředím R se zaobírá přes sto publikovaných monografií.

Celkové hodnocení JFreeChartu

Některé aplikace pro tvorbu grafů se úzce specializují (např. Fytik pro studium spekter). Knihovna JFreeChart se takto ostře nevyhraňuje; JFreeChart uspokojí jakékoliv požadavky při tvorbě grafů, vyjma požadavků náročných uživatelů rekrutujících se zřejmě především z vědecké obce. Přesto se knihovna evidentně inspirovala převážně potřebami ekonomů a manažerů. Chcete-li například vygenerovaný výkaz hospodaření osvětlit názornými grafy, jeví se JFreeChart jako optimální volba. Vývojáři podnikového a podobného softwaru se často spoléhají právě na platformu Java, což zjevně autoři javovské knihovny JFreeChart zohlednili.

Hlavní trumfy JFreeChartu jsou:

  • JFreeChart nabízí vše potřebné, aniž by zahlcoval záplavou příliš pokročilých nastavení.
  • Jedná se o vyzrálý a osvědčený produkt s hojnými referencemi, jenž se stále aktivně vyvíjí a vylepšuje.
  • Vizuální efekty jsou vkusné. Grafy jsou přehledné.
  • Rozličné přednosti platformy Java, dostupnost různých balíčků (např. java.awt.*).
  • Ideální při strategickém rozhodnutí pracovat výhradně s Javou.

Pro tvorbu grafů existuje nepřehledné kvantum dostatečně vyspělého open-source softwaru, samotní tvůrci JFreeChartu výslovně zmiňují konkurenční JZY3D, XChart, Project Waterloo, GRAL, JChart2D, JenSoft Java Chart API, JRobin, PtPlot, SurfacePlotter, LiveGraph project, OpenChart2, JHeatChart, QN Plot, E-Gantt, Java Chart Construction Kit, jCharts, ThunderGraph, Chart2D, JOpenChart a MagPlot. Programátorovi se dostává značně širokého výběru a mnozí se pak rozhodují podle dostupnosti informací, proto nedostatek výukových materiálů knihovnu JFreechart v konkurenčním boji citelně znevýhodňuje.

Diskuze (4) Nahoru