Bilimsel grafikler verinin analizini kolaylaştırmaları ve görsel olarak bir dizi sayıya göre çok daha anlamlı olmalarıyla oldukça yoğun olarak kullanılan bilimsel ortamlardır. Profesyonel bilimsel bilgisayar ortamlarına ulaşmak için genelde belli bir ücret karşılığında aldığımız profesyonel programları kullanabiliriz. Örneğin Matlab oldukça güzel bir grafik ortamı sunmaktadır, ancak bu tür paketler programlama ortamını kendi dilleriyle sınırlandırmaktadır. Burada Java ortamında program yazan arkadaşlarımızın oldukça basit bir şekilde programlarına aktarabilecekleri genel maksatlı 2 boyutlu bir bilimsel grafik ortamı programı olan Plot sınıfının (ve ona bağlı çalışan sınıflar gurubu) java ortamında kullanımı tanımlanacaktır.

Plot sınıfı tekbir dosya, bir dosya gurubu, java çok boyutlu değişkenleri, ve java fonksiyonlarından girdi alabilen, normal veya logaritmik ortamda çıktı verebilen, kübik şerit aradeğer, en küçük kareler ve ortogonal polinom en küçük kareler, Lagrange interpolasyonu gibi yöntemlerle yeterli olmayan verilerde ara değer hesaplayarak veriye eğri uydurabilen bir sistemdir. Burada Program kodlamasına girmeden programın kullanılması ile ilgili bilgi vermeye çalışacağız.

Program 1.6.13-1 PlotT1.java örnek problemi
import java.io.*;
class PlotT1
{  public static void main(String args[]) throws IOException
  {Plot pp=new Plot("in.txt");
   pp.plot();}}

 
Şekil 1.6.13-1 PlotT1 programı çıktısı : Plot sayfası
 
İlk kodumuz PlotT1 in.txt dosyasındaki veriyi okuyarak ilkçıktımızı oluşturdu. Programda gördüğümüz ilk satır olan kurucu metod   Plot pp=new Plot("in.txt"); veriyi aktardı ve   pp.plot(); deyimi de grafik penceresini oluşturdu.Bu ikinci deyim hemen her zaman pencereyi açma komutu olarak kalacaktır. Pencereyi kapama komutu verilmemiştir. Elle kapatılacaktır.

Grafik ortamının ikinci sayfasına baktığımızda değiştirilebilecek çeşitli parametreler görüyoruz. Bunlar eğride kullanılan çizgi çeşitleri, renk parametresi, grid, plot başlıkları, logaritmik skala  gibi özelliklerdir. Bu özellikler değiştirilerek grafik daha küçük bir alt bölgede incelenebilir. Sayfa istenilen ölçeklerde karelere ayrılabilir.

 
Şekil 1.6.13-2 PlotT1 programı çıktısı : Kontrol sayfası

 
Şekil 1.6.13-3 PlotT1 programı çıktısı : Kontrol sayfasında grid eklenip x exseni logaritmik yapılıp x ve y eksen boyutları değiştikten sonra grafik ekranının görünümü

Grafik rengi standart java renk editörünü kullanarak değiştirilebilir. Listeden seçilen çeşitli grafik seçenekleri kullanılabilir.

  
Şekil 1.6.13-4 kontrol sayfası renk seçimi

Bu programımızda dinamik tanım yerine statik tanım yaparsak aynı program aşağıdaki şekli alır
Program 1.6.13-1A PlotT1.java örnek problemi
import java.io.*;
class plotT1
{  
  public static void main(String args[]) throws IOException
  {Plot.file("in.txt");}
}
Çıktı aynı olacaktır. Burada statik tanımlamaları genelde tek bir adımda grafik çizdirmek için kullandığımızı, birden fazla adım olduğunda dinamik tanımlamaları tercih etmemizin daha iyi olacağını belirtelim. İkinci örneğimizde veriyi java programı boyutlu değişkenlerinden alıyoruz

