Posts mit dem Label amcharts werden angezeigt. Alle Posts anzeigen
Posts mit dem Label amcharts werden angezeigt. Alle Posts anzeigen

Tutorial - Wetterdaten Diagramme mit amcharts - Teil 1 - Grundlagen

Tutorial - Wetterdaten mit amcharts


Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch

Einleitung:


Ein Tutorial über die Darstellung von Wetterdaten mit amcharts oder amstockcharts.

Für dieses Beispiel verwende ich die stockcharts. Diese bieten einige Vorteile in Bezug auf die Darstellung grosser Datenmengen und erlauben auch mehrere "panels" in einem Diagramm.

Hier ein Bild von einem Diagramm mit 2 Panels und 3 Graphen mit der Beschreibung wichtiger Elemente:

Panel 1 mit Temperatur und Taupunkt. Panel 2 mit Luftfeuchtigkeit.


Installation und Test


Installation von amstockchart:

Für dieses Beispiel wird Version 3.2 verwendet.

1. Download von "JavaScript Stock Chart" (http://www.amcharts.com/download/)
2. Entpacken und in ein Verzeichnis auf den Webserver laden.

Test:
1. Ein Beispiel im Ordner "samples" öffnen.
(Evtl. müssen in den Beispieldateien die Pfade zu den .js Dateien angepasst werden.)


Ein erster einfacher Chart


Dieses erste Diagramm enthält nur ein "Panel" mit einem "Graph". Es stellt nur den Wert Temperatur dar. Später kommen weitere dazu (hum, pressure).

Die Wetterdaten kommen meist aus einer Datenbank (MySQL etc.) In diesem Beispiel werden die Daten aber noch innerhalb des amchart Script ausgelesen. (Datenbankanbindung wir später in Teil 3 beschrieben.)


1. Diagramm Script 


Erstellt eine php Datei mit folgendem Inhalt:

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">


        <link rel="stylesheet" href="amcharts/style.css" type="text/css">
        <script src="amcharts/amcharts.js" type="text/javascript"></script>
        <script src="amcharts/serial.js" type="text/javascript"></script>
        <script src="amcharts/amstock.js" type="text/javascript"></script>    
    
        <script type="text/javascript">
        
        // Start amcharts

        // Chart Daten
        var chartData = [   Hier kommen die Daten rein  ];

        // Start StockChart
        AmCharts.makeChart("chartdiv", 
        {
        
            //Chart Einstellungen
            type: "stock",
            pathToImages: "../amcharts/images/",
            
            //Datesets definieren
            dataSets: 
            [
            {

                fieldMappings: 
                [
                {
                    fromField: "t",
                    toField: "t"
                }
                ],
                
                dataProvider: chartData,
                categoryField: "date",
            }
            ],
            
            //Zeitachse (minPeriod: "mm" für minuten "DD" für Tage)
            categoryAxesSettings:
            {
                minPeriod: "mm",
                maxSeries: 1000
            },

            //Chart Panels
            panels: 
            [
            {
                title: "Panel 1",
                percentHeight: 100,
                
                //Panel graphs (Datenlinie)
                stockGraphs: 
                [
                {
                    id: "g1",
                    title: "Temperature",
                    valueField: "t",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                }
                ],
                
                //Panel Legende
                stockLegend: 
                {
                    valueTextRegular: "[[value]]",
                    markerType: "square"
                }
            }
            ],

            //chart scrollbar
            chartScrollbarSettings: 
            {
                enabled: false
            },
            
            //Chart Cursor
            chartCursorSettings: 
            {
                valueBalloonsEnabled: true,
                graphBulletSize: 1
            },
            
            //chart period selector
            periodSelector: 
            {
                inputFieldsEnabled: false,
                periods: 
                [
                {
                    period: "MAX",
                    label: "MAX"
                }
                ]
            },
            
            // Einstellungen für alle Panels
            panelsSettings: 
            {
                usePrefixes: false
            }            
        }
        );
        </script>
      
    </head>

    <body>

        <div id="chartdiv" style="width:100%; height:600px;"></div>

    </body>

</html>

(Evtl. noch die Pfade zum amcharts Ordner anpassen)


 2. Daten

Dieses Diagramm enthält aber noch keine Daten. Der entsprechende Bereich ist noch leer.

var chartData = [  Hier kommen die Daten rein ];


Eine Datenzeile (hier deren zwei) sieht in diesem Beispiel so aus:

{date: new Date(2013,10,25,0,0),t:3.7,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,5),t:3.7,h:90.0,p:1022.9}

Zuerst das Datum (25. Nov. 2013) und die Zeit 00:00 und 00:05. Dann die Werte für Temperatur (t), humity (h) und pressure (p) Die einzelnen Datenzeilen werden mit einem abschließenden Komma getrennt.

Zudem sollte folgendes berücksichtigt werden :

 - Im javascript Datum ist der Monat Januar nicht 1 sondern 0. (daher Nov und nicht Okt.)
 - Kein Trennkomma nach dem letzten Datensatz


Hier einige Datenzeilen an entsprechender Stelle im Diagrammscript:

var chartData = [  
{date: new Date(2013,10,25,0,0),t:3.7,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,5),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,10),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,15),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,20),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,25),t:3.5,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,30),t:3.5,h:89.0,p:1023.1},
{date: new Date(2013,10,25,0,35),t:3.2,h:87.0,p:1023.1},
{date: new Date(2013,10,25,0,40),t:3.2,h:86.0,p:1023.1},
{date: new Date(2013,10,25,0,45),t:3.1,h:85.0,p:1023.1},
{date: new Date(2013,10,25,0,50),t:2.9,h:85.0,p:1023.3},
{date: new Date(2013,10,25,0,55),t:2.8,h:84.0,p:1023.3},
{date: new Date(2013,10,25,1,0),t:2.6,h:84.0,p:1023.3} 
];


