X-Y Dağılım Grafikleri (X-Y Scatter Chart)

by Suat TUNCER 15. November 2006 09:28

Merhabalar,

Uzun bir süre önce MsChart kontrolü ve grafik çizimi ile ilgili bir makalem www.yazilimuzmani.com adresinde yayinlanmıştı. Şimdi ise bir kaç gün önce aldığım bir mailde karşılaşılan bir sorundan yola çıkarak Microsoft Office Web Components ile XY Dağılım ( Scatter ) grafikleri oluşturmayı anlatacağım.

Öncelikle bu iş için sisteminizde office tools yüklü olmalı eğer yüklü değilse Microsoft Office Web Components adresinden indirebilirsiniz. Dil desteği mevcuttur. Türkçe seçilirse birlikte gelen yardım dosyasıda türkçe gelmekte ve programlama kütüphanesi hakkında kısıtlıda olsa bazı bilgiler yer almakta tercih size kalmış.

Eklentiyi indirip kurduktan sonra, şimdi yeni bir projeyle işe başlıyalım. File menüsünde New> Prject ve C# Windows Application ‘ı oluşturuyoruz. Toolbox üzerinde sağ tıklayıp Choose Items.. ‘ı tıklıyoruz.

 

Karşımıza gelen erkandan aşşağıdaki kontrolü seçip toolbox’a ekilyoruz.


 

Daha sonra Forma, bir button( button1)  ve bir ChartSpace (AxChartSpace1) kontrolü ekliyoruz. Sıra geldi kodlamaya ben örnek olarak mailime gelen verileri kullanıcam, tabi önce bunları SQL serverda bir tablo oluşturup orya attım, kullandığım örnek tablo şöyle ;

 


Burda veriler önem kazanıyor, veri kaynağı pek önemli değil çünkü verileri, dizilere aktarıp diziler yardımıyla serileri oluşturduk, yani veri kaynağı olarak SQL, OLDB, Text File bile kullanılabilir, bu arada ilk fırsatta doğrudan veri kaynağıyla iligili bir örnek hazırlıyacam, çünkü en çok sorun yaşanan noktalardan biride orası. Örneğimizde S1X ve S2X verileri ortak veriler, S1Y ve S2Y verileri ise değişken veriler, birde Kategori değerlerimiz var bunlar verileri sınıflandırma için yani dağılımı kategoriler üzerinde gerçekleştirmek için ihtiyaç duyacağımız veriler. Örnek vermek gerekirse;
Ocak - Aralık ayları (kategoriler) arasında, aynı yük yüksekliklerdeki (X değerleri)  farklı basınçlar (Y değerleri) diyebiliriz.

button1_click olayına şu kodları yazıyorum;

 

