下面代码未经测试,是从所谓的“实例”中摘出来的,哈哈,另外获取数据部分楼主自理
//获取数据
DataSet ds=getData1(param1,param2,param3,param4);//自己替换掉
//建立图形对象
Graphics objGraphics;//建立画板对象
Bitmap objBitmap=new Bitmap(1000,500);//建立位图对象
objGraphics=Graphics.FromImage(objBitmap);//根据位图对象建立画板对象
objGraphics.Clear(Color.White);//设置画板对象背景色
//绘制坐标轴
PointF point1=new PointF(30,420);//定义坐标轴原点
PointF point2=new PointF(970,420);//定义横坐标终点
PointF point3=new PointF(30,30);//定义纵坐标终点
PointF point4=new PointF(25,40);//定义箭头左侧点
PointF point5=new PointF(35,40);//定义箭头右侧点
PointF line1Start=new PointF(30,320);//定义水平线100单位起点
PointF line1End=new PointF(970,320);//定义水平线100单位终点
PointF line2Start=new PointF(30,220);//定义水平线200单位起点
PointF line2End=new PointF(970,220);//定义水平线200单位终点
PointF line3Start=new PointF(30,120);//定义水平线300单位起点
PointF line3End=new PointF(970,120);//定义水平线300单位终点
objGraphics.DrawLine(Pens.Black,point1,point2);//绘制横坐标
objGraphics.DrawLine(Pens.Black,point1,point3);//绘制纵坐标
objGraphics.DrawLine(Pens.Black,point3,point4);//绘制左侧箭头线
objGraphics.DrawLine(Pens.Black,point3,point5);//绘制右侧箭头线
objGraphics.DrawLine(Pens.YellowGreen,line1Start,line1End);//绘制水平线100单位
objGraphics.DrawLine(Pens.YellowGreen,line2Start,line2End);//绘制水平线200单位
objGraphics.DrawLine(Pens.YellowGreen,line3Start,line3End);//绘制水平线300单位
//获取数据
float[] arrValues=new float[ds.Tables[0].Rows.Count];
float flag=0;//获取最大的数值
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
arrValues[i]=float.Parse(ds.Tables[0].Rows[i][0].ToString());
if(arrValues[i]>flag)
{
flag=arrValues[i];
}
}
int pos=flag.ToString().IndexOf(".");//获取最大值中小数点的索引位置
int count1=0;
int countParam1=1;//缩放参数1
int count2=1;
float countParam2=1;//缩放参数2
//最大值大于1000(最大值中小数点索引位置大于3)
if(pos>3)
{
count1=pos-3;
for(int i=0;i<count1;i++)
{
countParam1=countParam1*10;
}
}
//最大值的整数位数
for(int i=1;i<pos;i++)
{
count2=count2*10;
}
//最大值最高位的数值大于4的情况下,缩放参数2的值为0.4
if(flag/count2>4)
{
countParam2=float.Parse("0.4");
}
//使用缩放参数调整要显示的数值
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
arrValues[i]=countParam2*float.Parse(ds.Tables[0].Rows[i][0].ToString())/countParam1+1;//加参数以避免实体超出图像范围,加1以避免未达到一个单位的矩形无法显示
}
//使用缩放参数调整坐标轴刻度值
float scale1=100*countParam1/countParam2;
float scale2=200*countParam1/countParam2;
float scale3=300*countParam1/countParam2;
if(param5=="1" || param5=="3")
{
//绘制调整后的坐标轴刻度值
PointF scalePoint1=new PointF(30,320);
PointF scalePoint2=new PointF(30,220);
PointF scalePoint3=new PointF(30,120);
objGraphics.DrawString(scale1.ToString(),new Font("宋体",9),Brushes.Black,scalePoint1);
objGraphics.DrawString(scale2.ToString(),new Font("宋体",9),Brushes.Black,scalePoint2);
objGraphics.DrawString(scale3.ToString(),new Font("宋体",9),Brushes.Black,scalePoint3);
}//画折线图
for(int j=0;j<arrValues.Length;j++)
{
if(j>0)
{
int k=j-1;
PointF pointA=new PointF((j*65)+60,420-arrValues[j]);//定义起始点
PointF pointB=new PointF((k*65)+60,420-arrValues[k]);//定义结束点
objGraphics.DrawLine(Pens.Blue,pointA,pointB);//画折线
}
//标出数据
PointF dataLeg=new PointF((j*65)+50,400-arrValues[j]);
objGraphics.DrawString(ds.Tables[0].Rows[j][0].ToString(),new Font("宋体",9),Brushes.Red,dataLeg);
//标出名称
PointF nameLeg=new PointF((j*65)+50,440);
string name=ds.Tables[0].Rows[j][1].ToString();
string name2="";
char[] nameElements=name.ToCharArray();
for(int i=0;i<nameElements.Length;i++)
{
if(i==3 && nameElements.Length>3)
{
name2=name2+nameElements[i].ToString()+"\n";//在第四个字后换行
}
else
{
name2=name2+nameElements[i].ToString();
}
}
objGraphics.DrawString(name2,new Font("宋体",9),Brushes.Black,nameLeg);
}
//绘制三角形便于突出显示各点
for(int j=0;j<arrValues.Length;j++)
{
float paramA=float.Parse("8.66");
float paramB=float.Parse("5");
PointF points0=new PointF((j*65)+60,420-arrValues[j]-paramA);
PointF points1=new PointF((j*65)+60-paramA,420-arrValues[j]+paramB);
PointF points2=new PointF((j*65)+60+paramA,420-arrValues[j]+paramB);
PointF[] points=new PointF[3]{points0,points1,points2};
objGraphics.DrawPolygon(Pens.Green,points);
objGraphics.FillPolygon(new SolidBrush(Color.Green),points);
}