Program 1.6.13-2
import java.io.*;
class PlotT2A
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
     double yy[]={1,4,9,16,25};
     Plot pp=new Plot(xx,yy);
     pp.plot();}}

 
Şekil 1.6.13-5 PlotT2A çıktısı

programımızı çalıştırdığımızda Şekil 1.6.13-5 deki çıktıyı elde ederiz. Bu çıktıda ara değerleri daha iyi görmek istersek programdan ara değer hesabı yapmasını istiyebiliriz. Aynı programı statik metodla çağıracak olursak :
 
Program 1.6.13-2A
import java.io.*;
class PlotT2A
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      Plot.data(xx,yy);}}
Çıktı yine üstte tanımlandığı gibidir.  

Program 1.6.13-3
import java.io.*;
class PlotT2B
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      Plot pp=new Plot(xx,yy);
      pp.addSpline(xx,yy,10);
      pp.plot();}}


 
Şekil 1.6.13-5 PlotT2B çıktısı (addSpline aradeğer çıktısı kullanılıyor)

aradeğer hesabı yapmak için sadece    pp.addSpline(xx,yy,10); deyimini eklememiz kafi geldi. Buradaki her nokta arasını 10 eşit parçaya bölerek ara değerleri kübik şerit interpolasyonuyla hesaplamamız anlamına gelmektedir. Eğer verinin kaç numaralı eğri olarak Plot programına girdiğini bilirsek, veriyi Plot sınıfının okuduğu veriden alarak da aynı aradeğer oluşumunu yapabiliriz. Plot eğri setleri numaraları ekleme sıramıza göre 0 dan başlayarak artarak gider.

Program 1.6.13-3A
import java.io.*;
class PlotT2B2
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      Plot pp=new Plot(xx,yy);
      pp.addSpline(0,10);
      pp.plot();}}
Program 1.6.13-3  ve Program 1.6.13-3A çıktıları aynıdır. Kübik şerit interpolasyonunun detaylarını öğrenmek istersek eğri uydurma bölümümüzü inceleyebilirsiniz. 

Birden fazla grafik komutunu bir arada kullanmak isterseniz statik metodlara başvuramazsınız, örneğin yukardaki programda hem veriyi hemde verinin interpolasyon değerlerini çizdirdiğimizden statik kullanıma uygun değildir. Ancak kendi statik metodumuzda bu tür kompleks kullanımları birleştirerek kullanabiliriz. Program 1.6.13-3B, Program 1.6.13-3 ile aynı çıktıyı verecektir.

Program 1.6.13-3B
import java.io.*;
class PlotT2B
{    
     public static void plot(double xx[],double yy[])
     {Plot pp=new Plot(xx,yy);
      pp.addSpline(xx,yy,10);
      pp.plot();}
      
     public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      plot(xx,yy);}}

Aynı aradeğer  hesaplarını pp.addB_Spline(xx,yy,10); deyimini ekleyerek B şerit interpolasyonu kullanarak da yapabiliriz.

Program 1.6.13-3C
import java.io.*;
class PlotT2B1
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      Plot pp=new Plot(xx,yy);
      pp.addB_Spline(xx,yy,10);
      pp.plot();}}

 Aynı aradeğer hesaplarını ikinci dereceden Ortogonal polinom uydurarak (her araya 10 değer olmak üzere)

Program 1.6.13-4
import java.io.*;
class PlotT2C
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      Plot pp=new Plot(xx,yy);
      pp.addOPEKK(xx,yy,2,10);
      pp.plot();}}


ikinci dereceden  polinom uydurarak (fx=a0+a1*x+a2*x2 - her araya 10 değer olmak üzere)
Program 1.6.13-5
import java.io.*;
class PlotT2D
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      Plot pp=new Plot(xx,yy);
      pp.addEKK(xx,yy,2,10);
      pp.plot();}}


veya Lagrange aradeğer hesabıyla da ulaşabiliriz.
Program 1.6.13-6
import java.io.*;
class PlotT2E
{    public static void main (String args[]) throws IOException
     {double xx[]={1,2,3,4,5};
      double yy[]={1,4,9,16,25};
      Plot pp=new Plot(xx,yy);
      pp.addLagrange(xx,yy,10);
      pp.plot();}}


