Anasayfa > Programlama > PHP > PHP ile Grafik Örneği
Makaleye verilen puanlar Makaleye verilen puanlar

PHP ile Grafik Örneği




Bircok konuda oldugu gibi PHP, Web uygulamalari ve diger tüm bilgisayar ve teknoloji alanlarinda
"Türkce Kaynak" sorunumuzun oldugu acik bir gercek. Türkce kitaplarda ve internet sitelerinde
genelde cok az bir yer verilen "PHP ve Grafik Uygulamalari" konusunda bir seyler yapmak isteyen
arkadaslara biraz olsun yardimci olabilmek icin 2 basit örnek hazirladim.

Örnekler belki profesyonel siteler yada sirketler icin ideal olmayabilir ama orta düzey bir web
sitesinde verileri grafige dökmek icin kullanilabilir diye düsünüyorum.

Burada 2 adet örnek var biri "haftalik.php" ve digeri "aylik.php" isimlerinden de anlasilacagi
üzere haftalik ve aylik olarak elimizdeki verileri "SUTUN" grafige döküyor. Her ikisi de tek
baslarina ya da HTML icinden cagirilabilir, HTML icinden cagirmak isterseniz

KOD:

  1.  <img
  2.  src="haftalik.php">
ya da

KOD:

  1.  <img src="aylik.php">
gibi bir ifade kullanabilirsiniz.


AYRICA; bu sekilde img olarak cagiracaksaniz, kaynakta biraz degisiklik yapip grafik dosyasini
cagirirken

KOD:

  1.  <img src="aylik.php=?w=400&h=300&grid=5">
gibi bir ifade kullanabilirsiniz,
böyle daha esnek olur sanirim.

Kodlar az bucuk farkli kaynaklardan aldigim fikir disinda tamamen bana ait, fazla ugrasmadim yani
optimize edilmesi gerekebilir. Örneklerin kaynak kodlarini aynen veriyorum, isteyen istedigi
degisikligi yapip (sag taraftaki imza bölümünü v.s. degistirip :)) istedigi sitede kullanabilir.
Tek istedigim, bu örnekleri herhangi bir yerde kullandiginizda
yilmazsuslu@hotmail.com ya da
brandon@yyu.edu.tr adreslerinden birine bir mail atip haber vermeniz olacaktir. Bunu yaparsaniz cok
sevinirim. Ayrica acil sorulariniz olursa bana 33537066 nolu ICQ dan ulasabilirsiniz...


Sevgiler...

PHP:

  1.   
  2.  <?php 
  3.  /*-------------------------------
  4.  // PHP ILE AYLIK SUTUN GRAFIK CIZIM ORNEGI
  5.  // aylik.php
  6.  //
  7.  // M. Yilmaz SUSLU, Subat 2003
  8.  // Yüzüncü Yil Universitesi, VAN
  9.  // yilmazsuslu@hotmail.com 
  10.  --------------------------------------------*/ 
  11.  header ("Content-type: image/png");
  12.  //--- Genel Degiskenler -----------------------------
  13.  $w = 500; // Resmin Genisligi [400-500 arasi ideal]
  14.  $h = 250; // Resmin Yuksekligi [250-350 arasi ideal]
  15.  $Baslik = "2002 Yili Aylik Ziyaretci Istatistigi";
  16.  $BaslikFont = 3; // Basligin font buyuklugu [1-5 arasi, 3 ideal]
  17.  $GraphName = "TEKIL ZIYARET / AY";
  18.  $BoslukLeft = ($w-(($BaslikFont+3)*strlen("$Baslik")))/2; // Ortalama sol margin
  19.  $BoslukTop = ($h+(5*strlen("$GraphName")))/2; // Ortalama ust margin (GraphName)
  20.  $YatayGrid = 5; // yatay olarak cizilecek klavuz sayisi
  21.  $LeftM = ($w*(12/100))/2;
  22.  $TopM = ($h*(12/100))/2;
  23.  $SutunGen = $w*6/100;
  24.  //--- End of Genel Degiskenler --------------------------------
  25.   
  26.   
  27.   
  28.  //--- Grafige Dökülecek Veriler -------------------------------
  29.  /* Bu verileri ayri satirlarda verdim ama bir while döngüsüne girilip
  30.  veritabanindan ya da dosyadan da okutularak ya da $_GET ya da $_POST
  31.  degiskeni olarak bu degerler dinamik olarak verilebilir */ 
  32.  $Veri[0] = 125;
  33.  $Veri[1] = 570;
  34.  $Veri[2] = 870;
  35.  $Veri[3] = 918;
  36.  $Veri[4] = 759;
  37.  $Veri[5] = 298;
  38.  $Veri[6] = 890;
  39.  $Veri[7] = 987;
  40.  $Veri[8] = 1280;
  41.  $Veri[9] = 318;
  42.  $Veri[10] = 419;
  43.  $Veri[11] = 697;
  44.  $Aylar = array("Oca","Sub","Mar","Nis","May","Haz","Tem","Agu","Eyl","Eki","Kas", "Ara");
  45.  //--- End of Grafige Dökülecek Veriler ---------------------
  46.   
  47.   
  48.   
  49.  $VeriKova = array_values($Veri); // Veri dizisinin bire bir kopyasi
  50.  sort($VeriKova);
  51.  $Min = $VeriKova[0];
  52.  $Max = $VeriKova[11];
  53.  $Top = array_sum($Veri);
  54.  $Resim = imagecreate($w,$h);
  55.   
  56.   
  57.   
  58.  //--- Renk Tanimlamalari ----------------------------
  59.  $Siyah = imagecolorAllocate($Resim, 0, 0, 0);
  60.  $Beyaz = imagecolorallocate($Resim, 255, 255, 255);
  61.  $Mavi = imagecolorallocate($Resim, 100, 100, 255);
  62.  $Kirmizi = imagecolorAllocate($Resim, 255, 0, 0);
  63.  $Yesil = imagecolorAllocate($Resim, 0, 150, 0);
  64.  $Gri = imagecolorAllocate($Resim, 200, 200, 200);
  65.  //--- End of Renk Tanimlamalari -------------------------------
  66.   
  67.   
  68.   
  69.  imagefilledrectangle($Resim, 0, 0, $w, $h ,$Beyaz);
  70.  imagerectangle($Resim, 0, 0, $w-1, $h-1, $Siyah);
  71.   
  72.   
  73.   
  74.  //--- Gridleri Cizmeye Basliyoruz -----------------------------
  75.  $CAAM = ($h-($TopM*4))/$YatayGrid; // Cizgi Araligi Artis Miktari
  76.  $Cizgi[0] = $TopM*2; // En ustteki Grid icin top margin degeri
  77.  $MaxTemp = $Max; // Maximum degeri kova degiskene attik lazim olacak
  78.  if(strlen($MaxTemp)>=3):
  79.  $CizgiSayim = strrev(substr(strrev("$MaxTemp"), 0, 2));
  80.  $WhileGo = 100;
  81.  else:
  82.  $CizgiSayim = strrev(substr(strrev("$MaxTemp"), 0, 1));
  83.  $WhileGo = 10;
  84.  endif;
  85.  while(intval($CizgiSayim)<$WhileGo) 
  86.  { 
  87.  $CizgiSayim++;
  88.  $MaxTemp++;
  89.  } 
  90.  $CizgiSayi[0] = $MaxTemp;
  91.  for($i=0; $i<=$YatayGrid; $i++) 
  92.  { 
  93.  if(empty($CizgiSayi[$i])) 
  94.  { 
  95.  $CizgiSayi[$i] = round($MaxTemp*(($YatayGrid-$i)/$YatayGrid));
  96.  $Cizgi[$i] = $Cizgi[$i-1]+$CAAM;
  97.  } 
  98.  switch(strlen($CizgiSayi[$i])) 
  99.  { 
  100.  case "1" ; $spacer = " "; break;
  101.  case "2" ; $spacer = " "; break;
  102.  case "3" ; $spacer = " "; break;
  103.  case "4" ; $spacer = ""; break;
  104.  } 
  105.  imageline($Resim,$LeftM*2,$Cizgi[$i], $w-$LeftM, $Cizgi[$i],$Gri);
  106.  imagestring($Resim, 2, $LeftM-($LeftM/4), $Cizgi[$i]-7, "$spacer$CizgiSayi[$i]", $siyah);
  107.  } 
  108.  //--- End Of Gridleri Cizmeye Basliyoruz --------------------
  109.   
  110.   
  111.   
  112.  //--- Aylari ve SUTUNLARI cizmeye basliyoruz ---------------
  113.  $Sutun = ($w-(3*$LeftM))/12; // Sütunlarin cizilecegi alani 12 parcaya bol
  114.  $GrafikAlani = round($h-($TopM*4)); // Grafigin toplam yuksekligi
  115.  $Birim = $GrafikAlani/$MaxTemp; //Sütunlar icin 1 birimin px degeri
  116.  for($i=0; $i<12; $i++) 
  117.  { 
  118.  if($Veri[$i]==$Max) : $Renk = $Kirmizi;
  119.  elseif($Veri[$i]==$Min) : $Renk = $Yesil;
  120.  else : $Renk = $Mavi;
  121.  endif;
  122.  $x1 = 2.1*$LeftM+($Sutun*$i);
  123.  $y1 = ($TopM*2)+$GrafikAlani-($Birim*$Veri[$i]);
  124.  $x2 = $x1+$SutunGen;
  125.  $y2 = $h-$TopM*2;
  126.  switch(strlen($Veri[$i])) 
  127.  { 
  128.  case "1" : $xcarpan = 2.5; break;
  129.  case "2" : $xcarpan = 2.475; break;
  130.  case "3" : $xcarpan = 2.330; break;
  131.  case "4" : $xcarpan = 2.300; break;
  132.  } 
  133.  imagefilledRectangle($Resim, $x1, $y1, $x2, $y2, $Renk);
  134.  imageRectangle($Resim, $x1, $y1, $x2, $y2, $Siyah);
  135.  imagestring($Resim,2,2.335*$LeftM+($Sutun*$i),$h-(2*$TopM),"$Aylar[$i]",$Siyah);
  136.  imagestring($Resim,1,$xcarpan*$LeftM+($Sutun*$i),$y1-9,"$Veri[$i]",$Siyah);
  137.  } 
  138.  //--- End of Gunleri ve SUTUNLARI cizmeye basliyoruz ------------------
  139.   
  140.   
  141.   
  142.  //--- L seklinde 2 kenara siyah cizgi --------------------------
  143.  imageline($Resim,$LeftM*2,$h-$TopM*2,$w-$LeftM,$h-$TopM*2,$Siyah);
  144.  imageline($Resim,$LeftM*2,$TopM,$LeftM*2,$h-$TopM*2,$Siyah);
  145.  //--- End of L seklinde mavi cizgi -----------------------------
  146.   
  147.   
  148.   
  149.  imagestring($Resim,$BaslikFont,$BoslukLeft+1,(1/$BaslikFont)+3,"$Baslik",$Gri);
  150.  imagestring($Resim,$BaslikFont,$BoslukLeft,1/$BaslikFont+2,"$Baslik",$Kirmizi);
  151.  imagestring($Resim,1,$LeftM*2, $h-$TopM,"Max=$Max",$Kirmizi);
  152.  imagestring($Resim,1,$LeftM*4, $h-$TopM,"Min=$Min",$Yesil);
  153.  imagestring($Resim,1,$LeftM*6, $h-$TopM,"Toplam=$Top",$Mavi);
  154.  imagestringup($Resim,1,3,$BoslukTop,"$GraphName",$Kirmizi); // GraphName
  155.  $mysign= "M. YILMAZ SUSLU, Subat 2003, VAN";
  156.  imagestringup($Resim,1,$w-10,$h-(strlen($mysign)*0.2), $mysign,$Gri); // Imza...
  157.  imagepng($Resim);
  158.  imagedestroy($Resim);
  159.  ?> 
  160.   
  161.   
  162.   
  163.  <?php 
  164.  /*---------------------------------------------------
  165.  // PHP ILE SUTUN GRAFIK CIZIM ORNEGI
  166.  // haftalik.php
  167.  //
  168.  // M. Yilmaz SUSLU, Subat 2003
  169.  // Yüzüncü Yil Universitesi, VAN
  170.  // yilmazsuslu@hotmail.com 
  171.  ---------------------------------------------------*/ 
  172.  header ("Content-type: image/png");
  173.  //--- Genel Degiskenler -------------------------------------
  174.  $w = 500; // Resmin Genisligi [400-500 arasi ideal]
  175.  $h = 250; // Resmin Yuksekligi [250-350 arasi ideal]
  176.  $Baslik = "Subat Ayi 3. Hafta Satislar";
  177.  $BaslikFont = 3; // Basligin font buyuklugu [1-5]
  178.  $GraphName = "ADET / GUN";
  179.  $BoslukLeft = ($w-(($BaslikFont+3)*strlen("$Baslik")))/2; // Ortalama sol margin
  180.  $BoslukTop = ($h+(5*strlen("$GraphName")))/2; // Ust margin (GraphName icin)
  181.  $YatayGrid = 10; // yatay olarak cizilecek klavuz sayisi
  182.  $LeftM = ($w*(12/100))/2;
  183.  $TopM = ($h*(12/100))/2;
  184.  $SutunGen = $w*8/100;
  185.  //--- End of Genel Degiskenler ----------------------------------
  186.   
  187.   
  188.   
  189.  //--- Grafige Dökülecek Veriler ---------------------------------
  190.  /* Bu verileri ayri satirlarda verdim ama bir while döngüsüne girilip
  191.  veritabanindan ya da dosyadan da okutularak ya da $_GET ya da $_POST
  192.  degiskeni olarak bu degerler dinamik olarak verilebilir */ 
  193.  $Veri[0] = 50;
  194.  $Veri[1] = 98;
  195.  $Veri[2] = 130;
  196.  $Veri[3] = 58;
  197.  $Veri[4] = 62;
  198.  $Veri[5] = 168;
  199.  $Veri[6] = 186;
  200.  $Gunler = array(