SlideShare ist ein Scribd-Unternehmen logo
JpGraph – eine Einführung 
Vortrag vom 03.06.2004 auf der PHP-Usergroup Hannover 
von Frank Staude <staude@trilos.de>
2 
Inhalt 
1. Einleitung ........................................................................................................................... 3 
2. Features .............................................................................................................................. 3 
3. Lizenz der JpGraph ............................................................................................................ 3 
4. Diagrammübersicht ............................................................................................................ 4 
5. Installation.......................................................................................................................... 6 
6. Tortendiagramm................................................................................................................. 7 
7. Balkendiagramm ................................................................................................................ 9 
8. Gantt-Diagramm............................................................................................................... 11 
9. der Cache.......................................................................................................................... 14 
10. Ende.............................................................................................................................. 15 
11. Links............................................................................................................................. 15
1. Einleitung 
David hat es in seiner Einführung in der GD-Lib am 2.10.2003 bereits geschrieben. 
"Ich sehe keinen Sinn darin, Linien und Flächen in Bildern zu generieren, also lasse ich 
dieses Anwendungsgebiet außen vor. Wer Diagramme dynamisch generieren möchte, kommt 
an JpGraph (www.aditus.nu/jpgraph) nicht vorbei, die einem diese ganze Arbeit gut 
abnimmt." 
2. Features 
(eine Auswahl) 
• Erzeugt kleine Grafiken. Die durchschnittliche Größe einer Grafik 300x200 
3 
Pixel ist um die 2 Kb. 
• JpGraph arbeitet sowohl mit der GD als auch mit der GD2 Bibliothek 
zusammen und kann selbstständig erkennen welche vorhanden ist. 
• Unterstützt Gantt Diagramme (für z.B: Projektplanungssoftware) 
• Unterstützung von TTF-Fonts zur Diagrammbeschriftung. 
• Kann Gif, PNG und JPG erzeugen. 
• Über 400 benannte Farben 
• Hintergrundbilder in Graphen sind möglich. 
• Serverentlastung durch cachingmechanismen. 
• Barcodeerzeugung (in der Kommerziellen Version) 
• Sehr gute Dokumentation (150 Seiten mit vielen Beispielen und 
Klassenreferenz) 
• Unterstützung von Alpha blending 
• Über 200 Länderflaggen eingebaut 
• Diverse Graphentypen (siehe "Diagrammübersicht") 
3. Lizenz der JpGraph 
Die JpGraph Bibliothek ist in einer Duallizenz erhältlich. Für nicht-kommerzielle 
Anwendungen unterliegt sie der QLP (Qt-Lizenz) und die Professional Version für 
kommerzielle Anwendungen (inkl. Barcodegenerierung, Windrosen und Odometer). Eine 
Single-Server Lizenz kostet 85 EUR + MwSt. Weitere Informationen zur Lizenz finden sich 
unter http://www.aditus.nu/jpgraph/jpg_proversion.php 
2D-Barcode
4. Diagrammübersicht 
Ein Auswahl möglicher Diagramme/Graphen die mit JpGraph möglich sind. 
Alle hier abgebildeten Diagramme sind aus der Dokumentation und sind dort inkl. 
Sourcecode beschrieben. 
4
5
5. Installation 
Nach dem entpacken des Archivs hat man zwei 
Verzeichnisse vorliegen. Docs und src. In Docs befindet 
sich die Dokumentation und in src der PHP-Code der 
JpGraph. Den Inhalt des src Verzeichnisses in ein 
Verzeichnis auf dem Server kopieren aus dem man es 
included oder welches man in den includepfad aufnimmt. 
6 
Im Detail werden folgenden Dateien benötigt. 
Jpgraph.php – ist die Hauptdatei die immer included wird. 
Und den Plot-Erweiterungen 
jpgraph_log.php 
jpgraph_line.php 
jpgraph_bar.php 
jpgraph_error.php, 
jpgraph_scatter.php 
jpgraph_spider.php 
jpgraph_pie.php 
jpgraph_pie3d.php 
jpgraph_gantt.php 
jpgraph_radar.php
7 
jpgraph_polar.php 
jpgraph_regstat.php 
jpgraph_stock.php 
jpgraph_gradient.php 
jpgraph_gb2312.php 
jpgraph_plotmark.php 
jpgraph_flags.php 
imgdata_*.inc 
flags*.dat 
jpgraph_canvas.php 
jpgraph_canvtools.php 
6. Tortendiagramm 
Los geht’s…Als erstes bauen wir ein einfaches Tortendiagramm. 
Dazu benötigen wir: 
Die JpGraph-Lib 
include ("jpgraph/jpgraph.php"); 
Außerdem das Plotmodul für Tortendiagramme. 
include ("jpgraph/jpgraph_pie.php"); 
Nun brauchen wir noch ein paar Werte 
$data = array(40,60,21,33); 
Als nächstes bauen wir die Grafik. Dazu erzeugen wir ein neues Grafikobjekt in der Größe 
300 x 200 Pixel. 
$graph = new PieGraph(300,200,"auto"); 
Nun noch dem ganzen einen Titel geben 
$graph->title->Set("Example 1 Pie plot"); 
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14); 
$graph->title->SetColor("black"); 
Die Werte kommen nun in ein Tortenobject 
$p1 = new PiePlot($data); 
Den Graphen den das Tortenobject liefert tragen wir in die Grafik ein. 
$graph->Add($p1); 
Und nun noch ausgeben.
8 
$graph->Stroke(); 
Das gesamte PHP-Sktipt sieht nun so aus: 
<? 
include ("jpgraph/jpgraph.php"); 
include ("jpgraph/jpgraph_pie.php"); 
$data = array(40,60,21,33); 
$graph = new PieGraph(300,200,"auto"); 
$graph->title->Set("Example 1 Pie plot"); 
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14); 
$graph->title->SetColor("black"); 
$p1 = new PiePlot($data); 
$graph->Add($p1); 
$graph->Stroke(); 
?> 
Und liefert als Ergebnis folgende Grafik: 
Das sieht nun noch ein bisschen langweilig aus. 
Als erstes erzeugen wir ein array mit den Beschriftungen: 
$legend = array("Perl","PHP","C","Tcl"); 
Anschließend wird die Legende dem Graphen hinzugefügt. 
$p1->SetLegends($legend); 
Der Graph muss nun noch ein bisschen nach links, damit rechts Platz für die Beschriftung ist. 
$p1->SetCenter(0.4); 
Und nun noch ein bisschen Schatten, damit es hübscher aussieht. 
$p1->SetShadow(); 
Damit sieht unser Programm nun so aus 
<?
9 
include ("jpgraph/jpgraph.php"); 
include ("jpgraph/jpgraph_pie.php"); 
$data = array(40,60,21,33); 
$legend = array("Perl","PHP","C","Tcl"); 
$graph = new PieGraph(300,200,"auto"); 
$graph->title->Set("Example 1 Pie plot"); 
$graph->title->SetFont(FF_VERDANA,FS_BOLD,14); 
$graph->title->SetColor("black"); 
$p1 = new PiePlot($data); 
$p1->SetLegends($legend); 
$p1->SetCenter(0.4); 
$p1->SetShadow(); 
$graph->Add($p1); 
$graph->Stroke(); 
?> 
Und erzeugt diese Grafik. 
Ok, machen wir Schluss mit den Torten und bauen lieber "Schoko-Riegel". 
7. Balkendiagramm 
Als nächstes Erzeugen wir dieses Balkendiagramm. 
Der Programmcode dazu sieht folgendermaßen aus. 
<?php 
include ("jpgraph/jpgraph.php");
10 
include ("jpgraph/jpgraph_bar.php"); 
$datay=array(12,8,19,3,10,5); 
$graph = new Graph(300,200,"auto"); 
$graph->SetScale("textlin"); 
$graph->SetShadow(); 
$graph->img->SetMargin(40,30,20,40); 
$bplot = new BarPlot($datay); 
$bplot->SetFillColor('orange'); 
$bplot->SetWidth(1.0); 
$graph->Add($bplot); 
$graph->title->Set("Bar graph"); 
$graph->xaxis->title->Set("X-title"); 
$graph->yaxis->title->Set("Y-title"); 
$graph->title->SetFont(FF_FONT1,FS_BOLD); 
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD); 
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD); 
$graph->Stroke(); 
?> 
Die absoluten Zahlen der Balken als Beschriftung wären nett? Dann fügen wir sie hinzu. 
Die folgenden Zeilen ergänzen die fehlende Beschriftung: 
$bplot->value->Show(); 
$bplot->value->SetFormat('%d'); 
$bplot->value->SetFont(FF_FONT1,FS_BOLD); 
$bplot->SetValuePos('center'); 
$graph->Add($bplot); 
Der gesamte Code sieht nun so aus: 
<?php 
include ("jpgraph/jpgraph.php"); 
include ("jpgraph/jpgraph_bar.php"); 
$datay=array(12,8,19,3,10,5);
11 
$graph = new Graph(300,200,"auto"); 
$graph->SetScale("textlin"); 
$graph->SetShadow(); 
$graph->img->SetMargin(40,30,20,40); 
$bplot = new BarPlot($datay); 
$bplot->SetFillColor('orange'); 
$bplot->SetWidth(1.0); 
$bplot->value->Show(); 
$bplot->value->SetFormat('%d'); 
$bplot->value->SetFont(FF_FONT1,FS_BOLD); 
$bplot->SetValuePos('center'); 
$graph->Add($bplot); 
$graph->title->Set("Bar graph"); 
$graph->xaxis->title->Set("X-title"); 
$graph->yaxis->title->Set("Y-title"); 
$graph->title->SetFont(FF_FONT1,FS_BOLD); 
$graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD); 
$graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD); 
$graph->Stroke(); 
?> 
8. Gantt-Diagramm 
Damit jeder von Euch dann seine eigenen Vorträge für die PHPUG planen kann, erzeugen wir 
jetzt noch ein Gantt-Diagramm. Das Projekt beginnt morgen und endet pünktlich am 1.7. zum 
nächsten Treffen. 
<?php 
include ("jpgraph/jpgraph.php"); 
include ("jpgraph/jpgraph_gantt.php"); 
$graph = new GanttGraph (0,0, "auto"); 
$activity = new GanttBar (0,"Project", "2004-06-04", "2004-07-01"); 
$graph->Add( $activity); 
$graph->Stroke(); 
?> 
Schon nicht schlecht - hat auch schon eine gewisse Ähnlichkeit mit MS Project, aber noch 
fehlen ein paar Dinge. Wie viel ist schon erledigt? Wann sind Meilensteine? Und nicht jeder 
rechnet in Kalenderwochen.
Als erstes fügen wir de Monate hinzu. 
$graph->ShowHeaders( GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH); 
Dann statt Kalenderwoche das Datum des ersten Tages der Woche. 
$graph->scale-> week->SetStyle(WEEKSTYLE_FIRSTDAY); 
Nun ändern wir die Monatsnamen in die Kurzschreibweise, so dass auch das Jahr mit 
angezeigt wird. 
$graph->scale-> month-> SetStyle( MONTHSTYLE_SHORTNAMEYEAR2); 
12 
Nun sieht es so aus: 
Fehlt noch der Meilenstein. 
$milestone = new MileStone(1,"Vortrag gehalten","2004-07-01","Vortrag"); 
$graph->Add( $milestone); 
Und die Anzeige, wie viel des Projekts schon erledigt wurde (z.B: 50%) 
$activity->progress->Set(0.5); 
Dann ist der vollständige Code jetzt: 
<?php 
include ("jpgraph/jpgraph.php"); 
include ("jpgraph/jpgraph_gantt.php"); 
$graph = new GanttGraph (0,0, "auto"); 
$graph->ShowHeaders( GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH); 
$graph->scale-> month-> SetStyle( MONTHSTYLE_SHORTNAMEYEAR2); 
$graph->scale-> week->SetStyle(WEEKSTYLE_FIRSTDAY); 
$activity = new GanttBar (0,"Project", "2004-06-04", "2004-07-01"); 
$activity->progress->Set(0.5) ; 
$graph->Add( $activity); 
$milestone = new MileStone(1,"Vortrag gehalten","2004-07-01","Vortrag"); 
$graph->Add( $milestone); 
$graph->Stroke(); 
?> 
Und erzeugt diese Grafik.
Hier noch mal ein weiteres Beispiel aus der Dokumentation was man mit Gantt-Diagrammen 
und den eingebauten Icons machen kann. 
13 
Dieser Code: 
<?php 
include ("jpgraph/jpgraph.php"); 
include ("jpgraph/jpgraph_gantt.php"); 
// Basic Gantt graph 
$graph = new GanttGraph(); 
$graph->title->Set("Using the builtin icons"); 
// Explicitely set the date range 
// (Autoscaling will of course also work) 
$graph->SetDateRange('2001-10-06','2002-4-10'); 
// 1.5 line spacing to make more room 
$graph->SetVMarginFactor(1.5); 
// Setup some nonstandard colors 
$graph->SetMarginColor('lightgreen@0.8'); 
$graph->SetBox(true,'yellow:0.6',2); 
$graph->SetFrame(true,'darkgreen',4); 
$graph->scale->divider->SetColor('yellow:0.6'); 
$graph->scale->dividerh->SetColor('yellow:0.6'); 
// Display month and year scale with the gridlines 
$graph->ShowHeaders(GANTT_HMONTH | GANTT_HYEAR); 
$graph->scale->month->grid->SetColor('gray'); 
$graph->scale->month->grid->Show(true); 
$graph->scale->year->grid->SetColor('gray'); 
$graph->scale->year->grid->Show(true); 
// For the titles we also add a minimum width of 100 pixels for the Task 
name column 
$graph->scale->actinfo->SetColTitles( 
array('Note','Task','Duration','Start','Finish'),array(30,100)); 
$graph->scale->actinfo->SetBackgroundColor('green:0.5@0.5'); 
$graph->scale->actinfo->SetFont(FF_ARIAL,FS_NORMAL,10); 
$graph->scale->actinfo->vgrid->SetStyle('solid'); 
$graph->scale->actinfo->vgrid->SetColor('gray'); 
// Uncomment this to keep the columns but show no headers 
//$graph->scale->actinfo->Show(false); 
// Setup the icons we want to use 
$erricon = new IconImage(GICON_FOLDER,0.6);
$startconicon = new IconImage(GICON_FOLDEROPEN,0.6); 
$endconicon = new IconImage(GICON_TEXTIMPORTANT,0.5); 
// Store the icons in the first column and use plain text in the others 
$data = array( 
array(0,array($erricon,"Pre-study","102 days","23 Nov '01","1 Mar '02") 
, "2001-11-23","2002-03-1",FF_ARIAL,FS_NORMAL,8), 
array(1,array($startconicon,"Prototype","21 days","26 Oct '01","16 Nov 
14 
'01"), 
"2001-10-26","2001-11-16",FF_ARIAL,FS_NORMAL,8), 
array(2,array($endconicon,"Report","12 days","1 Mar '02","13 Mar '02"), 
"2002-03-01","2002-03-13",FF_ARIAL,FS_NORMAL,8) 
); 
// Create the bars and add them to the gantt chart 
for($i=0; $i<count($data); ++$i) { 
$bar = new 
GanttBar($data[$i][0],$data[$i][1],$data[$i][2],$data[$i][3],"[50%]",10); 
if( count($data[$i])>4 ) 
$bar->title->SetFont($data[$i][4],$data[$i][5],$data[$i][6]); 
$bar->SetPattern(BAND_RDIAG,"yellow"); 
$bar->SetFillColor("gray"); 
$bar->progress->Set(0.5); 
$bar->progress->SetPattern(GANTT_SOLID,"darkgreen"); 
$bar->title- 
>SetCSIMTarget(array('#1'.$i,'#2'.$i,'#3'.$i,'#4'.$i,'#5'.$i),array('11'.$i 
,'22'.$i,'33'.$i)); 
$graph->Add($bar); 
} 
// Output the chart 
$graph->Stroke(); 
?> 
Liefert dieses: 
9. Der Cache 
JpGraph hat ein eingebautes Cacheing, um die Serverlast zu verringern. Die Verwendung ist 
relativ simpel. Als erstes muss das Caching aktiviert werden. Dazu müssen in der Configdatei 
jpg-config.inc 3 Variablen gesetzt werden. (Bei früheren Versionen der JpGraph wurde dies 
in der jpgraph.php vorgenommen.).
Die Variable CACHE_DIR gibt an, welches Verzeichnis verwendet werden soll. Der 
Webserver muss Schreibrechte für dieses Verzeichnis besitzen. Die Variablen USE_CACHE 
und READ_CACHE müssen auf true gesetzt werden. Nun kann man den Cache verwenden. 
Um den Cache zu verwenden, muss man beim Initialen Aufruf von Graph nun einen Timeout 
angeben. 
$graph = new Graph(300,200,"auto",60); 
Beim ersten Aufruf wird die Grafik erzeugt und in das Cacheverzeichnis gespeichert. Bei 
jedem weiteren Aufruf dieses Scipts innerhalb von 60 Minuten wird das Bild aus dem 
Cacheverzeichnis ausgeliefert und es wird kein weiterer Code für diesen Graphen ausgeführt. 
10. Ende 
Hier möchte ich enden mit der Einführung in die JpGraph Bibliothek. Wie ihr gesehen habt, 
ist es wirklich leicht zu recht ansehnlichen Ergebnissen zu kommen – gleichzeitig ist sie aber 
extrem leistungsfähig und dazu noch sehr gut dokumentiert. Alles zusammen also ein Stück 
Software, bei dem es sich wirklich lohnt, sich damit zu beschäftigen. 
11. Links 
15 
• http://www.aditus.nu/jpgraph 
die JpGraph-Bibliothek 
• http://dev.macxonline.net/gdlib/ 
Einführung in die GB-Lib von David (auch verlinkt unter http://www.phpug-hannover. 
de/material.php) 
• http://www.aditus.nu/jpgraph/jpg_proversion.php 
Informationen zur Lizenz von JpGraph

Weitere ähnliche Inhalte

Andere mochten auch

Autopräsentation2007
Autopräsentation2007Autopräsentation2007
Autopräsentation2007
Maxys
 
LAS PRISIONERAS
LAS PRISIONERASLAS PRISIONERAS
crear cuenta en slideshare
crear cuenta en slidesharecrear cuenta en slideshare
crear cuenta en slideshare
Alejandra Cujilema
 
Amberg
AmbergAmberg
Amberg
Hirschwald
 
Das Beste Aus2006
Das Beste Aus2006Das Beste Aus2006
Das Beste Aus2006
draco2111
 
Wie erstelle ich einen Publikationszeitplan
Wie erstelle ich einen PublikationszeitplanWie erstelle ich einen Publikationszeitplan
Wie erstelle ich einen Publikationszeitplan
Editage Germany
 
Artshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia Oquendo
Artshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia OquendoArtshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia Oquendo
Artshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia Oquendo
Sonia Oquendo
 
Social Media in der Assekuranz 2012 - Analyse der XING-Aktivitäten
Social Media in der Assekuranz 2012 - Analyse der XING-AktivitätenSocial Media in der Assekuranz 2012 - Analyse der XING-Aktivitäten
Social Media in der Assekuranz 2012 - Analyse der XING-Aktivitäten
V.E.R.S. Leipzig GmbH
 
Presentatie projecten 2010/2011
Presentatie projecten 2010/2011Presentatie projecten 2010/2011
Presentatie projecten 2010/2011
keesjanverplanke
 
10. Stufen.Des. Alkoholismus
10. Stufen.Des. Alkoholismus10. Stufen.Des. Alkoholismus
10. Stufen.Des. Alkoholismus
Abraxis
 
Mobile, Social, Local, Realtime
Mobile, Social, Local, RealtimeMobile, Social, Local, Realtime
Mobile, Social, Local, Realtime
Tim Bruysten
 
Kreisverkehr
KreisverkehrKreisverkehr
Kreisverkehr
draco2111
 
Heckscheiben
HeckscheibenHeckscheiben
Heckscheiben
draco2111
 
Computacion
ComputacionComputacion
Computacion
magui0193
 
Song Wird Erstellt am CTK 731
Song Wird  Erstellt am CTK 731Song Wird  Erstellt am CTK 731
Song Wird Erstellt am CTK 731
Alois Brinkmann
 
Verbotene Liebe 1
Verbotene Liebe 1Verbotene Liebe 1
Verbotene Liebe 1
Aster46
 
Suchmaschinen Optimierung
Suchmaschinen OptimierungSuchmaschinen Optimierung
Suchmaschinen Optimierung
ch.ch
 
Polbeo > Leipzig Monitor
Polbeo > Leipzig MonitorPolbeo > Leipzig Monitor
Polbeo > Leipzig Monitor
floriand
 
Neue Medienplattformen
Neue Medienplattformen Neue Medienplattformen
Neue Medienplattformen
modabot
 

Andere mochten auch (20)

Autopräsentation2007
Autopräsentation2007Autopräsentation2007
Autopräsentation2007
 
LAS PRISIONERAS
LAS PRISIONERASLAS PRISIONERAS
LAS PRISIONERAS
 
crear cuenta en slideshare
crear cuenta en slidesharecrear cuenta en slideshare
crear cuenta en slideshare
 
Amberg
AmbergAmberg
Amberg
 
Das Beste Aus2006
Das Beste Aus2006Das Beste Aus2006
Das Beste Aus2006
 
Wie erstelle ich einen Publikationszeitplan
Wie erstelle ich einen PublikationszeitplanWie erstelle ich einen Publikationszeitplan
Wie erstelle ich einen Publikationszeitplan
 
Artshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia Oquendo
Artshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia OquendoArtshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia Oquendo
Artshirt4you Prospekt design "let´surf" von Katja Matthes & Sonia Oquendo
 
Winter Finland
Winter FinlandWinter Finland
Winter Finland
 
Social Media in der Assekuranz 2012 - Analyse der XING-Aktivitäten
Social Media in der Assekuranz 2012 - Analyse der XING-AktivitätenSocial Media in der Assekuranz 2012 - Analyse der XING-Aktivitäten
Social Media in der Assekuranz 2012 - Analyse der XING-Aktivitäten
 
Presentatie projecten 2010/2011
Presentatie projecten 2010/2011Presentatie projecten 2010/2011
Presentatie projecten 2010/2011
 
10. Stufen.Des. Alkoholismus
10. Stufen.Des. Alkoholismus10. Stufen.Des. Alkoholismus
10. Stufen.Des. Alkoholismus
 
Mobile, Social, Local, Realtime
Mobile, Social, Local, RealtimeMobile, Social, Local, Realtime
Mobile, Social, Local, Realtime
 
Kreisverkehr
KreisverkehrKreisverkehr
Kreisverkehr
 
Heckscheiben
HeckscheibenHeckscheiben
Heckscheiben
 
Computacion
ComputacionComputacion
Computacion
 
Song Wird Erstellt am CTK 731
Song Wird  Erstellt am CTK 731Song Wird  Erstellt am CTK 731
Song Wird Erstellt am CTK 731
 
Verbotene Liebe 1
Verbotene Liebe 1Verbotene Liebe 1
Verbotene Liebe 1
 
Suchmaschinen Optimierung
Suchmaschinen OptimierungSuchmaschinen Optimierung
Suchmaschinen Optimierung
 
Polbeo > Leipzig Monitor
Polbeo > Leipzig MonitorPolbeo > Leipzig Monitor
Polbeo > Leipzig Monitor
 
Neue Medienplattformen
Neue Medienplattformen Neue Medienplattformen
Neue Medienplattformen
 

Ähnlich wie Jpgraph - eine Einführung

Shortcodes erstellen mit WordPress
Shortcodes erstellen mit WordPressShortcodes erstellen mit WordPress
Shortcodes erstellen mit WordPress
Torsten Landsiedel
 
TYPO3 CMS 7.6 - Die Neuerungen - pluswerk
TYPO3 CMS 7.6 - Die Neuerungen - pluswerkTYPO3 CMS 7.6 - Die Neuerungen - pluswerk
TYPO3 CMS 7.6 - Die Neuerungen - pluswerk
die.agilen GmbH
 
TYPO3 CMS 7.2 - Die Neuerungen - pluswerk
TYPO3 CMS 7.2 - Die Neuerungen - pluswerkTYPO3 CMS 7.2 - Die Neuerungen - pluswerk
TYPO3 CMS 7.2 - Die Neuerungen - pluswerk
die.agilen GmbH
 
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
die.agilen GmbH
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
openForce Information Technology GesmbH
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
Manfred Steyer
 
Dynamische Websites mit XML
Dynamische Websites mit XMLDynamische Websites mit XML
Dynamische Websites mit XML
Stephan Schmidt
 
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerkTYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
die.agilen GmbH
 
ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel
ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan EngelApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel
ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel
OPITZ CONSULTING Deutschland
 
Einsteiger Workshop
Einsteiger WorkshopEinsteiger Workshop
Einsteiger Workshop
FunThomas424242
 
Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle Tools
Christian Gohmann
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelines
Alex Kellner
 
Open icf (open identity connector framework) @ forgerock deutsch
Open icf (open identity connector framework) @ forgerock   deutschOpen icf (open identity connector framework) @ forgerock   deutsch
Open icf (open identity connector framework) @ forgerock deutsch
Hanns Nolan
 
Einführung in die webOS Programmierung
Einführung in die webOS ProgrammierungEinführung in die webOS Programmierung
Einführung in die webOS Programmierung
Markus Leutwyler
 
Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)
Ulrike Schwinn
 