Nun sollte das Diagramm getestet werden.

Das fertige Diagramm













Gegebenenfalls noch anpassen:


minPeriod:
Die kleinste angezeigte Periode ohne zu Gruppieren. Also "mm" für Minuten und "DD" für Tage.

maxSeries:
maximale Anzahl angezeigte Datenpunkte, ohne zu Gruppieren.

//Chart categorie Axis Settings
categoryAxesSettings:
{
   minPeriod: "mm",
   maxSeries: 10000
},





Weiter mit Teil 2 - Datenquelle: Textdatei
Weiter mit Teil 3 - Datenquelle: MySQL Datenbank

Tutorial - Wetterdaten Diagramme mit amcharts - Teil 1.1 - Diagramm mit mehreren Panels

Teil 1.1 - Diagramm mit mehreren Panels



Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch

1. Das Diagramm aus Teil 1


Das ist das Diagrammscript aus Teil 1. An zwei Orten müssen wir Änderungen vornehmen.

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">


        <link rel="stylesheet" href="amcharts/style.css" type="text/css">
        <script src="amcharts/amcharts.js" type="text/javascript"></script>
        <script src="amcharts/serial.js" type="text/javascript"></script>
        <script src="amcharts/amstock.js" type="text/javascript"></script>    
    
        <script type="text/javascript">
        
        // Start amcharts

        // Chart Daten
        var chartData = [   Hier kommen die Daten rein  ];

        // Start StockChart
        AmCharts.makeChart("chartdiv", 
        {
        
            //Chart Einstellungen
            type: "stock",
            pathToImages: "../amcharts/images/",
            
            //Datesets definieren
            dataSets: 
            [
            {

                fieldMappings: 
                [
                {
                    fromField: "t",
                    toField: "t"
                }
                ],
                
                dataProvider: chartData,
                categoryField: "date",
            }
            ],
            
            //Zeitachse (minPeriod: "mm" für minuten "DD" für Tage)
            categoryAxesSettings:
            {
                minPeriod: "mm",
                maxSeries: 1000
            },

            //Chart Panels
            panels: 
            [
            {
                title: "Panel 1",
                percentHeight: 100,
                
                //Panel graphs (Datenlinie)
                stockGraphs: 
                [
                {
                    id: "g1",
                    title: "Temperature",
                    valueField: "t",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                }
                ],
                
                //Panel Legende
                stockLegend: 
                {
                    valueTextRegular: "[[value]]",
                    markerType: "square"
                }
            }
            ],

            //chart scrollbar
            chartScrollbarSettings: 
            {
                enabled: false
            },
            
            //Chart Cursor
            chartCursorSettings: 
            {
                valueBalloonsEnabled: true,
                graphBulletSize: 1
            },
            
            //chart period selector
            periodSelector: 
            {
                inputFieldsEnabled: false,
                periods: 
                [
                {
                    period: "MAX",
                    label: "MAX"
                }
                ]
            },
            
            // Einstellungen für alle Panels
            panelsSettings: 
            {
                usePrefixes: false
            }            
        }
        );
        </script>
      
    </head>

    <body>

        <div id="chartdiv" style="width:100%; height:600px;"></div>

    </body>

</html>




2. fieldMappings


Im Bereich "fieldMappings" muss ein neuer Wert erst zugewiesen werden:

fieldMappings: 
                [
                {
                    fromField: "t",
                    toField: "t"
                }
                ],



Wir fügen den Wert "h" aus dem Datenbereich hinzu.(Luftfeuchtigkeit)

fieldMappings: 
                [
                {
                    fromField: "t",
                    toField: "t"
                },
  {
                    fromField: "h",
                    toField: "h"
                }
                ],

3. Panels


Im Bereich "panels", werden die Panels definiert:

//Chart Panels
            panels: 
            [
            {
                title: "Panel 1",
                percentHeight: 100,
                
                //Panel graphs (dataline)
                stockGraphs: 
                [
                {
                    id: "g1",
                    title: "Temperature",
                    valueField: "t",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                }
                ],
                
                // panel Legend
                stockLegend: 
                {
                    valueTextRegular: " ",
                    markerType: "square"
                }
            }
            ],

Fügen wir ein zweites Panel dazu:

//Chart Panels
            panels: 
            [
            {
                title: "Panel 1",
                percentHeight: 100,
                
                //Panel graphs (dataline)
                stockGraphs: 
                [
                {
                    id: "g1",
                    title: "Temperature",
                    valueField: "t",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                }
                ],
                
                // panel Legend
                stockLegend: 
                {
                    valueTextRegular: "[[value]]",
                    markerType: "square"
                }
            },
            {
                title: "Panel 2",
                percentHeight: 100,
                
                //Panel graphs (dataline)
                stockGraphs: 
                [
                {
                    id: "g2",
                    title: "Humity",
                    valueField: "h",
                    lineColor: "#0099cc",
                    useDataSetColors: false,
                    fillColors: ["#0099cc","#ffffff"],
                    fillAlphas: 0.5

                }
                ],
                
                // panel Legend
                stockLegend: 
                {
                    valueTextRegular: "[[value]]",
                    markerType: "square"
                }
            }
            ],


4. Fertig. 




Tutorial - Wetterdaten Diagramme mit amcharts - Teil 1.2 - Panel mit mehreren Graphen

Teil 1.2 - Panel mit mehreren Graphen


Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch


Für diesen Teil verwende ich zusätzlich Taupunkt Werte (hier: "dp"). Diese müssen im Datenbereich vorhanden sein.


1. Das Diagramm aus Teil 1


Das ist das Diagrammscript aus Teil 1. An zwei Orten müssen wir Änderungen vornehmen.


<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">


        <link rel="stylesheet" href="amcharts/style.css" type="text/css">
        <script src="amcharts/amcharts.js" type="text/javascript"></script>
        <script src="amcharts/serial.js" type="text/javascript"></script>
        <script src="amcharts/amstock.js" type="text/javascript"></script>    
    
        <script type="text/javascript">
        
        // Start amcharts

        // Chart Daten
        var chartData = [   Hier kommen die Daten rein  ];

        // Start StockChart
        AmCharts.makeChart("chartdiv", 
        {
        
            //Chart Einstellungen
            type: "stock",
            pathToImages: "../amcharts/images/",
            
            //Datesets definieren
            dataSets: 
            [
            {

                fieldMappings: 
                [
                {
                    fromField: "t",
                    toField: "t"
                }
                ],
                
                dataProvider: chartData,
                categoryField: "date",
            }
            ],
            
            //Zeitachse (minPeriod: "mm" für minuten "DD" für Tage)
            categoryAxesSettings:
            {
                minPeriod: "mm",
                maxSeries: 1000
            },

            //Chart Panels
            panels: 
            [
            {
                title: "Panel 1",
                percentHeight: 100,
                
                //Panel graphs (Datenlinie)
                stockGraphs: 
                [
                {
                    id: "g1",
                    title: "Temperature",
                    valueField: "t",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                }
                ],
                
                //Panel Legende
                stockLegend: 
                {
                    valueTextRegular: "[[value]]",
                    markerType: "square"
                }
            }
            ],

            //chart scrollbar
            chartScrollbarSettings: 
            {
                enabled: false
            },
            
            //Chart Cursor
            chartCursorSettings: 
            {
                valueBalloonsEnabled: true,
                graphBulletSize: 1
            },
            
            //chart period selector
            periodSelector: 
            {
                inputFieldsEnabled: false,
                periods: 
                [
                {
                    period: "MAX",
                    label: "MAX"
                }
                ]
            },
            
            // Einstellungen für alle Panels
            panelsSettings: 
            {
                usePrefixes: false
            }            
        }
        );
        </script>
      
    </head>

    <body>

        <div id="chartdiv" style="width:100%; height:600px;"></div>

    </body>

</html>




2. fieldMappings


Im Bereich "fieldMappings" muss ein neuer Wert erst zugewiesen werden:

fieldMappings: 
                [
                {
                    fromField: "t",
                    toField: "t"
                }
                ],



Wir fügen Wert "dp" aus dem Datenbereich hinzu. (Taupunkt muss im Datenbereich vorhanden sein).

fieldMappings: 
                [
                {
                    fromField: "t",
                    toField: "t"
                },
                {
                    fromField: "dp",
                    toField: "dp"
                }
                ],

3. Graphs


Im Bereich "stockGraphs", werden die Graphen definiert:

                stockGraphs: 
                [
                {
                    id: "g1",
                    title: "Temperature",
                    valueField: "t",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                }
                ]


Fügen wir einen zweiten dazu:

                stockGraphs: 
                [
                {
                    id: "g1",
                    title: "Temperature",
                    valueField: "t",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                },
                {
                    id: "g2",
                    title: "Dewpoint",
                    valueField: "dp",
                    lineColor: "#cc0000",
                    negativeLineColor: "#0099CC",
                    useDataSetColors: false,
                    fillColors: ["#cc0000","#ffffff"],
                    negativeFillColors: ['#0099CC', '#ffffff'],
                    fillAlphas: 0.5

                }
  ]


Fertig:





Beachten: Beide Graphen benutzen derzeit dieselbe Achse. Unterschiedliche Einheiten machen hier keinen Sinn (zB. Luftdruck). Daher habe ich eine 2. Temperatur (Taupunkt) verwendet. Mehrere Achsen sind aber auch möglich.



4. Mehrere Achsen (ValueAxes)


Das betreffende Panel wird mit "valueAxes:" erweitert. Darin werden zwei Achsen definiert. (p2va1 auf der linken und p2va2 auf der rechten Seite des Diagramms)

