C# 折線圖和程式碼
參考來源:
http://www.diybl.com/course/4_webprogram/asp.net/asp_netshl/2008124/97074.html
工具pictureBox、dataGridView
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
namespace testP
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
#region 準備預設顯示資料
DataSet ds = new DataSet();
DataTable dt = new DataTable("matr");
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("val", typeof(string));
DataRow dr1 = dt.NewRow();
dr1["id"] = "3/01";
dr1["val"] = "50";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["id"] = "3/05";
dr2["val"] = "30";
dt.Rows.Add(dr2);
DataRow dr3 = dt.NewRow();
dr3["id"] = "3/13";
dr3["val"] = "45";
dt.Rows.Add(dr3);
DataRow dr4 = dt.NewRow();
dr4["id"] = "3/16";
dr4["val"] = "10";
dt.Rows.Add(dr4);
DataRow dr5 = dt.NewRow();
dr5["id"] = "3/20";
dr5["val"] = "35";
dt.Rows.Add(dr5);
DataRow dr6 = dt.NewRow();
dr6["id"] = "3/25";
dr6["val"] = "60";
dt.Rows.Add(dr6);
DataRow dr7 = dt.NewRow();
dr7["id"] = "3/27";
dr7["val"] = "50";
dt.Rows.Add(dr7);
DataRow dr8 = dt.NewRow();
dr8["id"] = "3/29";
dr8["val"] = "55";
dt.Rows.Add(dr8);
ds.Tables.Add(dt);
BindingSource bs = new BindingSource(ds, "matr");
dataGridView1.DataSource = bs;
#endregion
#region DataTable轉Array
int r = ds.Tables["matr"].Rows.Count;
string[] month = new string[r];
double[] d = new double[r];
for (int k = 0; k < r; k++)
{
month[k] = Convert.ToString(ds.Tables["matr"].Rows[k]["id"]);
d[k] = Convert.ToDouble(ds.Tables["matr"].Rows[k]["val"]);
}
#endregion
//圖初始化
Bitmap bMap = new Bitmap(350, 280);
Graphics gph = Graphics.FromImage(bMap);
gph.Clear(Color.White);
//長條圖
//Brush aa =new SolidBrush (Color.Blue);
//gph.FillRectangle(aa, 10, 10, 20, 100);
// 定義描繪區域
Rectangle rect = new Rectangle(20, 40, 270, 200);
// 建立45度漸層的筆刷
LinearGradientBrush lgb = new LinearGradientBrush(
rect,
Color.Cyan,
Color.White,
90f
);
// 使用漸層化刷填滿工作區
gph.FillRectangle(lgb, rect);
//中心點
PointF cPt = new PointF(20, 240);
//X軸三角形
PointF[] xPt = new PointF[3]
{
new PointF(cPt.Y+56, cPt.Y),
new PointF(cPt.Y+50, cPt.Y-4),
new PointF(cPt.Y+50, cPt.Y+4)
};
//Y軸三角形
PointF[] yPt = new PointF[3]
{
new PointF(cPt.X, cPt.X+14),
new PointF(cPt.X+4, cPt.X+20),
new PointF(cPt.X-4, cPt.X+20)
};
//標題
gph.DrawString("圖表", new Font("標楷體", 14), Brushes.Black,
new PointF(cPt.Y / 2 + cPt.X, cPt.X - 10));
//畫X軸線
gph.DrawLine(Pens.Black, cPt.X,
cPt.Y,
cPt.Y + 50,
cPt.Y);
gph.DrawPolygon(Pens.Black, xPt);
gph.FillPolygon(new SolidBrush(Color.Black), xPt);
gph.DrawString("月份", new Font("標楷體", 10), Brushes.Black,
new PointF(cPt.Y + 56, cPt.Y - 8));
//畫Y軸線
gph.DrawLine(Pens.Black, cPt.X,
cPt.Y,
cPt.X,
cPt.X + 20);
gph.DrawPolygon(Pens.Black, yPt);
gph.FillPolygon(new SolidBrush(Color.Black), yPt);
gph.DrawString("單位", new Font("標楷體", 10), Brushes.Black,
new PointF(5, cPt.X - 2));
//畫Y軸刻度
for (int j = 1; j <= 7; j++)
{
gph.DrawString((j * 10).ToString(), new Font("標楷體", 8), Brushes.Black,
new PointF(cPt.X - 18, cPt.Y - j * 25 - 6));
gph.DrawLine(Pens.Black, cPt.X - 3,
cPt.Y - j * 25,
cPt.X,
cPt.Y - j * 25);
}
//畫X軸項目
for (int i = 1; i <= r; i++)
{
gph.DrawString(month[i - 1], new Font("標楷體", 8), Brushes.Black,
new PointF(cPt.X + i * 30 - 16, cPt.Y + 7)); //month[i - 1].Substring(0, 1); 取第一個字寫法
gph.DrawLine(Pens.Black, cPt.X + i * 30 - 5,
cPt.Y,
cPt.X + i * 30 - 5,
cPt.Y + 4);
//畫點
gph.DrawEllipse(Pens.Red, cPt.X + i * 30 - 6,
cPt.Y - (float)d[i - 1] * 2.5f - 1,
3,
3);
gph.FillEllipse(new SolidBrush(Color.Red), cPt.X + i * 30 - 6,
cPt.Y - (float)d[i - 1] * 2.5f - 1,
3,
3);
//畫數值
gph.DrawString(d[i - 1].ToString(), new Font("標楷體", 8), Brushes.Black,
new PointF(cPt.X + i * 30, cPt.Y - (float)d[i - 1] * 2.5f - 1));
//折線
if (i > 1)
{
Pen myPen = new Pen(Color.Red);
gph.DrawLine(myPen, cPt.X + (i - 1) * 30 - 4,
cPt.Y - (float)d[i - 2] * 2.5f - 1,
cPt.X + i * 30 - 4,
cPt.Y - (float)d[i - 1] * 2.5f - 1);
}
}
//顯示
this.pictureBox1.Image = bMap;
//存圖片至本機
//bMap.Save("c:\\test.bmp");
}
}
}