Polymorphic Table Functions in 18c
Polymorphic Table Functions in 18cPolymorphic Table Functions in 18c
Polymorphic Table Functions in 18c
Andrej Pashchenko
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1
Manfred Steyer
 
Grails 0.3-SNAPSHOT Presentation WJAX 2006
Grails 0.3-SNAPSHOT Presentation WJAX 2006Grails 0.3-SNAPSHOT Presentation WJAX 2006
Grails 0.3-SNAPSHOT Presentation WJAX 2006
Sven Haiges
 

Ähnlich wie Jpgraph - eine Einführung (20)

Shortcodes erstellen mit WordPress
Shortcodes erstellen mit WordPressShortcodes erstellen mit WordPress
Shortcodes erstellen mit WordPress
 
TYPO3 CMS 7.6 - Die Neuerungen - pluswerk
TYPO3 CMS 7.6 - Die Neuerungen - pluswerkTYPO3 CMS 7.6 - Die Neuerungen - pluswerk
TYPO3 CMS 7.6 - Die Neuerungen - pluswerk
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
TYPO3 CMS 7.2 - Die Neuerungen - pluswerk
TYPO3 CMS 7.2 - Die Neuerungen - pluswerkTYPO3 CMS 7.2 - Die Neuerungen - pluswerk
TYPO3 CMS 7.2 - Die Neuerungen - pluswerk
 
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerkTYPO3 CMS 7.3 - Die Neuerungen - pluswerk
TYPO3 CMS 7.3 - Die Neuerungen - pluswerk
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
 