{
title: "Panel 2",
percentHeight: 50,


valueAxes:
[
{
id: "p2va1",
position: "left"
},
{
id: "p2va2",
color:"#1CB30B",
position: "right"
}
],
...


Nun können wir die Achsen den Graphen zuweisen: (Hier)

stockGraphs: 
[
{
id: "g3",
title: "Hum",
valueField: "h",

valueAxis: "p2va1",

lineColor: "#cc0000",
negativeLineColor: "#0099CC",
useDataSetColors: false,
fillColors: ["#cc0000","#ffffff"],
negativeFillColors: ['#0099CC', '#ffffff'],
fillAlphas: 0.5

},
{
id: "g4",
title: "Pressure",
valueField: "p",

valueAxis:"p2va2",

lineColor: "#1CB30B",
useDataSetColors: false,
fillColors: ["#1CB30B","#ffffff"],
fillAlphas: 0

}
],


Fertig :









Tutorial - Wetterdaten Diagramme mit amcharts - Teil 1.3 - Diagramm Eigenschaften

Teil 1.3 - Diagramm Eigenschaften


Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch


Hier einige Diagramm Elemente und Eigenschaften erklärt:


- categoryAxesSettings (X-Achse, Zeitachse)


categoryAxesSettings gelten für alle Panels.

categoryAxesSettings:
{

//kleinste angezeigte Periode ("mm" für Minuten "DD" für Tage)
minPeriod: "mm",

//maximal angezeigte Datenpunkte bevor gruppiert wird
maxSeries: 1000,

//oder z.B Schriftgrösse etc.
fontSize: 8
},


Die Zeitachse lässt sich für einzelne Panels auch ausblenden:

title: "Pressure",
showCategoryAxis: false,
percentHeight: 50,
...



- valueAxes


valueAxes benötigten wir bereits im Teil 1.2, um eine zweite Achse hinzuzufügen. Wir können damit aber auch umfangreich formatieren:

valueAxes:
[
{

 //id um diese achse dem betreffenden graph zuweisen zu können
 id: "p2va2",

 // dann beliebige Elemente
 color:"#1CB30B",
 position: "right"
}
],

(Im graph zuweisen nicht vergessen:)
valueAxis: "p2va2",



Mit "maximum" und "minimum" kann man den immer sichtbaren Bereich festlegen. Ansonsten würde sich der Bereich an die Werte anpassen. (z.B für Windrichtungen 0-360°)

valueAxes:
[
{
 id: "p3va2",
 color:"#1CB30B",
 position: "right"
 maximum: 360,
 minimum: 0
}
],


- guides


Innerhalb von valueAxes (siehe oben) lassen sich mit "guides" auch Linien ausgeben. (z.B für Grenzwerte)


valueAxes:
[
{
 id: "p4va1",
 color:"#1CB30B",
 position: "right",

 guides:
 [
 {
  value: 10,
  label: "Grenzwert"
 }
 }

}
],



- stockLegend


Mit "stockLegend" lässt sich für jedes Panel einzeln die Legende ändern:

stockLegend: 
{

 // Ausgabe  (z.B: 12 km/h)
 valueTextRegular: "[[VALUE]]km/h",

 //Das Symbol
 markerType: "circle"



}



- panelSettings


panelSettings gelten für alle Panels:

panelsSettings: 
{

 // Prefixes würden Werte über 1000 mit 1K abkürzen.
 usePrefixes: false,

 // Zahlenformat ändern auf 1.000,0
 numberFormatter: {precision:-1, decimalSeparator:',', thousandsSeparator:'.'}

 // Zahlenformat ändern auf 1'000.0
 numberFormatter: {precision:-1, decimalSeparator:'.', thousandsSeparator:'\''}
}



- valueAxesSettings (Y-Achse)


valueAxesSettings gelten für alle Panels und Graphen:

valueAxesSettings:{

 // Schriftgrösse
 fontSize: 9,

 //Schriftfarbe
 color:"#cccccc"

},






Tutorial - Wetterdaten Diagramme mit amcharts - Teil 2 - Datenquellen: Text

Teil 2 - Datenquellen: Text


Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch


Als externe Datenquellen eignen sich vor allem Datenbanken wie MySQL. Aber auch Textdateien können eingebunden werden.

Inhalt chartData:

Textdateien können beispielsweise mittels php "include" Befehl, an entsprechender Stelle geladen werden. 

var chartData = [  <?php include ("wetterdaten.txt") ?>   ];


Inhalt Textdatei:

Inhalt der Datei wetterdaten.txt:

{date: new Date(2013,10,25,0,0),t:3.7,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,5),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,10),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,15),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,20),t:3.6,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,25),t:3.5,h:90.0,p:1022.9},
{date: new Date(2013,10,25,0,30),t:3.5,h:89.0,p:1023.1},
{date: new Date(2013,10,25,0,35),t:3.2,h:87.0,p:1023.1},
{date: new Date(2013,10,25,0,40),t:3.2,h:86.0,p:1023.1},
{date: new Date(2013,10,25,0,45),t:3.1,h:85.0,p:1023.1},
{date: new Date(2013,10,25,0,50),t:2.9,h:85.0,p:1023.3},
{date: new Date(2013,10,25,0,55),t:2.8,h:84.0,p:1023.3},
{date: new Date(2013,10,25,1,0),t:2.6,h:84.0,p:1023.3} 


Textdateien wie die wetterdaten.txt, können mit WsWin direkt erzeugt werden. Siehe Teil 2.1

Weiter mit Teil 3 - Datenquelle: MySQL Datenbank

Tutorial - Wetterdaten Diagramme mit amcharts - Teil 2.1 - Textdateien mit WsWin

Textdateien mit WsWin:




Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch



Im Wetterstationsforum wurde ich auf diese Möglichkeit hingewiesen, und möchte das gerne hier weitergeben. (Besten Dank an User gismoat.)

Die vielfältigen Möglichkeiten von WsWin und dessen benutzerdefinierten Dateien, sind hier sehr gut erklärt: http://faq.wernerneudeck.de/ (siehe speziell den Bereich: Templates). In der WsWin Hilfe, findet man ebenfalls nützliche Informationen.


1. Template Dateien erstellen


Im WsWin Programmordner können Templates abgelegt werden, welche wie folgt aufgebaut sind:


Zeile 1: Dateinamen der Zieldatei 

Hier aktuellermonat.txt
<!-- %customfile=aktuellermonat.txt% -->

Die Dateinamen können auch Variablen enthalten: 2013-11.txt
<!-- %customfile=%ws_year%-%ws_month2%.txt% -->



Zeile 2: 

Beginnt mit "%templatebegin%", um den wiederholenden Bereich zu eröffnen. Dann "%unit_off%" und "%alwaysseppoint_on%" um keine Einheiten, und Punkte als Dezimalzeichen auszugeben.

%templatebegin%%unit_off%%alwaysseppoint_on%