private void button1_Click(object sender, EventArgs e)
{
    //değerleri veri tabanında okuyorum
    //verilerin formatı tablodaki gibidir
    //uygun veriyle sizede yapabilirsiniz
    //veri problem olursa haber verin göndereyim :-)
    SqlConnection cn = new SqlConnection("Data Source=.;Initial " +
                    Catalog=Test;Integrated Security=SSPI;");
    SqlCommand cmd = new SqlCommand("select * from degerler", cn);
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    //okunan değerler diziye aktarılacak
    //öncelikle diziler tanımlanıyor
    int length;
    length = dt.Rows.Count - 1;
    object[] categories = new object[length];
    object[] series1XValues = new object[length];
    object[] series1YValues = new object[length];
    object[] series2XValues = new object[length];
    object[] series2YValues = new object[length];
    //referances tipde bir datarow değişken ile
    //datatabledeki tüm satırları gezip diziye aktarıyorum
    DataRow r;
    for (int i = 0; i < dt.Rows.Count - 1; i++)
    {
        r = dt.Rows[i];
        categories[i] = r["CATID"];
        series1XValues[i] = r["S1X"];
        series1YValues[i] = r["S1Y"];
        series2XValues[i] = r["S2X"];
        series2YValues[i] = r["S2Y"];
    }
    /*şimdi garfiği çizdirmek için gereken kodlar*/

    //bunlar kodda kolaylık olsun diye tanımlıyorum
    //direkde kullanılabilir
    OWC10.ChChart MyChart;
    OWC10.ChSeries Series1;
    OWC10.ChSeries Series2;

    //grafik alanına yeni bir grafik nesnesi ekleniyor
    MyChart = axChartSpace1.Charts.Add(0);
    //grafik tipi X-Y dağılım (Scatter ) olarak ayarlıyorum
    MyChart.Type = OWC10.ChartChartTypeEnum.chChartTypeScatterSmoothLine;

    /* dizilere aktarılan verileri serilere aktarıyorum
     * dizilerin tanımladığım isimlerdenden anlaşılacağı gibi
     * her seride 1 X ve Y değeri olmak zorunda categori değeri ise
     * tüms eriler için ortak kullanılıyor
     * ve dağılımı gerçekleştirmek için mutlaka gerekli*/

 
    //grafik nesnesine yeni bir seri ekliyorum
    Series1 = MyChart.SeriesCollection.Add(0);
    //seriye değerlerini aktarıyorum SetData methodundaki
    //dimension parametresi verilerin türüü belirliyor burası dikkali kullanılmalı
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series1XValues);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series1YValues);
 
    // ve şimdi 2. seride aynı şekilde oluşturuluyor
    //daha çoks eride eklenebilir bendeki veriler şimdilik bu kadar :-)
    Series2 = MyChart.SeriesCollection.Add(1);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series2XValues);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series2YValues);
    //ve perde 
}


Sonuç itibariyle garfiğimizin son hali budur, veriler ve fikir için Özer Kaymak'a teşekkürler.

Tags: ,

C#

X-Y Dağılım Grafikleri (X-Y Scatter Chart)

by Suat TUNCER 15. November 2006 09:28

Merhabalar,

Uzun bir süre önce MsChart kontrolü ve grafik çizimi ile ilgili bir makalem www.yazilimuzmani.com adresinde yayinlanmıştı. Şimdi ise bir kaç gün önce aldığım bir mailde karşılaşılan bir sorundan yola çıkarak Microsoft Office Web Components ile XY Dağılım ( Scatter ) grafikleri oluşturmayı anlatacağım.

Öncelikle bu iş için sisteminizde office tools yüklü olmalı eğer yüklü değilse Microsoft Office Web Components adresinden indirebilirsiniz. Dil desteği mevcuttur. Türkçe seçilirse birlikte gelen yardım dosyasıda türkçe gelmekte ve programlama kütüphanesi hakkında kısıtlıda olsa bazı bilgiler yer almakta tercih size kalmış.

Eklentiyi indirip kurduktan sonra, şimdi yeni bir projeyle işe başlıyalım. File menüsünde New> Prject ve C# Windows Application ‘ı oluşturuyoruz. Toolbox üzerinde sağ tıklayıp Choose Items.. ‘ı tıklıyoruz.

 

Karşımıza gelen erkandan aşşağıdaki kontrolü seçip toolbox’a ekilyoruz.


 

Daha sonra Forma, bir button( button1)  ve bir ChartSpace (AxChartSpace1) kontrolü ekliyoruz. Sıra geldi kodlamaya ben örnek olarak mailime gelen verileri kullanıcam, tabi önce bunları SQL serverda bir tablo oluşturup orya attım, kullandığım örnek tablo şöyle ;

 


