PHP ChartLib gesucht

PropHunt

Banned
Dabei seit
Sep. 2013
Beiträge
499
Ich suche eine ChartLib für PHP. Momentan verwende ich Libchart, allerdings bin ich dort auf ein Problem gestoßen:
Wenn ich mehrere Datensätze graphisch darstellen möchte, müssen die X-Werte bei Libchart übereinstimmen. Allerdings habe jetzt Datensätze nach dem Schema "Uhrzeit:Ganzzahlwert" und da sich die Uhrzeiten dementsprechend unterscheiden, kann ich Libchart nicht mehr benutzen ("Error: serie <7> doesn't have the same number of points as last serie (last one: <0>, this one: <102>).").
Was ich also nun brauche, ist eine Alternative, die genau das unterstützt.
Ich bin für jede Hilfe dankbar!

Mfg
PropHunt
 

PropHunt

Banned
Ersteller dieses Themas
Dabei seit
Sep. 2013
Beiträge
499
Ich habe mir vor dem Erstellen dieses Thread pChart angesehen, allerdings sehe ich nicht, wie ich Datensätze mit unterschiedlichen "Schrittmengen" in einer Chart unterbringen kann.
 

PropHunt

Banned
Ersteller dieses Themas
Dabei seit
Sep. 2013
Beiträge
499
Habe mir das mal näher angesehen (https://google-developers.appspot.com/chart/interactive/docs/gallery/linechart) und es scheint nicht möglich zu sein. Unabhängig davon, dass ich node.js für die Datenbankabfrage verwenden müsste oder AJAX (glaube ich), was ich beides noch nicht gemacht habe.

Ich versuche mal das Problem näher zu beschreiben:
Ich habe einen Gameserver, der regelmäßig die Spielerzahl mit der Uhrzeit in die Datenbank schreibt. Jetzt möchte ich online eine Übersicht haben von heute, dem Tag davor, und heute vor einer Woche. Problem ist jetzt, dass die Uhrzeiten der Einträge nicht "senkrecht" verlaufen (wenn man sich die Einträge als Spalten gemäß der Uhrzeit als Entfernung vorstellt), sondern sich halt unterscheiden. Da sind die Einträge nicht immer um 9:05, sondern auch mal um 9:06 (stattdessen), oder gar nicht.
Jetzt könnte ich natürlich die Zeit auf die Y-Achse hauen und das Ganze drehen (irgendwie nachträglich), aber das würde die Legende unlesbar machen usw..
 

Freezedevil

Lt. Junior Grade
Dabei seit
Mai 2011
Beiträge
506
Wie du mit den Daten umgehen kannst hängt natürlich davon ab, was regelmäßig bedeutet und wie weit die Einträge streuen.
Falls der Server alle 10min in die DB schreibt und dabei Zeiten wie 8:58 bis 9:03 oder so auftauchen kannst du die ja bequem auf 9:00 normalisieren. Bzw anders ausgedrückt stellst du die Spielerzahl um 9:00 dar und ziehst dafür immer den "nahsten" Punkt zu Rate.
Falls mal ein Wert fehlt könntest du zwischen den beiden Nachbarn interpolieren.

Ich hab übrigens entdeckt, dass es auch PHP-Wrapper für die Google API gibt.
zb: https://code.google.com/p/gchartphp/
Es gibt noch mehr, einfach mal nach "google charts php" googlen.
 

PropHunt

Banned
Ersteller dieses Themas
Dabei seit
Sep. 2013
Beiträge
499
Das ist schon eine sehr bescheuerte Lösung um ehrlich zu sein. Ich werde sicherlich keine Werte verfälschen, nur, weil eine API sowas eigentlich einfaches nicht anbietet.
Da MUSS es doch irgendeine andere Lösung geben?
 
Zuletzt bearbeitet:

Freezedevil

Lt. Junior Grade
Dabei seit
Mai 2011
Beiträge
506
Also ich versteh nicht, was du erwartest. Über die API kannst du die Werte so anzeigen wie sie sind, aber das scheinst du ja nicht zu wollen. Ebenso scheinst du die API nicht mit bereinigten Werten füttern zu wollen. Du musst dich aber eben für eins entscheiden oder es sein lassen. Es kann ja niemand was dafür, dass deine Daten Mist sind.

Also am besten postest du mal einen kleinen Auszug aus den Daten und ein Bild wie du dir vorstellst wie es am Ende aussehen soll.
 

PropHunt

Banned
Ersteller dieses Themas
Dabei seit
Sep. 2013
Beiträge
499
Also ich versteh nicht, was du erwartest. Über die API kannst du die Werte so anzeigen wie sie sind, aber das scheinst du ja nicht zu wollen.[...]
[...]Es kann ja niemand was dafür, dass deine Daten Mist sind.[...]
LOL

[...]Also am besten postest du mal einen kleinen Auszug aus den Daten und ein Bild wie du dir vorstellst wie es am Ende aussehen soll.
8qWhGba.png

So schwierig kann es ja nicht sein, einfach willkürlich Punkte einzutragen und zu verbinden. Das wird wohl so gemacht worden sein, weil man diese Punkte gleich als Markierungen für die Achsen verwendet, und die X-Achse normalerweise immer selbst festgelegte Werte hat (wissenschaftlich betrachtet).
Ich muss dazu sagen, dass ich vor 2 Jahren mal ein Chartcontrol für WinForms von Grund auf selber geschrieben habe. Beiße mir jetzt deswegen teilweise in den Arsch, weil ich mit PHP und JS nicht so viel anfangen kann (Es geht logischerweise, dauert nur länger und ist nicht mein Wunschgebiet, in dem ich mir groß was aneignen möchte).

EDIT:
Ich habe mir jetzt mal die Mühe gemacht und das rausgeholt, was ging:
SW7SibU.png
(Das ist jetzt für 7 Tage)
Was ich dazu tue:
-Das Plugin auf dem Server stellt sich am Anfang so ein, dass es wirklich alle glatten 10 Minuten updatet (gibt allerdings Schwankungen von mehreren Sekunden)
-Ich runde die Ergebnisse im PHP-Skript auf 10 Minuten
-Ich setze alle anderen Werte am Anfang auf 0 (die fehlenden oder einfach noch nicht belegten aufgrund der Uhrzeit) und fülle dann die Werte)