Dynamische Websites mit XML
Dynamische Websites mit XMLDynamische Websites mit XML
Dynamische Websites mit XML
 
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerkTYPO3 CMS 7.4 - Die Neuerungen - pluswerk
TYPO3 CMS 7.4 - Die Neuerungen - pluswerk
 
ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel
ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan EngelApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel
ApEx effektiv - DOAG 2010 - OPITZ CONSULTING - Stephan Engel
 
Einsteiger Workshop
Einsteiger WorkshopEinsteiger Workshop
Einsteiger Workshop
 
Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle Tools
 
TYPO3 coding guidelines
TYPO3 coding guidelinesTYPO3 coding guidelines
TYPO3 coding guidelines
 
Open icf (open identity connector framework) @ forgerock deutsch
Open icf (open identity connector framework) @ forgerock   deutschOpen icf (open identity connector framework) @ forgerock   deutsch
Open icf (open identity connector framework) @ forgerock deutsch
 
Einführung in die webOS Programmierung
Einführung in die webOS ProgrammierungEinführung in die webOS Programmierung
Einführung in die webOS Programmierung
 
Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)Ausgewählte PL/SQL Packages (3)
Ausgewählte PL/SQL Packages (3)
 
Mvc public
Mvc publicMvc public
Mvc public
 
Polymorphic Table Functions in 18c
Polymorphic Table Functions in 18cPolymorphic Table Functions in 18c
Polymorphic Table Functions in 18c
 