Tüm interpolasyon hesap detaylarını kitabımızın 6. bölümünde inceleyebilirsiniz.

Plot Programındaki kurucu metodumuz tamamen boş olabilir. 
Program 1.6.13-7 (Dinamik çağırma)
import java.io.*;
class PlotT01
{public static void main (String args[]) throws IOException
  {Plot pp=new Plot();
   pp.plot();}}

Program 1.6.13-7A (Statik çağırma)
import java.io.*;
class PlotT2B1
{    public static void main (String args[]) throws IOException
     {Plot.file();}}

Bu durumda programımız veri için Plot.txt dosyasına bakacaktır.Bu dosyada
Plot başlığı       
x ekseni
y ekseni      
2 
in.txt  0 0 0 0  
out.txt 3 0 0 255 

verisi olduğunu varsayalım. Bunun anlamı “Plot başlığı”  “x ekseni” ve “y ekseni” grafik başlıklarını kullanarak in.txt ve out.txt dosyalarındaki verilerin çizilmesidir. Verilerin yanındaki ilk rakam grafik çizim türünü ondan sonraki 3 rakam da renk kodunu (kırmızı yeşil ve mavi olarak) ifade eder.
Programın grafik çizim kodları : 
"1 __ __ __ __ ",
"2 . _ . _ . _ ",
"3 . _ _ . . _ _ .",
"4 - - - - - - - - ",
"5  ______",
"6  __ __ __ __ ",
"7 . _ . _ . _ ",
"8  . _ _ . . _ _ .",
"9 - - - - - ",
"10  *       " ,
"11  #       ",
"12  $       ",
"13  %       ",
"14  &       ",
"15  -       ",
"16  ~       ",
"17  +       ",
"18  x       ",
"19  =       ",
"20  kare",  
"21  dolu kare",
"22  daire",
"23  dolu daire",
"24  üçken",
"25  eşkenar dörtgen",
"26  beşken",
"27  altıgen",
"28  dolu üçgen",
"28  dolu eşkenar dörtken",
"30  dolu beşgen",
"31  dolu altıgen",
"32  üç köşe yıldız",
"33  dört köşe yıldız",
"34  beş köşe yıldız",
"35  altı köşe yıldız",
"36  dolu üç köşe yıldız",
"37  dolu dört köşe yıldız",
"38  dolu beş köşe yıldız",
"39  dolu altı köşe yıldız",
"40  çubuk grafik",
"41  dolu çubuk grafik"};
şeklindedir. 
Grafik türü ve renk kodları burada bahsettiğimiz tüm metodlar için de mevcuttur. Örneğin

Bir fonksiyonun grafiğinin çizilmesi için en basit yol fonksiyonu abstract sınıf  f_x ten türeterek yapılır.

Program 1.6.13-8 (Dinamik versiyon)
import java.io.*;
class f3 extends f_x
{double func(double x)
 {return x*x*x+3.6*x*x-36.4;}}
 
class PlotT06
{public static void main (String args[]) throws IOException
 {f3 ff2=new f3();    
  Plot pp=new Plot(ff2,0.0,7.0,400,2);
  pp.plot();}}

Program 1.6.13-8A (Statik versiyon)
import java.io.*;

class f3 extends f_x
{double func(double x)
 { return x*x*Math.abs(Math.sin(Math.sqrt(x)))-5.0;}}
 
class PlotT06
{    public static void main (String args[]) throws IOException
     {Plot.func(new f3(),0.0,10.0,400,0);}
}

bu programın grafik çıktısı
 

şeklinde olacaktır. Bu fonksiyon matematik olarak ifade edilirse f(x)=x3+3.6x2-36.4 şeklindedir. 0 ile 7 arasında 400 nokta oluşturarak fonksiyonunun çizilmesi istenmiştir.

Birden fazla fonksiyonun grafiğini tek bir sınıfta tanımlıyabiliriz.

