Avatar billede dytti Novice
30. november 2009 - 12:49 Der er 9 kommentarer og
1 løsning

jpgraph xaxis rækkefølge

Jeg sidder og leger med JPgraph.
Nedenstående script giver mig denne graf:http://www.dytti.dk/fiskelog/jpgraph/php.php

Nu er spørgsmålet: Hvordan får jeg månederne til at stå i den rigtige rækkefølge?
Altså fra Januar til december.

<?php // content="text/plain; charset=utf-8"
include("../login/login/include/session.php");
include '../global/config.php';
$link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
    if(!$link) {
        die('Kunne ikke forbinde til server: ' . mysql_error());
    }
   
    //vælg database
    $db = mysql_select_db(DB_DATABASE);
    if(!$db) {
        die("Kunne ikke vælge database");
    }

require_once ("jpgraph.php");
require_once ('jpgraph_bar.php');

$SQL = "SELECT sum(antalfisk), month FROM fangst_log group by month";
  $RESULT = mysql_query($SQL);
  if ($myrow=mysql_fetch_array($RESULT))
{
    while( $row = mysql_fetch_array( $RESULT ))
    {
        $fisk[] = $row['sum(antalfisk)'];
        $month[] = $row['month'];
     
    }
}





// We need some data
$datay=$fisk;
$datax=$month;

// Setup the graph.
$graph = new Graph(400,240);
$graph->img->SetMargin(60,20,35,75);
$graph->SetScale("textlin");
$graph->SetMarginColor("lightblue:1.1");
$graph->SetShadow();

// Set up the title for the graph
$graph->title->Set("Antal fanget pr måned");
$graph->title->SetMargin(8);
$graph->title->SetFont(FF_VERDANA,FS_BOLD,12);
$graph->title->SetColor("darkred");

// Setup font for axis
$graph->xaxis->SetFont(FF_VERDANA,FS_NORMAL,10);
$graph->yaxis->SetFont(FF_VERDANA,FS_NORMAL,10);
// Show 0 label on Y-axis (default is not to show)
$graph->yscale->ticks->SupressZeroLabel(false);

// Setup X-axis labels
$graph->xaxis->SetTickLabels($datax);
$graph->xaxis->SetLabelAngle(50);

// Create the bar pot
$bplot = new BarPlot($datay);
$bplot->SetWidth(0.6);

// Setup color for gradient fill style
$bplot->SetFillGradient("navy:0.9","navy:1.85",GRAD_LEFT_REFLECTION);

// Set color for the frame of each bar
$bplot->SetColor("white");
$graph->Add($bplot);

// Finally send the graph to the browser
$graph->Stroke();
?>
30. november 2009 - 13:41 #1
I din tabel fangst_log er month tilsyneladende en string, og mysql viser derfor maanederne i alfabetisk raekkefoelge.  En "quick and dirty" loesning kan vaere at bruge union saaledes:

SELECT SUM(antalfisk), month FROM fangst_log WHERE month='jan' group by month
UNION
SELECT SUM(antalfisk), month FROM fangst_log WHERE month='feb' group by month
UNION
SELECT SUM(antalfisk), month FROM fangst_log WHERE month='mar' group by month
UNION.....

Den endelige loesning ville formodenligt indebaere at tilpasse din tabel saa month bliver en date-type.  Jeg skal se om jeg kan finde ud af at lave det og saa melde tilbage.
30. november 2009 - 14:23 #2
OK, ronde 2:
Jeg har kunnet foelge lidt med i dit project gennem tidligere spoergsmaal her paa Eksperten.  Jeg forstaar at kilden til de data du tegner graf over er indberetninger fra lyskfiskere over fisketure hvor de blandt andet udfylder dato og fangst.

Men hvorfor putter du saa ikke datoen direkte i databasen i data-type DATE i stedet for at omsaette den til et maanedsnavn i data-type VARCHAR?  (Ja, det er nemt at vaere bagklog.)  Saa bliver queryen noget met:

SELECT MONTHNAME(dato) as month, SUM(antal)
FROM fangst_log
GROUP BY month
ORDER BY month DESC.

For at teste lavede jeg en tabel som jeg fyldte nogle oplysninger i og lavede dette query.  Tabellen og resultatet viser jeg nedenfor efter de foelgende kommentarer.

1.  Men hvad vil du vise naar du faar oplysninger der spaender over mere end et kalenderaar?  For eksempel i marts 2010 vil du saa kun vise jan/feb/mar eller de tolv seneste maaneder eller maaske alle maaneder fra begyndelsen af databasen?  Med mindre du vil begraense dig til det loebende aar maa du saa i gang med saadan en query:

SELECT MONTHNAME(dato) as month, YEAR(dato) as year, SUM(antal)
FROM fangst_log
GROUP BY month, year

2.  Funktionen MONTHNAME() giver hele maanedsnavnet og paa engelsk.  Hvis du i grafen vil bruge de tre foerste bogstaver og paa dansk maa du nok i gang med nogle stringfunktioner i php koden naar du faar vaerdierne trukket ind.

Her er saa tabellen (som jeg kaldte dytti1), vaerdierne, queryen, og resultatet:

CREATE TABLE dytti1(dato DATE, antal INT)