.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1.NET Summit 2016 in München: ASP.NET Core 1
.NET Summit 2016 in München: ASP.NET Core 1
 
Grails 0.3-SNAPSHOT Presentation WJAX 2006
Grails 0.3-SNAPSHOT Presentation WJAX 2006Grails 0.3-SNAPSHOT Presentation WJAX 2006
Grails 0.3-SNAPSHOT Presentation WJAX 2006
 

Mehr von frankstaude

State of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
State of TV – Vortragsaufzeichnung, aktueller Stand und AusblickState of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
State of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
frankstaude
 
Automatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
Automatisierung in Zeiten von Social Media, Messenger-Diensten und BotsAutomatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
Automatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
frankstaude
 
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
frankstaude
 
TablePress - Warum und welche Erweiterungen gibt es?
TablePress - Warum und welche Erweiterungen gibt es?TablePress - Warum und welche Erweiterungen gibt es?
TablePress - Warum und welche Erweiterungen gibt es?
frankstaude
 
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der SchuleGamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
frankstaude
 
Erneute Bestellung in WooCommerce
Erneute Bestellung in WooCommerceErneute Bestellung in WooCommerce
Erneute Bestellung in WooCommerce
frankstaude
 
Gamification mit WordPress
Gamification mit WordPressGamification mit WordPress
Gamification mit WordPress
frankstaude
 