Program 1.6.13-9 (Dinamik versiyon)
import java.io.*;
class f3 extends fi_x
{
 double[] func(double x)
 { double f[]=new double[2];	 
   f[0]=x*Math.sin(10.0*Math.PI*x)+1.0;
   f[1]=x*x;
   return f;}}
 
class PlotT03
{public static void main (String args[]) throws IOException
  { f3 ff2=new f3();    
    Plot pp=new Plot(ff2,-2.0,2.0,400,2);
    pp.plot();}}

Program 1.6.13-9A (Statik versiyon)
import java.io.*;

class f3 extends fi_x
{
 double[] func(double x)
 { double f[]=new double[2];	 
   f[0]=x*Math.sin(10.0*Math.PI*x)+1.0;
   f[1]=x*x;
   return f;}
}

class PlotT03
{public static void main (String args[]) throws IOException
  { Plot.func(new f3(),-2.0,2.0,400,2);}}



  

veya ayrı ayrı birden fazla sınıfta tanımlayarak da çizebiliriz. 

Program 1.6.13-10
import java.io.*;
class f3 extends f_x
{double func(double x)
 {return x*x;}}

class f4 extends f_x
{double func(double x)
 {return x*Math.sin(10.0*Math.PI*x)+1.0;}}
 
class PlotT07
{public static void main (String args[]) throws IOException
 {f3 ff3=new f3();
  f4 ff4=new f4();    
  Plot pp=new Plot(ff3,-3.0,2.0,400);
  pp.addFunction(ff4,-2.0,2.0,400);
  pp.plot();}}

Fonksiyonlar ayrı ayrı çağrıldığında değişik sınır değerleri de tanımlayabiliriz. Burada kurucu metot birinci fonksiyon tarafından çağrıldığından ikinci fonksiyonun çağrılmasında
pp.addFunction(ff4,-2.0,2.0,400);
kullanılmıştır.
 

addFunction metoduna benzer olarak addData metodu mevcuttur, java boyutlu değişken verilerinin eklenmesinde kullanılır.

pp.addData(xx,yy,0,0,0,0);

Son olarak çeşitli fonksiyon ve verileri kullanan ve diğer grafik verilerini de programın içinde değiştiren bir programa göz atalım

Program 1.6.13-11
import java.io.*;
 
class f3 extends fi_x
{
 double[] func(double x)
 {
   double f[]=new double[2];	 
   f[0]=Math.sin(x)+x/2;
   f[1]=Math.sqrt(x);
   return f;
 }}
class PlotT3
{
     public static void main (String args[]) throws IOException
     {//Plot pp=new Plot();
     String fi[]={"in.txt","out.txt"};
     f3 ff=new f3();
     int ipt[]={0,1};
     int ir[]={0,0};
     int ig[]={0,0};
     int ib[]={0,2};
     double xx[]={1,2,3,4,5,6};
     double yy[]={2,3,4,5,6,7};
     Plot pp=new Plot(fi); //read data from fi (in.txt,out.txt data are added up)
     //pp.addData(fi);
     pp.setPlotType(0,0);//
     pp.setPlotType(1,1);// 
     pp.addData(xx,yy,0,0,0,0); //one set of addional data
     pp.setPlotType(2,41);//bar chart
     pp.setColor(2,0,0,255); //blue
     pp.addFunction(ff,0.0,20.0,50,2,ipt,ir,ig,ib); //two additional function
     pp.setPlabel("Fonksiyon Plot");
     pp.setXlabel("x ekseni");
     pp.setYlabel("y ekseni");
     pp.plot();}}
Bu program 2 fonksiyonu f3 sınıfından almakta, 2 set veriyi fi string’i aracılığıyla in.txt ve out.txt dosyalarından okumaktadır. 3. veri seti(2 no’lu veri) bar grafik (grafik tipi 41) olarak seçilmiştir. Bu paketleri kullanarak çok daha karmaşık grafik bileşenleri oluşturulabilir. Örneğin nemli havanın termodinamik özellikleri programında fare ile aktif veri girişi (Fareye basıldığında x ve y koordinatlarını alarak bu değerler için hesap yapma) gibi ek özellikler katılabilir. Bu özellikler burada verdiğimiz paketin içerisinde kullanıma hazır olarak mevcutsa da verdiğimiz şekliyle kullanılamaz. 

 