Dann, immer noch in Zeile 2, unsere amcharts Datenzeile mit entsprechenden Variablen:

{date: "%ws_year%-%ws_month2%-%ws_day2% %ws_hour2%:%ws_minute2%",t:%curval[2]%,h:%curval[18]%,p:%curval[33]%},

(Achtung: Die 2-stelligen Datums/Zeitzahlen wählen. z.B. %ws_day2%)




Beispiele:

1. Hier ein Beispiel einer Tagesdatei:

Template Dateiname: template_d.txt

<!-- %customfile=d%ws_year%-%ws_month2%-%ws_day2%.txt% -->
%templatebegin%%unit_off%%alwaysseppoint_on%{date: "%ws_year%-%ws_month2%-%ws_day2% %ws_hour2%:%ws_minute2%",t:%curval[2]%,h:%curval[18]%,p:%curval[33]%},

Eine Datenzeile sollte dann etwas so aussehen:
{date: "2013-11-25 12:15",t:2.6,h:90.0,p:1030.9},




2. Hier ein Beispiel einer Monatsdatei mit Min/Max Daten:


Template Dateiname: template_m.txt

<!-- %customfile=m%ws_year%-%ws_month2%.txt% -->
%templatebegin%%unit_off%%alwaysseppoint_on%{date: "%ws_year%-%ws_month2%-%ws_day2%",tmin:%minvalday[2]%,tmax:%maxvalday[2]%},


Eine Datenzeile sollte dann etwas so aussehen:

{date: "2013-11-25",tmin:2.6,tmax:6.3}



2. Chartscript anpassen


Das amcharts Script von Teil 1, muss noch angepasst werden. Folgende Zeile hinzufügen (unterhalb type):

Für Minutendaten:
//chart settings
type: "stock",
pathToImages: "../amcharts/images/",
dataDateFormat: "YYYY-MM-DD JJ:NN",


Für Tagesdaten:
//chart settings
type: "stock",
pathToImages: "../amcharts/images/",
dataDateFormat: "YYYY-MM-DD",



3. Template aktivieren


Nach erstellen der Templates WsWin neustarten. Dann im Menu "Steuerung" -> "Einstellungen Template/.." die entsprechenden Templates aktivieren. 








3. In den Chart laden:


Die im Zielordner erstellten Dateien, können nun auf den Server übertragen werden. Diese dann in den amchart Datenbereich laden:

var chartData = [  <?php include ("aktuellermonat.txt") ?>   ]



Weiter mit Teil 3 - Datenquelle: MySQL Datenbank

Tutorial - Wetterdaten Diagramme mit amcharts - Teil 2.2 - Textdateien CSV

Teil 2.2 - Textdateien CSV



Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch



.csv Dateien lassen sich auf verschiedene Arten einbinden. Hier wird eine flexible PHP Variante vorgestellt, falls Datum und Werte umformatiert werden müssen.




1. Beispiel Quelldatei:


z.B. "data.csv"

01.11.2013;00:00;26.0;88;1000.5
01.11.2013;00:05;26.0;82;1000.6
01.11.2013;00:10;25.9;85;1000.7
01.11.2013;00:15;25.5;87;1000.2
...




2. Das PHP Script


Um diese Datei in ein vom amchart lesbares Format umzuwandeln, verwenden wir ein PHP Script welches ähnlich aufgebaut ist, wie das Datenbank Import Script aus Teil 3.1:


<?php

//Dateiname der Importdatei
$dateiname = "data.csv";

//Start Datenzeile der Importdatei
$startzeile = 1;


//Die Import Datei öffnen
if (($handle = fopen("$dateiname", "r")) !== FALSE) 
{

  //2 zähler
  $lcin = 0;
  $lcout = 0;

  //Jede Zeile abarbeiten (Hier das csv Trennzeichen anpassen ";")
  while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
  {

    //zeilenzähler Importdatei erhöhen
    $lcin++;

    //importdatei zeilen überspringen
    if($lcin >= $startzeile) 
    {
    
    //kein komma in Ausgabe Zeile 1
    if ($lcout != 0)
    {
       echo ", \n";
    }
    //komma ab zeile 2
    $lcout = 1;
   
   // datum und Zeit zerlegen 
   //Spalten $data[0][1] und Trennzeichen anpassen ". :")
   $splitDate = explode(".", $data[0]);
   $splitTime = explode(":", $data[1]);
   
   // Datum und Zeit neuen Variablen zuweisen
   // Variablen zuweisen (Spalten anpassen: "splitDate[0][1][2]")   
   $csvYear = $splitDate[2];
   $csvMonth = $splitDate[1];
   $csvDay = $splitDate[0];
   $csvHour = $splitTime[0];
   $csvMinute = $splitTime[1];
   
   // Timestamp erstellen
   $ts = strtotime("$csvYear-$csvMonth-$csvDay $csvHour:$csvMinute");
   
   // Ein Timestamp lässt sich einfacher formatieren. zb. "2013-11-25 00:00"
   // $jsDate2 = date('"Y-m-d H:i"', $ts);

   
   // Date Format erstellen (js date object). zb. "new Date(2013,10,25,0,0)"

   $jsYear = date('Y', $ts); // 2013
   $jsMonth = date('n',$ts)-1; // 10 (js month start with 0)
   $jsDay = date('j', $ts); // 25 (ohne führende null)
   $jsHour = date('G', $ts); // 0 (ohne führende null)
   $jsMinute = intval(date('i', $ts)); // 0 (ohne führende null)

   $jsDate = "new Date($jsYear,$jsMonth,$jsDay,$jsHour,$jsMinute)";
   

   //Werte mit komma als Dezimalzeichen sollten auf punkt geändert werden mit
   //$data[2] = str_replace(",", ".", "$data[2]");


   // Ausgabe Datenzeile für amcharts "new Date(2013,10,25,0,0),t:1.0,etc)
   // Spalten an Werte anpassen z.b Temp in Spalte 3 "$data[2]"

   echo "{date: $jsDate,t:".$data[2].",h:".$data[3].",p:".$data[4]."}";

    }
   
  }

// Import Datei schliessen
fclose($handle);
}
?>