Mobile Apps mit WordPress
Mobile Apps mit WordPressMobile Apps mit WordPress
Mobile Apps mit WordPress
frankstaude
 
Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?
frankstaude
 
State of TV - Stand der Vortragsaufzeichnung 11/2017
State of TV - Stand der Vortragsaufzeichnung 11/2017State of TV - Stand der Vortragsaufzeichnung 11/2017
State of TV - Stand der Vortragsaufzeichnung 11/2017
frankstaude
 
Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?
frankstaude
 
Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?
frankstaude
 
Themes – Wieso, Weshalb, Warum!?
Themes – Wieso, Weshalb, Warum!?Themes – Wieso, Weshalb, Warum!?
Themes – Wieso, Weshalb, Warum!?
frankstaude
 
Eine WordPress Meetup Webseite auf Autopilot
Eine WordPress Meetup Webseite auf AutopilotEine WordPress Meetup Webseite auf Autopilot
Eine WordPress Meetup Webseite auf Autopilot
frankstaude
 
Vorträge aufzeichnen ohne Nachbearbeitung
Vorträge aufzeichnen ohne NachbearbeitungVorträge aufzeichnen ohne Nachbearbeitung
Vorträge aufzeichnen ohne Nachbearbeitung
frankstaude
 
Nürnberg WordPress Meetup - Custom Post Types mit PODS.io
Nürnberg WordPress Meetup - Custom Post Types mit PODS.ioNürnberg WordPress Meetup - Custom Post Types mit PODS.io
Nürnberg WordPress Meetup - Custom Post Types mit PODS.io
frankstaude
 
WordPress - eigene Plugins erstellen
WordPress - eigene Plugins erstellenWordPress - eigene Plugins erstellen
WordPress - eigene Plugins erstellen
frankstaude
 
Custom Post Types mit PODS.io
Custom Post Types mit PODS.ioCustom Post Types mit PODS.io
Custom Post Types mit PODS.io
frankstaude
 
Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?
frankstaude
 
Pressmatic
PressmaticPressmatic
Pressmatic
frankstaude
 

Mehr von frankstaude (20)

State of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
State of TV – Vortragsaufzeichnung, aktueller Stand und AusblickState of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
State of TV – Vortragsaufzeichnung, aktueller Stand und Ausblick
 
Automatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
Automatisierung in Zeiten von Social Media, Messenger-Diensten und BotsAutomatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
Automatisierung in Zeiten von Social Media, Messenger-Diensten und Bots
 
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
CPT UI und ACF - Wie werden Inhalte sinnvoll strukturiert?
 
TablePress - Warum und welche Erweiterungen gibt es?
TablePress - Warum und welche Erweiterungen gibt es?TablePress - Warum und welche Erweiterungen gibt es?
TablePress - Warum und welche Erweiterungen gibt es?
 
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der SchuleGamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
Gamifizierung mit WordPress – Eine Einführung und Einsatz in der Schule
 
Erneute Bestellung in WooCommerce
Erneute Bestellung in WooCommerceErneute Bestellung in WooCommerce
Erneute Bestellung in WooCommerce
 
Gamification mit WordPress
Gamification mit WordPressGamification mit WordPress
Gamification mit WordPress
 
Mobile Apps mit WordPress
Mobile Apps mit WordPressMobile Apps mit WordPress
Mobile Apps mit WordPress
 
Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?
 
State of TV - Stand der Vortragsaufzeichnung 11/2017
State of TV - Stand der Vortragsaufzeichnung 11/2017State of TV - Stand der Vortragsaufzeichnung 11/2017
State of TV - Stand der Vortragsaufzeichnung 11/2017
 
Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?Suchst du noch - Oder findest du schon?
Suchst du noch - Oder findest du schon?
 
Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?
 
Themes – Wieso, Weshalb, Warum!?
Themes – Wieso, Weshalb, Warum!?Themes – Wieso, Weshalb, Warum!?
Themes – Wieso, Weshalb, Warum!?
 
Eine WordPress Meetup Webseite auf Autopilot
Eine WordPress Meetup Webseite auf AutopilotEine WordPress Meetup Webseite auf Autopilot
Eine WordPress Meetup Webseite auf Autopilot
 
Vorträge aufzeichnen ohne Nachbearbeitung
Vorträge aufzeichnen ohne NachbearbeitungVorträge aufzeichnen ohne Nachbearbeitung
Vorträge aufzeichnen ohne Nachbearbeitung
 
Nürnberg WordPress Meetup - Custom Post Types mit PODS.io
Nürnberg WordPress Meetup - Custom Post Types mit PODS.ioNürnberg WordPress Meetup - Custom Post Types mit PODS.io
Nürnberg WordPress Meetup - Custom Post Types mit PODS.io
 
WordPress - eigene Plugins erstellen
WordPress - eigene Plugins erstellenWordPress - eigene Plugins erstellen
WordPress - eigene Plugins erstellen
 
Custom Post Types mit PODS.io
Custom Post Types mit PODS.ioCustom Post Types mit PODS.io
Custom Post Types mit PODS.io
 
Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?Suchst du noch? Oder findest du schon?
Suchst du noch? Oder findest du schon?
 
Pressmatic
PressmaticPressmatic
Pressmatic
 