Grafik Paketi Temel Bileşenleri : 
Grafik Paketinin temel bileşenleri : 
Plot.java kurucu metotlar ve girdi çıktı metotlarını içerir
PlotW.java  : çizimi gerçekleştiren ana metodudur. Grafik sayfalarını ve bu sayfaların kontrollerini içerir.
PlotShapesSW: çeşitli Plot alt elemanlarının çizim tekniklerini içerir, çizgi, üçgen,bar grafik gibi
Plot2D : PlotShapes alt elemanlarını grafik çizimi haline getirir, sırasıyla alt elemanları çağırır. 

Şimdi bu paketlerin listelerini verelim. Bu tür program kodları programlamaya yeni başlayan arkadaşlarımız için kompleks olabilir, bu durumda sadece kullanımla yetinebilirler, ancak dileyen kodları alarak daha da geliştirebilir, Bu tür geliştirmelerde tek dileğim geliştirmelerden beni de haberdar etmeniz, eğer yeni kodlar uygunsa orijinal kodları değiştirebiliriz. Programlarımızın kodlarını vermeden önce tüm metodlarımızın bir listesini verelim :
Kurucu metodlar : (grafik programını dinamik olarak kurar ve veriyi kullanıma hazırlar)
public Plot() throws IOException   
public Plot(String pl,String xl,String yl,int xnt,int ynt,int xgo,int ygo,String fn[],int ipt[],int ir[],int ig[]                
 ,int ib[]) throws IOException     
  public Plot(String fn[],int ipt[],int ir[],int ig[],int ib[]) throws IOException	
  public Plot(String fn[]) throws IOException  : Read file names from String fn[] and plot them 
  public Plot(double xi[][],double yi[][],int ipt[],int ir[],int ig[],int ib[]) : read plot data from xi[][] and yi[][]
  public Plot(double xiyi[][]) : read plot data xi[] and yi[] from xiyi[][] string   
  public Plot(double xi[][],double yi[][]) : read plot data from xi[][] and yi[][]
  public Plot(double xi[],double yi[]) : read plot data from xi[] and yi[]
  public Plot(f_x f,double xm,double xma,int N,int ipt,int ir,int ig,int ib)  
 public Plot(f_x f,double xm,double xma,int N) : create plot data from a simple function f_x f
 public Plot(fi_x f,double xm,double xma,int Number_of_Data,int Number_of_Function) 
 
Statik metodlar : (verinin kısa yoldan grafiğinin çizilmesini sağlar)
 public static double[] data(double xmin,double xmax,double dx) 
 public static double[] data(double xmin,double xmax,int n)
 public static Plot func(f_x ff1,double xmin,double xmax,int n,int pnumber)
 public static Plot func(f_x ff1,double xmin,double xmax,int n)
 public static Plot func(f_x ff1,double xmin,double xmax)


  public static Plot func(fi_x ff1,double xmin,double xmax,int n,int pnumber)
  public static Plot func(fi_x ff1,double xmin,double xmax,int n)
  public static Plot func(fi_x ff1,double xmin,double xmax)

 x , y ve ana başlığı eklemek
  public void setPlabel(String ip) {label=ip;}
  public void setXlabel(String ix) {xlabel=ix;}
  public void setYlabel(String iy) {ylabel=iy;}
  public void setXYlabel(String ix,String iy) {xlabel=ix;ylabel=iy;}