INSERT INTO dytti1 VALUES('2009-09-01', 5);
INSERT INTO dytti1 VALUES('2009-10-01', 3);
INSERT INTO dytti1 VALUES('2009-10-02', 20);
INSERT INTO dytti1 VALUES('2009-12-01', 5);
INSERT INTO dytti1 VALUES('2009-12-01', 5);
INSERT INTO dytti1 VALUES('2009-11-02', 7);
INSERT INTO dytti1 VALUES('2009-11-01', 5);
INSERT INTO dytti1 VALUES('2009-12-01', 5);
INSERT INTO dytti1 VALUES('2009-12-01', 5);
INSERT INTO dytti1 VALUES('2009-09-02', 1);
INSERT INTO dytti1 VALUES('2009-09-02', 15);
INSERT INTO dytti1 VALUES('2009-09-02', 25);

SELECT MONTHNAME(dato) as month, SUM(antal)
FROM dytti1
GROUP BY month
ORDER BY month DESC

month     SUM( antal )
September     46
October     23
November     12
December     20
Avatar billede dytti Novice
30. november 2009 - 17:35 #3
Hej christian

Nu har jeg prøvet med "runde 2"

Jeg kan stadig ikke få fat i den rigtige rækkefølge.

http://www.dytti.dk/fiskelog/jpgraph/php.php

$SQL = "SELECT MONTHNAME(dato) as month, SUM(antalfisk)
FROM fangst_log
GROUP BY month
ORDER BY month DESC";
  $RESULT = mysql_query($SQL);
 
    while( $row = mysql_fetch_array( $RESULT ))
    {
        $fisk[] = $row['SUM(antalfisk)'];
        $month[] = $row['month'];
     
  }

Er der noget jeg har misset?
30. november 2009 - 18:15 #4
Hvad er strukturen (hvilke kolonner og hvilke datatyper) for tabellen fangst_log?
Avatar billede dytti Novice
30. november 2009 - 18:26 #5
dato = DATE (NOT NULL)    "eks. 2009-01-25"
antalfisk = INT(4) (NOT NULL)
Avatar billede dytti Novice
30. november 2009 - 18:53 #6
Har fundet ud af det ;-)

Der manglede en linie i koden.
Den her:
// Setup X-axis labels
$graph->xaxis->SetTickLabels($datax);
$graph->xaxis->SetLabelAngle(50);

Skal se sådan ud:
// Setup X-axis labels
$datax =  $gDateLocale-> GetShortMonth();
$graph->xaxis->SetTickLabels($datax);
$graph->xaxis->SetLabelAngle(50);

Men det virker ikke uden din løsning.
Smider du svar, så lukker jeg.
30. november 2009 - 19:12 #7
Du synes at ville lave en array, $month[] der holder alle bestaaende vaerdier af maaneder og $fisk[] der holder vaerdierne af antalfisk for de samme maaneder.  Hvis du har vaerdier for hver maaned i et aar skal vil du have 12 vaerdier i hver af array'erne.  Men du definerer nye arrays for hver raekke i $result (du definerer array'erne inde i while loekken.)  Lad mig lige taenke lidt over hvad loesningen skal vaere.  Men jeg proevede lige denne PHP kode:

<?
$link = mysql_connect ('christianjorgensen.be.mysql', 'christianjoygen', 'dnyBKKbe') or die(mysql_erorr());
mysql_select_db('christianjoygen') or die('Could not select database');
$SQL = "SELECT MONTHNAME(dato) as month, SUM(antal)
FROM dytti1
GROUP BY month
ORDER BY month DESC";
  $RESULT = mysql_query($SQL) or die(mysql_error());
  $fisk = array();
    while( $row = mysql_fetch_array( $RESULT ))
    {
        $fisk = $row['SUM(antal)'];
        $month = $row['month'];
        echo $fisk . " - " . $month . "<br/>";
    } 
mysql_close($link); 
?>
og jeg fik dette:

46 - September
23 - October
12 - November
20 - December

hvilket korrekt reflekterer indholdet af den tabel jeg bruger.  Proev engang (med dine egne database- og tabel navne og med SUM(antalfisk) i stedet for SUM(antal).  Jeg haaber at du ogsaa faar dine maaneder echoet i den rigtigt raekkefoelge.
Avatar billede dytti Novice
30. november 2009 - 19:21 #8
Det må jeg prøve i morgen.
Er på vej på arbejde nu.

Jeg vender tilbage med nyt.
30. november 2009 - 19:39 #9
Jeg saa ikke dit indlaeg #6 foer jeg sendte mit #7.  Du siger at det virker, saa glem #7.
Avatar billede dytti Novice
01. december 2009 - 11:47 #10
Nu sidder den lige i øjet - takket være din hjælp.

Det skulle lige rettes lidt til, men du hjalp mig derhen.

Nu ser det sådan ud:
$SQL = "SELECT MONTH(dato), SUM(antalfisk)
FROM fangst_log
GROUP BY MONTH(dato)";
  $RESULT = mysql_query($SQL);
 

    while( $row = mysql_fetch_array( $RESULT ))
   
    {
        $fisk[] = $row['SUM(antalfisk)'];
    $month[] = $row['MONTH(dato)'];
        }
mysql_close($link); 

require_once ("jpgraph.php");
require_once ('jpgraph_bar.php');

// We need some data
$datay=$fisk;
$datax =  $gDateLocale-> GetShortMonth($month);

Jeg troede at den var der i #6, men opdagede at værdierne i månederne ikke svarede til dem i tabellen.
Men nu er det rigtigt: http://www.dytti.dk/fiskelog/jpgraph/php.php

Jeg tror at jeg har sagt det før, men jeg siger det gerne igen: Du er en haj til det her, og en stor hjælp. TAK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester