C#折线图控件怎么使用
这篇文章主要介绍了C#折线图控件怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#折线图控件怎么使用文章都会有所收获,下面我们一起来看看吧。
简单解说这是第一次写博客,也是第一次发布自己写代码,有不足之处请多见谅。
源代码参考了网络搜索到的一些资源。
因为我需要的折线图数据没有小于0的,所以在计算时偷懒了。只支持大于0的数据。
上图
如何插入一段漂亮的代码片
因为自学编程,代码注释与命名比较乱,请见谅。
这是新建控件的代码。需要给控件添加FoldLineDiagram_Resize 事件。
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Drawing;usingSystem.Data;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Drawing.Drawing2D;namespacevc_farm{///<summary>///折线图控件///注意:///1、数据列最少不小于2列。///2、数据列与数据标题列长度必须保持一致///3、数据标题长度最大为100///4、折线数量不能大于10个///</summary>publicpartialclassFoldLineDiagram:UserControl{privateBitmapmImage;//画的折线图privateFoldLineDatamData;//记录折线数据,在窗口大小改变时可重新计算privateList<SelectionArea>mSelectionArea=newList<SelectionArea>();//可选择区域【此处无用,原用作记录数据点,方便判断光标是否选中某条数据折线】privateSelectionAreamNowSelectionArea;//当前选中的区域【此处无用】publicFoldLineDiagram(){InitializeComponent();}#region禁止基类属性显示[Browsable(false)][EditorBrowsable(EditorBrowsableState.Never)]publicoverrideImageBackgroundImage{get{returnbase.BackgroundImage;}set{base.BackgroundImage=value;}}#endregion///<summary>///获取折线图片(只有使用了ShowFoldLineDiagram方法后才能正确获取)///</summary>publicBitmapImage{get{returnmImage;}}///<summary>///显示折线///</summary>///<paramname="aData">折线数据对象</param>publicvoidShowFoldLineDiagram(FoldLineDataaData){this.mData=aData;mImage=CreateImageS(aData);this.BackgroundImage=newBitmap(mImage);//背景为复制的图片//this.BackgroundImageLayout=ImageLayout.Stretch;//拉伸显示显示}///<summary>///保存折线图图片(只有使用了ShowFoldLineDiagram方法后才能正确保存)///</summary>///<paramname="aSavePath">保存文件的路径</param>///<paramname="aImageFormat">保存的格式</param>publicvoidSaveImage(stringaSavePath,System.Drawing.Imaging.ImageFormataImageFormat){newBitmap(mImage).Save(aSavePath,aImageFormat);}privateBitmapCreateImageS(FoldLineDatadata){#region数据验证if(data.DataTitleText.Count<=1)returnnull;//限制列数不能小于2if(data.DataTitleText.Count>100)returnnull;//限制列数不能大于100if(data.listFoldLineDataStyle.Count>10)returnnull;//限制折线数量不能大于10inttemp=data.DataTitleText.Count;//获取数据标题长度for(inti=0;i<data.listFoldLineDataStyle.Count;i++)//循环所有数据{if(data.listFoldLineDataStyle[i].Data.Count!=temp)//当前数据长度与数据标题长度不一致{returnnull;}}#endregion#region函数内部变量赋值this.mSelectionArea.Clear();//记录数据清空intheight=this.Height,width=this.Width;//设置图片大小//设置左右上下边框距离图片边框间距intleft=(int)(width*0.1);intright=(int)(width*0.1);inttop=(int)(height*0.1);intbottom;if(data.ShowLegend==true)bottom=(int)(height*0.15);//显示图例时,下边框为0.2elsebottom=(int)(height*0.1);#endregionBitmapimage=newBitmap(width,height);//新建一张图片Graphicsg=Graphics.FromImage(image);g.SmoothingMode=SmoothingMode.AntiAlias;//使绘图质量最高,即消除锯齿g.InterpolationMode=InterpolationMode.HighQualityBicubic;g.CompositingQuality=CompositingQuality.HighQuality;try{#region绘图准备工作g.Clear(Color.White);//清空图片背景色Fontfont=data.DataTitleTextFont;//设置X与Y轴标题字体Fontfont1=data.FoldLineTextFont;//设置标题字体//Fontfont2=aLineDataFont;//设置数据显示字体LinearGradientBrushbrush=newLinearGradientBrush(newRectangle(0,0,image.Width,image.Height),data.BackgroundBorderColor,data.BackgroundBorderColor,1.2f,true);g.FillRectangle(Brushes.AliceBlue,0,0,width,height);#endregion#region画折线图标题Brushbrush2=newSolidBrush(data.FoldLineTextColor);SizeFsizeF=g.MeasureString(data.FoldLineText,font1);//计算标题文字大小g.DrawString(data.FoldLineText,font1,brush2,(width-sizeF.Width)/2,(top-sizeF.Height)/2);//画标题#endregion#region绘制框线//画图片的边框线g.DrawRectangle(newPen(data.BackgroundBorderColor),0,0,image.Width-1,image.Height-1);Penmypen=newPen(brush,1);//边框线画笔//绘制纵向线条intxLineSpacing=(width-left-right)/(data.DataTitleText.Count-1);//计算X轴线条间距intxPosition=left;//X轴开始位置for(inti=0;i<data.DataTitleText.Count;i++){g.DrawLine(mypen,xPosition,top,xPosition,height-bottom);//画X轴竖线sizeF=g.MeasureString(data.DataTitleText[i],font);//计算X轴文字大小g.DrawString(data.DataTitleText[i],font,newSolidBrush(data.DataTitleTextColor),xPosition-(sizeF.Width/2),height-bottom+5);//设置文字内容及输出位置xPosition+=+xLineSpacing;//累加间距}//Penmypen1=newPen(Color.Blue,3);xPosition=left;g.DrawLine(mypen,xPosition,top,xPosition,height-bottom);//画X轴第1条线(粗线)//绘制横向线条List<int>yName=ReckonYLine(data.listFoldLineDataStyle);intmLineCount=yName.Count;//计算Y轴行数intyLineSpacing=(height-bottom-top)/(yName.Count-1);//计算Y轴线条间距intyPosition=height-bottom;//Y轴开始点for(inti=0;i<yName.Count;i++){g.DrawLine(mypen,left,yPosition,width-right,yPosition);sizeF=g.MeasureString(yName[i].ToString(),font);g.DrawString(yName[i].ToString(),font,newSolidBrush(data.DataTitleTextColor),left-sizeF.Width-5,yPosition-(sizeF.Height/2));//设置文字内容及输出位置yPosition-=yLineSpacing;}yPosition=height-bottom;g.DrawLine(mypen,left,yPosition,width-right,yPosition);//Y轴最下面一天线加粗#endregion#region画折线,及数据for(inti=0;i<data.listFoldLineDataStyle.Count;i++){//显示折线效果Penmypen2=newPen(data.listFoldLineDataStyle[i].FoldLineColor,2);//折线画笔List<int>pointData=data.listFoldLineDataStyle[i].Data;//取出折线数据xPosition=left;floatyMultiple=(float)(height-top-bottom)/(float)yName.Max();//计算Y轴比例因子List<Point>linePoint=newList<Point>();//定义折线节点坐标for(intj=0;j<pointData.Count;j++){Pointpoint=newPoint();point.X=xPosition;point.Y=top+(int)((yName.Max()-pointData[j])*yMultiple);xPosition+=xLineSpacing;linePoint.Add(point);g.FillEllipse(newSolidBrush(data.listFoldLineDataStyle[i].FoldLineColor),point.X-5,point.Y-5,10,10);//画节点的圆点g.DrawString(pointData[j].ToString(),data.listFoldLineDataStyle[i].FoldLineDataFont,newSolidBrush(data.listFoldLineDataStyle[i].FoldLineDataColor),point.X,point.Y+10);//绘制节点文字}g.DrawLines(mypen2,linePoint.ToArray());//绘制折线//记录画图区域SelectionAreasa=newSelectionArea();sa.linePoint=linePoint;//sa.rect=newRectangle();this.mSelectionArea.Add(sa);}#endregion#region画图例if(data.ShowLegend==true){intlength=0;//绘制的长度for(inti=0;i<data.listFoldLineDataStyle.Count;i++){//显示折线效果Penmypen2=newPen(data.listFoldLineDataStyle[i].FoldLineColor,2);//折线画笔if(data.listFoldLineDataStyle[i].DataName=="折线"){data.listFoldLineDataStyle[i].DataName+=i.ToString();//如果是默认名称,则给默认名称加数字}sizeF=g.MeasureString(data.listFoldLineDataStyle[i].DataName,data.DataTitleTextFont);//计算字体长度//20:两个图例的间距,30:图例中颜色表示区宽度,10:图例颜色标识区与文本区间距length+=20+30+10+(int)sizeF.Width;}length+=20;//加上最后的间距intstartX=(width-length)/2;intstartY=(int)(height*0.92);for(inti=0;i<data.listFoldLineDataStyle.Count;i++){//显示折线效果Penmypen2=newPen(data.listFoldLineDataStyle[i].FoldLineColor,2);//折线画笔if(data.listFoldLineDataStyle[i].DataName=="折线"){data.listFoldLineDataStyle[i].DataName+=i.ToString();//如果是默认名称,则给默认名称加数字}sizeF=g.MeasureString(data.listFoldLineDataStyle[i].DataName,data.DataTitleTextFont);//计算字体长度g.FillRectangle(newSolidBrush(data.listFoldLineDataStyle[i].FoldLineColor),startX,startY,30,10);//绘制小矩形g.DrawString(data.listFoldLineDataStyle[i].DataName,data.DataTitleTextFont,newSolidBrush(data.listFoldLineDataStyle[i].FoldLineColor),startX+30+10,startY);startX+=30+10+(int)sizeF.Width+20;//记录画图区域的图例显示区域Rectanglerect=newRectangle(startX,startY,30,10);SelectionAreasa=this.mSelectionArea[i];sa.rect=rect;this.mSelectionArea[i]=sa;}}#endregionreturnnewBitmap(image);}finally{g.Dispose();image.Dispose();}}///<summary>///Y轴横线及Y轴标题内如计算///</summary>///<paramname="data"></param>///<returns></returns>privateList<int>ReckonYLine(List<FoldLineDataStyle>flData){List<int>AllData=newList<int>();//所有数据汇总在一起foreach(FoldLineDataStyleiteminflData){AllData.AddRange(item.Data);}//定义最大值与最小值intmax=AllData.Max();intmin=AllData.Min();List<int>yName=newList<int>();intcsMax=0;//测算上限/*如果需要增加小于0数据判断,则需要在此次增加一些判断。*就是取最小值,判断是否为负数,是则取绝对值进行计算,不是则和现在计算方式一样*/if(max.ToString().Length>1)//如果大于9{//测算最大上限值stringling="";for(inti=0;i<max.ToString().Length-1;i++)//为数字末尾补0ling+="0";stringtemp=max.ToString().Substring(0,1);//取出最高位数字csMax=Int32.Parse((Int32.Parse(temp)+1)+ling);//如果max=75162则转成80000for(inti=0;i<=(Int32.Parse(temp)+1);i++){yName.Add((Int32.Parse(i+ling)));}}else{csMax=max+1;for(inti=0;i<=csMax;i++){yName.Add(i);}}returnyName;}privatevoidFoldLineDiagram_Resize(objectsender,EventArgse){if(mData!=null){mImage=CreateImageS(mData);this.BackgroundImage=newBitmap(mImage);//背景为复制的图片}}///<summary>///选择区域///</summary>privatestructSelectionArea{///<summary>///选择区域///</summary>publicRectanglerect;///<summary>///折线区域///</summary>publicList<Point>linePoint;}///<summary>///判断点是否在矩形范围内///</summary>///<paramname="rect"></param>///<paramname="pt"></param>///<returns></returns>publicstaticboolIsPointIn(RectangleFrect,PointFpt){if(pt.X>=rect.X&&pt.Y>=rect.Y&&pt.X<=rect.X+rect.Width&&pt.Y<=rect.Y+rect.Height){returntrue;}elsereturnfalse;}}///<summary>///折线背景设置///</summary>publicclassFoldLineData{///<summary>///全部折线默认:空数据///</summary>publicList<FoldLineDataStyle>listFoldLineDataStyle;///<summary>///折线图的标题文本默认:空文本///</summary>publicList<string>DataTitleText;///<summary>///折线图的标题文本默认:空文本///</summary>publicstringFoldLineText;///<summary>///折线图的标题文本字体颜色默认:黑色///</summary>publicColorFoldLineTextColor;///<summary>///折线图的标题文本字体格式默认:"宋体",20///</summary>publicFontFoldLineTextFont;///<summary>///数据列标题字体颜色默认:黑色///</summary>publicColorDataTitleTextColor;///<summary>///数据列标题字体格式默认:"宋体",9///</summary>publicFontDataTitleTextFont;///<summary>///背景边框线颜色默认:深灰色///</summary>publicColorBackgroundBorderColor;///<summary>///显示图例默认:true///</summary>publicboolShowLegend;///<summary>///构造函数///</summary>///<paramname="flds">数据组。每组数据长度必须一致,且与数据列名称长度一致</param>///<paramname="dataTitleText">数据列名称</param>publicFoldLineData(List<FoldLineDataStyle>flds,List<string>dataTitleText){DataTitleText=dataTitleText;listFoldLineDataStyle=flds;FoldLineText="";FoldLineTextColor=Color.Black;FoldLineTextFont=newSystem.Drawing.Font("宋体",20,FontStyle.Regular);DataTitleTextColor=Color.Black;DataTitleTextFont=newSystem.Drawing.Font("Arial",9,FontStyle.Regular);BackgroundBorderColor=Color.DarkGray;ShowLegend=true;}}///<summary>///折线数据及样式///</summary>publicclassFoldLineDataStyle{///<summary>///折线数据默认:null///</summary>publicList<int>Data;///<summary>///折线数据名称默认:折线///</summary>publicstringDataName;///<summary>///折线颜色默认:红色///</summary>publicColorFoldLineColor;///<summary>///折线点上显示的数据颜色默认:红色///</summary>publicColorFoldLineDataColor;///<summary>///折线点上显示的数据字体格式默认:"宋体",8///</summary>publicFontFoldLineDataFont;///<summary>///构造函数///</summary>///<paramname="data">数据。数据长度一定需要保持一致</param>publicFoldLineDataStyle(List<int>data){Data=data;FoldLineColor=Color.Red;FoldLineDataColor=Color.Red;FoldLineDataFont=newSystem.Drawing.Font("宋体",9,FontStyle.Regular);DataName="折线";}}}
测试数据代码
privatevoidForm2_Load(objectsender,EventArgse){List<string>name=newList<string>{"1月","2月","3月","4月","5月","6月","7月","8月"};List<int>data=newList<int>{1150,250,1550,1600,1800,900,2500,1700};List<int>data1=newList<int>{1250,2250,3550,1600,800,900,500,2700};List<int>data2=newList<int>{2150,250,1550,1600,1700,900,200,1700};FoldLineDataStylefld=newFoldLineDataStyle(data);//默认格式FoldLineDataStylefld1=newFoldLineDataStyle(data1);fld1.DataName="测试数据1";fld1.FoldLineColor=Color.Green;fld1.FoldLineDataColor=Color.Green;FoldLineDataStylefld2=newFoldLineDataStyle(data2);//fld2.DataName="测试数据1";fld2.FoldLineColor=Color.Blue;fld2.FoldLineDataColor=Color.Blue;FoldLineDatafoldLineData=newFoldLineData(newList<FoldLineDataStyle>{fld,fld1,fld2},name);foldLineData.ShowLegend=true;foldLineData.FoldLineText="测试折线图";this.foldLineDiagram1.ShowFoldLineDiagram(foldLineData);}
关于“C#折线图控件怎么使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#折线图控件怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。