Frickelei, weil ich das Interval nicht ändern kann, ohne Plugin und Skript anzupassen.
Andere Sachen, die mich noch nerven:
-Ich brauche AA
-Ich muss noch die Abschnitte auf der X-Achse entweder manuell setzen, oder gleich abschalten
-Dass es einfach runtergeht, anstatt abzubrechen, wenn es keine aktuelleren Werte gibt

Eins nach dem Anderen, denke ich mal...
 
Zuletzt bearbeitet:

Freezedevil

Lt. Junior Grade
Dabei seit
Mai 2011
Beiträge
506
Ich würde auf die x-Achse die Minuten seit Tagesbeginn legen (man bekommt da sicherlich auch noch ne schöne Beschriftung hin). Dann kannst du doch für jeden Zeitraum (heute, gestern, letzte Woche) mit deinen Werten eine Kurve malen. Dabei spielt es dann keine Rolle mehr ob der Punkt jetzt bei Minute 600 oder 601 ist, da das ja sehr nahe beisammen liegt.
Wenn du also angenommen heute und gestern einen Eintrag um 0:20 von letzter Woche allerdings einen Eintrag um 0:19 hast müsstest du beispielsweise die beiden Tupel <20,19,null> und <null,null,16> eintragen.

Ich hab mal ein kleines Beispiel gebaut.
https://code.google.com/apis/ajax/playground/?type=visualization#line_chart
Der von mir getestete Code seht folgendermaßen aus und stellt den Zeitraum von 0:00 bis 1:00 dar. Mit Schwankungen von +-1min gibt es alle 10min einen Wert für die drei Bereiche.
Code:
function drawVisualization() {
  // Create and populate the data table.
  var data = google.visualization.arrayToDataTable([
    ['x', 'heute', 'gestern', 'letzte woche'],
    [0,        20,        15,             10],
    [9,      null,        14,           null],
    [10,        5,      null,           null],
    [11,     null,      null,             20],
    [20,       22,        16,           null],
    [21,     null,      null,             13],
    [30,       20,        17,             15],
    [40,     null,      null,             17],
    [41,       21,        18,           null],
    [49,     null,      null,             20],
    [50,       18,        17,           null],
    [60,       20,        17,             15]
  ]);

  // Create and draw the visualization.
  new google.visualization.LineChart(document.getElementById('visualization')).
      draw(data, {curveType: "function",
                  width: 500, height: 400, interpolateNulls: true,
                  vAxis: {maxValue: 10}}
          );
}
 