Das Script sollte folgendes ausgeben:

{date: new Date(2013,10,1,0,0),t:26,0,h:88,p:1000.5}, 
{date: new Date(2013,10,1,0,5),t:26,0,h:82,p:1000.6}, 
{date: new Date(2013,10,1,0,10),t:25,9,h:85,p:1000.7}, 
{date: new Date(2013,10,1,0,15),t:25,5,h:87,p:1000.2}






Tutorial - Wetterdaten Diagramme mit amcharts - Teil 3 - Datenquellen: MySQL Datenbank

Teil 3 - Datenquellen: MySQL Datenbank


Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch


Für die Speicherung von Wetterdaten eigenen sich Datenbanken besonders. Sie erlauben z.B. das schnelle filtern und sortieren umfangreicher Datenbeständen.

(Wie die Wetterdaten in eine Datenbank kommen wird später beschrieben.)

Die Datenbank

Hier die Struktur und einige Zeilen der Beispiel DB:









Die Datenabfrage

Nun  ein einfaches php script welches die gewünschten Daten aus der DB zieht.

Wir schreiben den php Code direkt in den  Datenbereich des Diagrammscripts.

var chartData = [   HIER DAS PHP SCRIPT   ];



1. Datenbankverbindung

Zuerst mit der Datenbank Verbindung aufnehmen:

mysql_connect("SQL Host", "Username","Password");
mysql_select_db("Database Name");
(mit Ihren Zugangsdaten ersetzen)

2. Die SQL Abfrage

Jetzt die MySQL Abfrage definieren:
$query = "

Zuerst wird das Feld Datetime zerlegt (dy, dm, dd etc) dann folgen die Wetterwerte "temp", "hum" und "pressure". Zudem wird die Monatszahl auf das Javascript Format geändert (-1).
SELECT YEAR(datetime) AS dy, MONTH(datetime) -1 AS dm, DAY(datetime) AS dd, HOUR(datetime) AS th, MINUTE(datetime) AS tm, temp, hum, pressure

Die Datenbanktabelle ausgewählt. (hier "wettertabelle")
FROM wettertabelle

Der Filter (hier mal nur Daten vom 25 Nov. 2013)
WHERE DATE(datetime) = '2013-11-25'

Sortiert nach Datum:
ORDER BY datetime


Hier nochmals die gesamte Abfrage der $query zugewiesen:
$query = "
SELECT YEAR(datetime) AS dy, MONTH(datetime) -1 AS dm, DAY(datetime) AS dd, HOUR(datetime) AS th, MINUTE(datetime) AS tm, temp, hum, pressure

FROM wtr2

WHERE DATE(datetime) = '$inputDate'

ORDER BY datetime
";


3. Die Ausgabe

Nun müssen wir die selektierten Daten mit echo ausgeben:

Wir beginnen mit:
$result = mysql_query($query)
OR die("Error: $query <br>".mysql_error());

while($row = mysql_fetch_array($result))
{

...dann das Echo:
echo "{date: new Date(".$row['dy'].",".$row['dm'].",".$row['dd'].",".$row['th'].",".$row['tm']."),t:".$row['temp'].",h:".$row['hum'].",p:".$row['pressure']."},";

Zur Erinnerung: Der echo Befehl sollte folgende Zeile ausgeben:
{date: new Date(2013,10,25,0,0),t:3.7,h:90.0,p:1022.9},

Klammer schließen:
};


Zusammenfassung:

Hier nochmals das gesamte php script:

<?php

//db verbindung

mysql_connect("Hostname", "Username","Password");
mysql_select_db("Database Name");



//db abfrage

$query = "
SELECT YEAR(datetime) AS dy, MONTH(datetime) -1 AS dm, DAY(datetime) AS dd, HOUR(datetime) AS th, MINUTE(datetime) AS tm, temp, hum, pressure

FROM wettertabelle

WHERE DATE(datetime) = '2013-11-25'

ORDER BY datetime
";


//ausgabe der zeilen

$result = mysql_query($query)
OR die("Error: $query <br>".mysql_error());

while($row = mysql_fetch_array($result))
{

echo "{date: new Date(".$row['dy'].",".$row['dm'].",".$row['dd'].",".$row['th'].",".$row['tm']."),t:".$row['temp'].",h:".$row['hum'].",p:".$row['pressure']."},";
   
};

?>


Bitte beachten:

Dieses Ausgabe enthält noch einen Fehler welcher bestimmte Browser (IE) evtl. abstürzen lassen kann. Schuld ist das letzte Komma im Datenbereich der echo Ausgabe. Es gibt diverse Methoden dieses Komma nicht auszugeben, würde jedoch die Überschaubarkeit dieses Beispiels sprengen. In Teil 3.1 wird eine mögliche Lösung aufgezeigt: Teil 3.1 - Datenbank Trennkomma

Tutorial - Wetterdaten Diagramme mit amcharts - Teil 3.1 - Datenbank Trennkomma

Teil 3.1 - Datenbank - Trennkomma


Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch


Wie bereits erwähnt, sollte das letzte Trennkomma der Zeilen im Datenbereich des Diagramms, nicht ausgegeben werden.


1. Das Problem umkehren


Zur besseren Übersicht nehme ich das Komma mal in ein eigenes echo:

echo "{date: new Date(".$row['dy'].",".$row['dm'].",".$row['dd'].",".$row['th'].",".$row['tm']."),t:".$row['temp'].",h:".$row['hum'].",p:".$row['pressure']."}";

echo ",";

Nach der letzten Zeile soll dieses Komma nun nicht mehr ausgegeben werden.
Die erste Zeile ist aber einfacher zu erkennen als die letzte. Daher nehme ich zuerst das echo mit Trennkomma  nach vorne. 

echo ",";

echo "{date: new Date(".$row['dy'].",".$row['dm'].",".$row['dd'].",".$row['th'].",".$row['tm']."),t:".$row['temp'].",h:".$row['hum'].",p:".$row['pressure']."}";

Die neue Ausgabe wäre dann:

,{date: new Date(2013,10,25,0,0),t:1.1,h:82.0,p:1030.9,ws:2.7,wd:315.0,r:0.000,rs:0,wg:2.6,dp:-1.6,t2:3.1}
,{date: new Date(2013,10,25,0,5),t:1.1,h:81.0,p:1030.9,ws:2.3,wd:337.0,r:0.000,rs:0,wg:2.7,dp:-1.8,t2:3.1}

Nun muss also das erste Komma weg und nicht mehr das letzte. Das macht die Sache um vieles einfacher ;)


2. Variable


Nun müssen die Zeilen "unterscheidbar" gemacht werden. Ich verwende dazu eine Variable ($zeilenzaehler) welche sich nach dem ersten Durchlauf verändert.

Noch bevor die Ausgabe beginnt, eine Variable definieren.
$zeilenzaehler = 1;

Nach der ersten Zeilenausgabe mit echo wird dann die Variable geändert.
$zeilenzaehler = 2;

Bei der ersten Zeile ist die Variable noch "1", bei der zweiten dann "2".


3. Echo mit "If"


Mit einer "If" Funktion gebe ich nun das Komma nur dann aus, wenn die Variable $zeilenzaehler nicht "1" ist.
(Zur Erinnerung: Das Komma ist ja jetzt vor jeder Datenzeile. Dieses soll also nur ausgegeben werden, wenn es nicht die erste Zeile ist)

Zuerst mit "If" die Variable überprüfen. Solange $seitenzähler 1 ist, wird das folgende echo (mit dem komma) nicht ausgeführt:
if ($zeilenzaehler != 1)
{
   echo ",";
}
Im ersten Durchlauf ist $seitenzähler noch 1. Das echo mit dem Komma wird also nicht ausgeführt.


Dann das echo mit der Datenzeile: (wird in jedem Durchlauf ausgegeben)
echo "{date: new Date(".$row['dy'].",".$row['dm'].",".$row['dd'].",".$row['th'].",".$row['tm']."),t:".$row['temp'].",h:".$row['hum'].",p:".$row['pressure']."}";

Und jetzt, nachdem die erste Zeile (ohne Komma) bereits ausgegeben wurde, die Variable auf "2" ändern.
$zeilenzaehler = 2;

Bei allen weiteren Durchläufen ist die Variable nun 2. Die "Bedingung" der "If" Frage oben, ist also ab jetzt immer "wahr", und das Komma kommt nun vor jeder weiteren Datenzeile.


4. Zusammenfassung:


Hier noch das ganze php Script:

<?php

//db verbindung

mysql_connect("Hostname", "Username","Password");
mysql_select_db("Database Name");


//db abfrage

$query = "
SELECT YEAR(datetime) AS dy, MONTH(datetime) -1 AS dm, DAY(datetime) AS dd, HOUR(datetime) AS th, MINUTE(datetime) AS tm, temp, hum, pressure

FROM wettertabelle

WHERE DATE(datetime) = '2013-11-25'

ORDER BY datetime
";

// NEU: Variable definieren
$zeilenzaehler = 1;


//ausgabe der zeilen

$result = mysql_query($query)
OR die("Error: $query <br>".mysql_error());

while($row = mysql_fetch_array($result))
{


// echo

if ($zeilenzaehler != 1)
{
echo ",";
}

echo "{date: new Date(".$row['dy'].",".$row['dm'].",".$row['dd'].",".$row['th'].",".$row['tm']."),t:".$row['temp'].",h:".$row['hum'].",p:".$row['pressure']."}";

//Variable jetzt auf 2
$zeilenzaehler = 2;

};


Man kann das ganze selbstverständlich noch abkürzen, optimieren oder auch komplett anders machen ;)


Tutorial - Wetterdaten Diagramme mit amcharts - Teil 4 - Grundlagen (amcharts)

Teil 4 - Grundlagen (amcharts)



Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch


Hier einige Beispiele mit amcharts (Achtung: nicht stockcharts)

Im Gegensatz zu den Stockcharts fallen hier die Panels weg. Es gibt nur ein Panel, welches jedoch mehrere Graphen enthalten kann.

Es müssen je Diagrammtyp die richtigen .js Dateien verlinkt werden. (z.B. serial.js oder für "gauge" Diagramme die "gauge.js", radar.js für radarcharts etc.)

<script src="amcharts/amcharts.js" type="text/javascript"></script>
<script src="amcharts/serial.js" type="text/javascript"></script>
<script type="text/javascript">

//DATA
...

//CHART
...

</script>


Ansonsten ist der Aufbau etwa gleich:

<html>
<head>
<script src="amcharts/amcharts.js" type="text/javascript"></script>
<script src="amcharts/serial.js" type="text/javascript"></script>
<script type="text/javascript">

