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.