PropHunt

Banned
Ersteller dieses Themas
Dabei seit
Sep. 2013
Beiträge
499
Ich würde auf die x-Achse die Minuten seit Tagesbeginn legen (man bekommt da sicherlich auch noch ne schöne Beschriftung hin). Dann kannst du doch für jeden Zeitraum (heute, gestern, letzte Woche) mit deinen Werten eine Kurve malen. Dabei spielt es dann keine Rolle mehr ob der Punkt jetzt bei Minute 600 oder 601 ist, da das ja sehr nahe beisammen liegt.[...]
Das mache ich doch. :p

[...]Wenn du also angenommen heute und gestern einen Eintrag um 0:20 von letzter Woche allerdings einen Eintrag um 0:19 hast müsstest du beispielsweise die beiden Tupel <20,19,null> und <null,null,16> eintragen.

Ich hab mal ein kleines Beispiel gebaut.
https://code.google.com/apis/ajax/playground/?type=visualization#line_chart
Der von mir getestete Code seht folgendermaßen aus und stellt den Zeitraum von 0:00 bis 1:00 dar. Mit Schwankungen von +-1min gibt es alle 10min einen Wert für die drei Bereiche.
Code:
function drawVisualization() {
  // Create and populate the data table.
  var data = google.visualization.arrayToDataTable([
    ['x', 'heute', 'gestern', 'letzte woche'],
    [0,        20,        15,             10],
    [9,      null,        14,           null],
    [10,        5,      null,           null],
    [11,     null,      null,             20],
    [20,       22,        16,           null],
    [21,     null,      null,             13],
    [30,       20,        17,             15],
    [40,     null,      null,             17],
    [41,       21,        18,           null],
    [49,     null,      null,             20],
    [50,       18,        17,           null],
    [60,       20,        17,             15]
  ]);

  // Create and draw the visualization.
  new google.visualization.LineChart(document.getElementById('visualization')).
      draw(data, {curveType: "function",
                  width: 500, height: 400, interpolateNulls: true,
                  vAxis: {maxValue: 10}}
          );
}
Achso, ich darf Werte auslassen? Dann müsste ich ja nur "mergen" wie du sagtest.
Was ich auf jeden Fall machen muss, ist entweder die X-Achsen Abschnitte deaktivieren, oder selber festlegen.
Der Graph sieht auch soweit sehr schön aus. Ich muss mal gucken, was ich mit der bisherigen Lösung aus pChart herausholen kann und werde dann mal vergleichen. Müsste dann halt nur mit Ajax oder so rumfuchteln, mal sehen ob es das dann Wert ist.

Vielen Dank auf jeden Fall, vor allem für deine Mühen und deiner Langatmigkeit. :p
 

Freezedevil

Lt. Junior Grade
Dabei seit
Mai 2011
Beiträge
506
Ja sowas findet man eben raus wenn man die Doku der API liest :p Ist ja wie gesagt bei Google alles sehr umfangreich und detailliert beschrieben. Ich bin mir auch sicher, dass man die Beschriftung der Achsen noch passend hinbekommt, wenn man sich entsprechend einliest.

An deiner Stelle würde ich mir aber erstmal ansehen wie mächtig die Wrapperlib ist die ich oben gepostet hab. Wenn die alle von dir benötigten Funktionen durchschleift erspart sie dir vermutlich viel Arbeit.
 

PropHunt

Banned
Ersteller dieses Themas
Dabei seit
Sep. 2013
Beiträge
499
Ja sowas findet man eben raus wenn man die Doku der API liest :p[...]
Solange ich nicht alle (über 9000) Seiten durchgelesen habe, ist es ja Zufall, was ich herausfinde und was nicht. :p Um ehrlich zu sein, verstehe ich nicht, wieso die Funktionalität nicht gleich entsprechend dargestellt wird auf den Bildern.
Dazu kommt ja noch, dass ich das Gefühl habe, dass mein Problem eigentlich gar nicht so selten ist.
 
Top