//DATA
var chartData = [ HIER DIE DATEN ];

//CHART
AmCharts.makeChart("chartdiv", {
type: "serial",
dataProvider: chartData,
categoryField: "date",

categoryAxis: 
{
   labelRotation:45,
},
valueAxes: 
[
{
   position: "top",
   title: "temp"
}
],
   graphs: 
[
{
   type: "column",
   title: "Temp",
   valueField: "tmax",
   fillAlphas:1
}
],
legend: 
{
   useGraphSettings: true
},
}
);

</script>

</head>

<body>
<div id="chartdiv" style="width:50%; height:300px;"></div>
</body>

</html>




Tutorial - Wetterdaten Diagramme mit amcharts - Teil 4.1 - Diagrammtypen (amcharts)

Teil 4.1 - Diagrammtypen (amcharts)


Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch


Hier einige Diagrammtypen von amcharts. (nicht stockcharts)


01 - Säulendiagramm mit Max Temperatur:


Ein einfaches Diagramm ohne "dateparsing". Es stellt dies heißesten Tage eines Jahres dar:




// DATA
var chartData = [
 {date: "2013-6-27",tmax:36.0},
 {date: "2013-5-17",tmax:34.7},
 {date: "2013-7-2",tmax:34.5},
 {date: "2013-5-19",tmax:33.8},
 {date: "2013-5-18",tmax:33.7},
 {date: "2013-6-26",tmax:33.3},
 {date: "2013-6-22",tmax:33.1},
 {date: "2013-6-23",tmax:33.1},
 {date: "2013-6-21",tmax:31.9},
 {date: "2013-7-1",tmax:31.6}
];

//CHART
AmCharts.makeChart("chartdiv", {
 type: "serial",
 dataProvider: chartData,
 categoryField: "date",
 categoryAxis: {
  labelRotation:45,
 },
 valueAxes: [{
  position: "top",
  title: "temp",
  minorGridEnabled: true
 }],
 graphs: [{
  type: "column",
  title: "Temp",
  valueField: "tmax",
  fillAlphas:1
 }],
 legend: {
  useGraphSettings: true
 },
 creditsPosition:"top-right"
 }
);


02 - Einfaches Liniendiagramm


Ein einfaches Diagramm mit "dateparsing". Es stellt den Temperaturverlauf dar:



//DATA
var chartData = [
{date: new Date(2013,11,12,0,0),t:-2.2,h:89.0,p:1032.1},
{date: new Date(2013,11,12,0,5),t:-2.1,h:89.0,p:1032.1},
etc.
];

//CHART
AmCharts.makeChart("chartdiv", {
type: "serial",
dataProvider: chartData,
categoryField: "date",
categoryAxis: {
 parseDates: true,
 minPeriod: "mm"
},
valueAxes: [{
 position: "top",
 title: "t"
}],
graphs: [{
 type: "line",
 title: "Temp",
 valueField: "t",
 fillAlphas:0
}],
legend: {
 useGraphSettings: true
},
chartCursor:{
},
creditsPosition:"top-right"
}
);





03 - Gauge Diagramm mit Temperatur (min max avg)


Ein "gauge" Diagramm. Hier werden Durchschnittstemperatur (Zeiger), sowie Min und Max dargestellt.





//CHART
var chart = AmCharts.makeChart("chartdiv", {
type: "gauge",

axes: 
[{
startValue: -25,
axisThickness: 1,
endValue: 55,
valueInterval: 5,
inside: false,
fontSize:14,
labelOffset:20,

bands: 
[
 {
  startValue: 0,
  endValue: 25,
  color: "#0099cc"
 },
 {
  startValue: 25,
  endValue: 80,
  color: "#cc0000"
 },
 {
  startValue: 38.3,
  endValue: 44.5,
  color: "#0099cc",
  radius:"90%",
  innerRadius: "40%",
  alpha: 0.6
 }
]
}],

arrows: 
[
 {
  value: 40.55938,
  innerRadius:"30%",
  radius:"92%",
  startWidth:3,
  color: "#cc0000",
  nailAlpha: 0
 }
]
}
);





04 - Radar Diagramm mit Windrichtungen


Ein Radar Diagramm. Hier werden die Durchschnittswindrichtungen eines Tages dargestellt.





//DATA
var chartData = [
{direction:"N", value:0.88333},
{direction:"N-NE", value:0.90000},
{direction:"NE", value:1.45455},
{direction:"E-NE", value:1.90667},
{direction:"E", value:2.15714},
{direction:"E-SE", value:1.78333},
{direction:"SE", value:1.45556},
{direction:"S-SE", value:1.23077},
{direction:"S", value:0.76250},
{direction:"S-SW", value:1.43333},
{direction:"SW", value:1.10000},
{direction:"W-SW", value:0.86875},
{direction:"W", value:1.06471},
{direction:"W-NW", value:1.08000},
{direction:"NW", value:0.81143},
{direction:"N-NW", value:0.80625}
];

//CHART
AmCharts.makeChart("chartdiv", {
type: "radar",
dataProvider: chartData,
categoryField: "direction",

valueAxes:
[{
 gridType: "circles",
 fillAlpha: 0.05,
 fillColor: "#000000",
 axisAlpha: 0.2,
 gridAlpha: 0,
 fontWeight: "bold",
 minimum: 0
}],

graphs: 
[{
 lineColor: "#FFCC00",
 fillAlphas: 0.4,
 bullet: "round",
 valueField: "value",
 balloonText: "[[category]]: AVG [[value]] km/h",
}]

}
);