Jpgraph - eine Einführung

  • 1. JpGraph – eine Einführung Vortrag vom 03.06.2004 auf der PHP-Usergroup Hannover von Frank Staude <staude@trilos.de>
  • 2. 2 Inhalt 1. Einleitung ........................................................................................................................... 3 2. Features .............................................................................................................................. 3 3. Lizenz der JpGraph ............................................................................................................ 3 4. Diagrammübersicht ............................................................................................................ 4 5. Installation.......................................................................................................................... 6 6. Tortendiagramm................................................................................................................. 7 7. Balkendiagramm ................................................................................................................ 9 8. Gantt-Diagramm............................................................................................................... 11 9. der Cache.......................................................................................................................... 14 10. Ende.............................................................................................................................. 15 11. Links............................................................................................................................. 15
  • 3. 1. Einleitung David hat es in seiner Einführung in der GD-Lib am 2.10.2003 bereits geschrieben. "Ich sehe keinen Sinn darin, Linien und Flächen in Bildern zu generieren, also lasse ich dieses Anwendungsgebiet außen vor. Wer Diagramme dynamisch generieren möchte, kommt an JpGraph (www.aditus.nu/jpgraph) nicht vorbei, die einem diese ganze Arbeit gut abnimmt." 2. Features (eine Auswahl) • Erzeugt kleine Grafiken. Die durchschnittliche Größe einer Grafik 300x200 3 Pixel ist um die 2 Kb. • JpGraph arbeitet sowohl mit der GD als auch mit der GD2 Bibliothek zusammen und kann selbstständig erkennen welche vorhanden ist. • Unterstützt Gantt Diagramme (für z.B: Projektplanungssoftware) • Unterstützung von TTF-Fonts zur Diagrammbeschriftung. • Kann Gif, PNG und JPG erzeugen. • Über 400 benannte Farben • Hintergrundbilder in Graphen sind möglich. • Serverentlastung durch cachingmechanismen. • Barcodeerzeugung (in der Kommerziellen Version) • Sehr gute Dokumentation (150 Seiten mit vielen Beispielen und Klassenreferenz) • Unterstützung von Alpha blending • Über 200 Länderflaggen eingebaut • Diverse Graphentypen (siehe "Diagrammübersicht") 3. Lizenz der JpGraph Die JpGraph Bibliothek ist in einer Duallizenz erhältlich. Für nicht-kommerzielle Anwendungen unterliegt sie der QLP (Qt-Lizenz) und die Professional Version für kommerzielle Anwendungen (inkl. Barcodegenerierung, Windrosen und Odometer). Eine Single-Server Lizenz kostet 85 EUR + MwSt. Weitere Informationen zur Lizenz finden sich unter http://www.aditus.nu/jpgraph/jpg_proversion.php 2D-Barcode
  • 4. 4. Diagrammübersicht Ein Auswahl möglicher Diagramme/Graphen die mit JpGraph möglich sind. Alle hier abgebildeten Diagramme sind aus der Dokumentation und sind dort inkl. Sourcecode beschrieben. 4
  • 5. 5
  • 6. 5. Installation Nach dem entpacken des Archivs hat man zwei Verzeichnisse vorliegen. Docs und src. In Docs befindet sich die Dokumentation und in src der PHP-Code der JpGraph. Den Inhalt des src Verzeichnisses in ein Verzeichnis auf dem Server kopieren aus dem man es included oder welches man in den includepfad aufnimmt. 6 Im Detail werden folgenden Dateien benötigt. Jpgraph.php – ist die Hauptdatei die immer included wird. Und den Plot-Erweiterungen jpgraph_log.php jpgraph_line.php jpgraph_bar.php jpgraph_error.php, jpgraph_scatter.php jpgraph_spider.php jpgraph_pie.php jpgraph_pie3d.php jpgraph_gantt.php jpgraph_radar.php
  • 7. 7 jpgraph_polar.php jpgraph_regstat.php jpgraph_stock.php jpgraph_gradient.php jpgraph_gb2312.php jpgraph_plotmark.php jpgraph_flags.php imgdata_*.inc flags*.dat jpgraph_canvas.php jpgraph_canvtools.php 6. Tortendiagramm Los geht’s…Als erstes bauen wir ein einfaches Tortendiagramm. Dazu benötigen wir: Die JpGraph-Lib include ("jpgraph/jpgraph.php"); Außerdem das Plotmodul für Tortendiagramme. include ("jpgraph/jpgraph_pie.php"); Nun brauchen wir noch ein paar Werte $data = array(40,60,21,33); Als nächstes bauen wir die Grafik. Dazu erzeugen wir ein neues Grafikobjekt in der Größe 300 x 200 Pixel. $graph = new PieGraph(300,200,"auto"); Nun noch dem ganzen einen Titel geben $graph->title->Set("Example 1 Pie plot"); $graph->title->SetFont(FF_VERDANA,FS_BOLD,14); $graph->title->SetColor("black"); Die Werte kommen nun in ein Tortenobject $p1 = new PiePlot($data); Den Graphen den das Tortenobject liefert tragen wir in die Grafik ein. $graph->Add($p1); Und nun noch ausgeben.
  • 8. 8 $graph->Stroke(); Das gesamte PHP-Sktipt sieht nun so aus: <? include ("jpgraph/jpgraph.php"); include ("jpgraph/jpgraph_pie.php"); $data = array(40,60,21,33); $graph = new PieGraph(300,200,"auto"); $graph->title->Set("Example 1 Pie plot"); $graph->title->SetFont(FF_VERDANA,FS_BOLD,14); $graph->title->SetColor("black"); $p1 = new PiePlot($data); $graph->Add($p1); $graph->Stroke(); ?> Und liefert als Ergebnis folgende Grafik: Das sieht nun noch ein bisschen langweilig aus. Als erstes erzeugen wir ein array mit den Beschriftungen: $legend = array("Perl","PHP","C","Tcl"); Anschließend wird die Legende dem Graphen hinzugefügt. $p1->SetLegends($legend); Der Graph muss nun noch ein bisschen nach links, damit rechts Platz für die Beschriftung ist. $p1->SetCenter(0.4); Und nun noch ein bisschen Schatten, damit es hübscher aussieht. $p1->SetShadow(); Damit sieht unser Programm nun so aus <?
  • 9. 9 include ("jpgraph/jpgraph.php"); include ("jpgraph/jpgraph_pie.php"); $data = array(40,60,21,33); $legend = array("Perl","PHP","C","Tcl"); $graph = new PieGraph(300,200,"auto"); $graph->title->Set("Example 1 Pie plot"); $graph->title->SetFont(FF_VERDANA,FS_BOLD,14); $graph->title->SetColor("black"); $p1 = new PiePlot($data); $p1->SetLegends($legend); $p1->SetCenter(0.4); $p1->SetShadow(); $graph->Add($p1); $graph->Stroke(); ?> Und erzeugt diese Grafik. Ok, machen wir Schluss mit den Torten und bauen lieber "Schoko-Riegel". 7. Balkendiagramm Als nächstes Erzeugen wir dieses Balkendiagramm. Der Programmcode dazu sieht folgendermaßen aus. <?php include ("jpgraph/jpgraph.php");
  • 10. 10 include ("jpgraph/jpgraph_bar.php"); $datay=array(12,8,19,3,10,5); $graph = new Graph(300,200,"auto"); $graph->SetScale("textlin"); $graph->SetShadow(); $graph->img->SetMargin(40,30,20,40); $bplot = new BarPlot($datay); $bplot->SetFillColor('orange'); $bplot->SetWidth(1.0); $graph->Add($bplot); $graph->title->Set("Bar graph"); $graph->xaxis->title->Set("X-title"); $graph->yaxis->title->Set("Y-title"); $graph->title->SetFont(FF_FONT1,FS_BOLD); $graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD); $graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD); $graph->Stroke(); ?> Die absoluten Zahlen der Balken als Beschriftung wären nett? Dann fügen wir sie hinzu. Die folgenden Zeilen ergänzen die fehlende Beschriftung: $bplot->value->Show(); $bplot->value->SetFormat('%d'); $bplot->value->SetFont(FF_FONT1,FS_BOLD); $bplot->SetValuePos('center'); $graph->Add($bplot); Der gesamte Code sieht nun so aus: <?php include ("jpgraph/jpgraph.php"); include ("jpgraph/jpgraph_bar.php"); $datay=array(12,8,19,3,10,5);
  • 11. 11 $graph = new Graph(300,200,"auto"); $graph->SetScale("textlin"); $graph->SetShadow(); $graph->img->SetMargin(40,30,20,40); $bplot = new BarPlot($datay); $bplot->SetFillColor('orange'); $bplot->SetWidth(1.0); $bplot->value->Show(); $bplot->value->SetFormat('%d'); $bplot->value->SetFont(FF_FONT1,FS_BOLD); $bplot->SetValuePos('center'); $graph->Add($bplot); $graph->title->Set("Bar graph"); $graph->xaxis->title->Set("X-title"); $graph->yaxis->title->Set("Y-title"); $graph->title->SetFont(FF_FONT1,FS_BOLD); $graph->yaxis->title->SetFont(FF_FONT1,FS_BOLD); $graph->xaxis->title->SetFont(FF_FONT1,FS_BOLD); $graph->Stroke(); ?> 8. Gantt-Diagramm Damit jeder von Euch dann seine eigenen Vorträge für die PHPUG planen kann, erzeugen wir jetzt noch ein Gantt-Diagramm. Das Projekt beginnt morgen und endet pünktlich am 1.7. zum nächsten Treffen. <?php include ("jpgraph/jpgraph.php"); include ("jpgraph/jpgraph_gantt.php"); $graph = new GanttGraph (0,0, "auto"); $activity = new GanttBar (0,"Project", "2004-06-04", "2004-07-01"); $graph->Add( $activity); $graph->Stroke(); ?> Schon nicht schlecht - hat auch schon eine gewisse Ähnlichkeit mit MS Project, aber noch fehlen ein paar Dinge. Wie viel ist schon erledigt? Wann sind Meilensteine? Und nicht jeder rechnet in Kalenderwochen.
  • 12. Als erstes fügen wir de Monate hinzu. $graph->ShowHeaders( GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH); Dann statt Kalenderwoche das Datum des ersten Tages der Woche. $graph->scale-> week->SetStyle(WEEKSTYLE_FIRSTDAY); Nun ändern wir die Monatsnamen in die Kurzschreibweise, so dass auch das Jahr mit angezeigt wird. $graph->scale-> month-> SetStyle( MONTHSTYLE_SHORTNAMEYEAR2); 12 Nun sieht es so aus: Fehlt noch der Meilenstein. $milestone = new MileStone(1,"Vortrag gehalten","2004-07-01","Vortrag"); $graph->Add( $milestone); Und die Anzeige, wie viel des Projekts schon erledigt wurde (z.B: 50%) $activity->progress->Set(0.5); Dann ist der vollständige Code jetzt: <?php include ("jpgraph/jpgraph.php"); include ("jpgraph/jpgraph_gantt.php"); $graph = new GanttGraph (0,0, "auto"); $graph->ShowHeaders( GANTT_HDAY | GANTT_HWEEK | GANTT_HMONTH); $graph->scale-> month-> SetStyle( MONTHSTYLE_SHORTNAMEYEAR2); $graph->scale-> week->SetStyle(WEEKSTYLE_FIRSTDAY); $activity = new GanttBar (0,"Project", "2004-06-04", "2004-07-01"); $activity->progress->Set(0.5) ; $graph->Add( $activity); $milestone = new MileStone(1,"Vortrag gehalten","2004-07-01","Vortrag"); $graph->Add( $milestone); $graph->Stroke(); ?> Und erzeugt diese Grafik.
  • 13. Hier noch mal ein weiteres Beispiel aus der Dokumentation was man mit Gantt-Diagrammen und den eingebauten Icons machen kann. 13 Dieser Code: <?php include ("jpgraph/jpgraph.php"); include ("jpgraph/jpgraph_gantt.php"); // Basic Gantt graph $graph = new GanttGraph(); $graph->title->Set("Using the builtin icons"); // Explicitely set the date range // (Autoscaling will of course also work) $graph->SetDateRange('2001-10-06','2002-4-10'); // 1.5 line spacing to make more room $graph->SetVMarginFactor(1.5); // Setup some nonstandard colors $graph->SetMarginColor('lightgreen@0.8'); $graph->SetBox(true,'yellow:0.6',2); $graph->SetFrame(true,'darkgreen',4); $graph->scale->divider->SetColor('yellow:0.6'); $graph->scale->dividerh->SetColor('yellow:0.6'); // Display month and year scale with the gridlines $graph->ShowHeaders(GANTT_HMONTH | GANTT_HYEAR); $graph->scale->month->grid->SetColor('gray'); $graph->scale->month->grid->Show(true); $graph->scale->year->grid->SetColor('gray'); $graph->scale->year->grid->Show(true); // For the titles we also add a minimum width of 100 pixels for the Task name column $graph->scale->actinfo->SetColTitles( array('Note','Task','Duration','Start','Finish'),array(30,100)); $graph->scale->actinfo->SetBackgroundColor('green:0.5@0.5'); $graph->scale->actinfo->SetFont(FF_ARIAL,FS_NORMAL,10); $graph->scale->actinfo->vgrid->SetStyle('solid'); $graph->scale->actinfo->vgrid->SetColor('gray'); // Uncomment this to keep the columns but show no headers //$graph->scale->actinfo->Show(false); // Setup the icons we want to use $erricon = new IconImage(GICON_FOLDER,0.6);
  • 14. $startconicon = new IconImage(GICON_FOLDEROPEN,0.6); $endconicon = new IconImage(GICON_TEXTIMPORTANT,0.5); // Store the icons in the first column and use plain text in the others $data = array( array(0,array($erricon,"Pre-study","102 days","23 Nov '01","1 Mar '02") , "2001-11-23","2002-03-1",FF_ARIAL,FS_NORMAL,8), array(1,array($startconicon,"Prototype","21 days","26 Oct '01","16 Nov 14 '01"), "2001-10-26","2001-11-16",FF_ARIAL,FS_NORMAL,8), array(2,array($endconicon,"Report","12 days","1 Mar '02","13 Mar '02"), "2002-03-01","2002-03-13",FF_ARIAL,FS_NORMAL,8) ); // Create the bars and add them to the gantt chart for($i=0; $i<count($data); ++$i) { $bar = new GanttBar($data[$i][0],$data[$i][1],$data[$i][2],$data[$i][3],"[50%]",10); if( count($data[$i])>4 ) $bar->title->SetFont($data[$i][4],$data[$i][5],$data[$i][6]); $bar->SetPattern(BAND_RDIAG,"yellow"); $bar->SetFillColor("gray"); $bar->progress->Set(0.5); $bar->progress->SetPattern(GANTT_SOLID,"darkgreen"); $bar->title- >SetCSIMTarget(array('#1'.$i,'#2'.$i,'#3'.$i,'#4'.$i,'#5'.$i),array('11'.$i ,'22'.$i,'33'.$i)); $graph->Add($bar); } // Output the chart $graph->Stroke(); ?> Liefert dieses: 9. Der Cache JpGraph hat ein eingebautes Cacheing, um die Serverlast zu verringern. Die Verwendung ist relativ simpel. Als erstes muss das Caching aktiviert werden. Dazu müssen in der Configdatei jpg-config.inc 3 Variablen gesetzt werden. (Bei früheren Versionen der JpGraph wurde dies in der jpgraph.php vorgenommen.).
  • 15. Die Variable CACHE_DIR gibt an, welches Verzeichnis verwendet werden soll. Der Webserver muss Schreibrechte für dieses Verzeichnis besitzen. Die Variablen USE_CACHE und READ_CACHE müssen auf true gesetzt werden. Nun kann man den Cache verwenden. Um den Cache zu verwenden, muss man beim Initialen Aufruf von Graph nun einen Timeout angeben. $graph = new Graph(300,200,"auto",60); Beim ersten Aufruf wird die Grafik erzeugt und in das Cacheverzeichnis gespeichert. Bei jedem weiteren Aufruf dieses Scipts innerhalb von 60 Minuten wird das Bild aus dem Cacheverzeichnis ausgeliefert und es wird kein weiterer Code für diesen Graphen ausgeführt. 10. Ende Hier möchte ich enden mit der Einführung in die JpGraph Bibliothek. Wie ihr gesehen habt, ist es wirklich leicht zu recht ansehnlichen Ergebnissen zu kommen – gleichzeitig ist sie aber extrem leistungsfähig und dazu noch sehr gut dokumentiert. Alles zusammen also ein Stück Software, bei dem es sich wirklich lohnt, sich damit zu beschäftigen. 11. Links 15 • http://www.aditus.nu/jpgraph die JpGraph-Bibliothek • http://dev.macxonline.net/gdlib/ Einführung in die GB-Lib von David (auch verlinkt unter http://www.phpug-hannover. de/material.php) • http://www.aditus.nu/jpgraph/jpg_proversion.php Informationen zur Lizenz von JpGraph