Burda veriler önem kazanıyor, veri kaynağı pek önemli değil çünkü verileri, dizilere aktarıp diziler yardımıyla serileri oluşturduk, yani veri kaynağı olarak SQL, OLDB, Text File bile kullanılabilir, bu arada ilk fırsatta doğrudan veri kaynağıyla iligili bir örnek hazırlıyacam, çünkü en çok sorun yaşanan noktalardan biride orası. Örneğimizde S1X ve S2X verileri ortak veriler, S1Y ve S2Y verileri ise değişken veriler, birde Kategori değerlerimiz var bunlar verileri sınıflandırma için yani dağılımı kategoriler üzerinde gerçekleştirmek için ihtiyaç duyacağımız veriler. Örnek vermek gerekirse;
Ocak - Aralık ayları (kategoriler) arasında, aynı yük yüksekliklerdeki (X değerleri)  farklı basınçlar (Y değerleri) diyebiliriz.

button1_click olayına şu kodları yazıyorum;

 

private void button1_Click(object sender, EventArgs e)
{
    //değerleri veri tabanında okuyorum
    //verilerin formatı tablodaki gibidir
    //uygun veriyle sizede yapabilirsiniz
    //veri problem olursa haber verin göndereyim :-)
    SqlConnection cn = new SqlConnection("Data Source=.;Initial " +
                    Catalog=Test;Integrated Security=SSPI;");
    SqlCommand cmd = new SqlCommand("select * from degerler", cn);
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    //okunan değerler diziye aktarılacak
    //öncelikle diziler tanımlanıyor
    int length;
    length = dt.Rows.Count - 1;
    object[] categories = new object[length];
    object[] series1XValues = new object[length];
    object[] series1YValues = new object[length];
    object[] series2XValues = new object[length];
    object[] series2YValues = new object[length];
    //referances tipde bir datarow değişken ile
    //datatabledeki tüm satırları gezip diziye aktarıyorum
    DataRow r;
    for (int i = 0; i < dt.Rows.Count - 1; i++)
    {
        r = dt.Rows[i];
        categories[i] = r["CATID"];
        series1XValues[i] = r["S1X"];
        series1YValues[i] = r["S1Y"];
        series2XValues[i] = r["S2X"];
        series2YValues[i] = r["S2Y"];
    }
    /*şimdi garfiği çizdirmek için gereken kodlar*/

    //bunlar kodda kolaylık olsun diye tanımlıyorum
    //direkde kullanılabilir
    OWC10.ChChart MyChart;
    OWC10.ChSeries Series1;
    OWC10.ChSeries Series2;

    //grafik alanına yeni bir grafik nesnesi ekleniyor
    MyChart = axChartSpace1.Charts.Add(0);
    //grafik tipi X-Y dağılım (Scatter ) olarak ayarlıyorum
    MyChart.Type = OWC10.ChartChartTypeEnum.chChartTypeScatterSmoothLine;

    /* dizilere aktarılan verileri serilere aktarıyorum
     * dizilerin tanımladığım isimlerdenden anlaşılacağı gibi
     * her seride 1 X ve Y değeri olmak zorunda categori değeri ise
     * tüms eriler için ortak kullanılıyor
     * ve dağılımı gerçekleştirmek için mutlaka gerekli*/

 
    //grafik nesnesine yeni bir seri ekliyorum
    Series1 = MyChart.SeriesCollection.Add(0);
    //seriye değerlerini aktarıyorum SetData methodundaki
    //dimension parametresi verilerin türüü belirliyor burası dikkali kullanılmalı
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series1XValues);
    Series1.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series1YValues);
 
    // ve şimdi 2. seride aynı şekilde oluşturuluyor
    //daha çoks eride eklenebilir bendeki veriler şimdilik bu kadar :-)
    Series2 = MyChart.SeriesCollection.Add(1);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimCategories, -1, categories);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimXValues, -1, series2XValues);
    Series2.SetData(OWC10.ChartDimensionsEnum.chDimYValues, -1, series2YValues);
    //ve perde 
}


Sonuç itibariyle garfiğimizin son hali budur, veriler ve fikir için Özer Kaymak'a teşekkürler.

Tags: ,

C#