kurucu metoddan sonra grafik penceresine ek veri eklemek
public void addData(double xi[],double yi[])
public void addData(double xi[],double yi[],int iplottype)
public void addData(double xi[],double yi[],int iplottype,int ir,int ig,int ib)
public void addData(double xi[][],double yi[][])
public void addData(double xi[][],double yi[][],int ip[])
public void addData(double xi[][],double yi[][],int ip[],int ir[],int ig[],int ib[])
public void addFunction(f_x f,double xmi,double xma,int N,int ipt)
public void addFunction(f_x f,double xmi,double xma,int N)
public void addFunction(f_x f,double xmi,double xma,int N,int ipt,int ir,int ig,int ib)	
public void addFunction(fi_x f,double xmin,double xmax,int Number_of_Data,int Number_of_Function)
public void addFunction(fi_x f,double xmin,double xmax,int Number_of_Data,int Number_of_Function,int ipt[])
public void addFunction(fi_x f,double xmin,double xmax,int Number_of_Data,int Number_of_Function, ,int ipt[])

eğri uydurarak ek veri eklemek
public void addOPEKK(double xi[],double yi[],int npolinom,int aradegersayisi)
public void addOPEKK(double xi[],double yi[],int npolinom,int aradegersayisi,int iplottype)
public void addOPEKK(double xi[],double yi[],int npolinom,int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addEKK(double xi[],double yi[],int npolinom,int aradegersayisi)
public void addEKK(double xi[],double yi[],int npolinom,int aradegersayisi,int iplottype)
public void addEKK(double xi[],double yi[],int npolinom,int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addEKK(int linenumber,int npolinom,int aradegersayisi,int iplottype)
public void addEKK(int linenumber,int npolinom,int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addLagrange(double xi[],double yi[],int aradegersayisi)
public void addLagrange(double xi[],double yi[],int aradegersayisi,int iplottype)
public void addLagrange(double xi[],double yi[],int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addLagrange(int linenumber,int aradegersayisi,int iplottype)
public void addLagrange(int linenumber,int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addB_Spline(double xi[],double yi[],int nSpline)
public void addB_Spline(double ai[][],int nSpline)
public void addB_Spline(double xi[],double yi[],int nSpline,int iplottype)
public void addB_Spline(double xi[],double yi[],int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addB_Spline(int linenumber,int nSpline)
public void addB_Spline(int linenumber,int nSpline,int iplottype)
public void addB_Spline(int linenumber,int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addSpline(double xi[],double yi[],int nSpline)
public void addSpline(double ai[][],int nSpline)
public void addSpline(double xi[],double yi[],int nSpline,int iplottype)
public void addSpline(double xi[],double yi[],int aradegersayisi,int iplottype,int ir,int ig,int ib)
public void addSpline(int linenumber,int nSpline)
public void addSpline(int linenumber,int nSpline,int iplottype)
public void addSpline(int linenumber,int aradegersayisi,int iplottype,int ir,int ig,int ib)

grafik özelliklerini değiştirmek
===========Grafik türü  =====================
public void setPlotType(int plot_type[])	
public void setPlotType(int dataset,int plot_no)
public void setPlotType(int dataset,char plot_char)
===========x ve y grid  ===========================
public void setXgrid(int igx)
public void setYgrid(int igy)
public void setGrid(int igx,int igy)
public void setXtic(int ixt)
public void setYtic(int iyt)
public void setXYtic(int ixt,int iyt)
==========logaritmik grafik skalası açma ve kapama ==========
public void setXlogScaleOn()
public void setYlogScaleOn()
public void setXlogScaleOff()
public void setYlogScaleOff()
==========renk seti==========
public void setColor(int dataset,int ired,int igreen,int iblue)
public void setColor(int dataset,Color c)
public void setColor(int ired[],int igreen[],int iblue[])
public void setColor(Color c[])
================ fonksiyon minimum ve maksimum değerleri ===================
public void setMinMax()
public void setMinMax(double xi[][],double yi[][])
public void setMinMax(double iminx,double imaxx,double iminy,double imaxy)
=============== grafik penceresi formatlanması ==================================
 public void set_plotwindow(int width,int height,double xip,double yip,double dxp,double dyp) 
 public void setabsMaxMin(int ixmin,int iymin,int idx,int idy)

oluşan verinin dinamik ortamda çizilmesi
