📄 piechart.cs
字号:
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Text;
using System.Collections;
using System.IO;//用于文件存取
using System.Data;//用于数据访问
using System.Data.OleDb;
using System.Drawing;//提供画GDI+图形的基本功能
using System.Drawing.Imaging;//提供画GDI+图形的高级功能
using System.Drawing.Text;//提供画高级二维,矢量图形功能
using System.Drawing.Drawing2D;//提供画GDI+图形的高级功能
namespace PM
{
/// <summary>
/// PieChart 的摘要说明。
/// </summary>
public class PieChart
{
public PieChart(){}
/// <summary>
/// 画饼图统计图
/// </summary>
/// <param name="title">大标题</param>
/// <param name="subTitle">小标题</param>
/// <param name="width">画布的宽</param>
/// <param name="height">画布的长</param>
/// <param name="chartdata">提供给饼型统计图的数据</param>
/// <returns></returns>
#region 画饼图统计图
//Render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集
public static Image Render(string title, string subTitle, int width, int height,ChartData chartdata)
{
const int SIDE_LENGTH = 600;//画布边长
const int PIE_DIAMETER = 200;//饼图直径
ChartData cd = chartdata;
//通过输入的参数,取得饼图中的总基数
float sumData = 0;
for(int i = 0 ; i < cd.DataName.Count ; i ++)
{
sumData += float.Parse(cd.DataValue[i].ToString());
}
Bitmap btp = new Bitmap(width,height);
Graphics g = Graphics.FromImage(btp);
g.ScaleTransform(Convert.ToSingle(width)/SIDE_LENGTH,Convert.ToSingle(height)/SIDE_LENGTH);
//获取呈现的图象质量
g.SmoothingMode = SmoothingMode.Default;
//获取文本呈现模式
g.TextRenderingHint = TextRenderingHint.AntiAlias;
//设定画布和边
g.Clear(Color.White);
g.DrawRectangle(Pens.Black,0,0,SIDE_LENGTH-1,SIDE_LENGTH-1);
//画饼图标题
g.DrawString(title,new Font("Tahoma",24),Brushes.Black,new PointF(5,5));
//画饼图子标题
g.DrawString(subTitle,new Font("Tahoma",12),Brushes.Black,new PointF(7,35));
//画饼图
float curAngle = 0;
float totalAngle = 0;
for(int i=0;i<cd.DataValue.Count;i++)
{
curAngle = Convert.ToSingle(float.Parse(cd.DataValue[i].ToString())) / sumData * 360;
g.FillPie(new SolidBrush(ChartUtil.GetChartItemColor(i)),100,65,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);
g.DrawPie(Pens.Black,100,65,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);
totalAngle += curAngle;
}
//画图例框及其文字
g.DrawRectangle(Pens.Black,400,40,199,500);
g.DrawString("图表说明",new Font("Tahoma",12,FontStyle.Bold),Brushes.Black,new PointF(400,50));
//画图例各项
PointF boxOrigin = new PointF(410,80);
PointF textOrigin = new PointF(435,80);
float percent = 0;
for(int i=0;i<cd.DataValue.Count;i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,20,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,20,10);
percent = Convert.ToSingle(float.Parse(cd.DataValue[i].ToString())) / sumData * 100;
g.DrawString(cd.DataName[i].ToString()+ " (" + percent.ToString("0") + "%)",new Font("Tahoma",10),Brushes.Black,textOrigin);
boxOrigin.Y += 15;
textOrigin.Y += 15;
}
//回收资源
g.Dispose();
return (Image) btp;
}
#endregion
/// <summary>
/// 画柱型统计图
/// </summary>
/// <param name="title">大标题</param>
/// <param name="subTitle">小标题</param>
/// <param name="width">画布的宽</param>
/// <param name="height">画布的长</param>
/// <param name="chartdata">提供给柱型统计图的数据</param>
/// <returns></returns>
#region 画柱型统计图
public static Image Render1(string title, string subTitle, int width, int height, ChartData chartdata)
{
const int SIDE_LENGTH = 600;
const int CHART_TOP = 75;
const int CHART_HEIGHT = 200;
const int CHART_LEFT = 50;
const int CHART_WIDTH = 300;
ChartData cd = chartdata;
//计算最高的点
float highPoint = 0;
for(int i = 0 ; i < cd.DataName.Count ; i ++)
{
if(float.Parse(cd.DataValue[i].ToString()) > float.Parse(cd.DataValue[0].ToString()))
{
highPoint = float.Parse(cd.DataValue[i].ToString());
}
}
//建立一个Graphics对象实例
Bitmap bm = new Bitmap(width,height);
try
{
Graphics g = Graphics.FromImage(bm);
//设置条图图形和文字属性
g.ScaleTransform((Convert.ToSingle(width))/SIDE_LENGTH,(Convert.ToSingle(height))/SIDE_LENGTH);
g.SmoothingMode = SmoothingMode.Default;
g.TextRenderingHint = TextRenderingHint.AntiAlias;
//设定画布和边
g.Clear(Color.White);
g.DrawRectangle(Pens.Black,0,0,SIDE_LENGTH-1,SIDE_LENGTH-1);
//画大标题
g.DrawString(title,new Font("Tahoma",24),Brushes.Black,new PointF(5,5));
//画小标题
g.DrawString(subTitle,new Font("Tahoma",12),Brushes.Black,new PointF(7,35));
//画条形图
float barWidth = CHART_WIDTH / (cd.DataValue.Count * 2);//分多少条条形型图,同时条形图的间隔是一条条形图的间隔
PointF barOrigin = new PointF(CHART_LEFT + (barWidth / 2),0);
float barHeight = cd.DataValue.Count;
for(int i = 0 ; i < cd.DataValue.Count ; i ++)
{
barHeight = Convert.ToSingle(cd.DataValue[i].ToString()) * 200 / highPoint * 1;
barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight;
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),barOrigin.X,barOrigin.Y,barWidth,barHeight);
barOrigin.X = barOrigin.X + (barWidth * 2);
}
//设置边
g.DrawLine(new Pen(Color.Black,2),new Point(CHART_LEFT,CHART_TOP),new Point(CHART_LEFT,CHART_TOP + CHART_HEIGHT));
g.DrawLine(new Pen(Color.Black,2),new Point(CHART_LEFT,CHART_TOP + CHART_HEIGHT),new Point(CHART_LEFT + CHART_WIDTH,CHART_TOP + CHART_HEIGHT));
//画图例框和文字
g.DrawRectangle(new Pen(Color.Black,1),400,40,199,500);
g.DrawString("图表说明",new Font("Tahoma",12,FontStyle.Bold),Brushes.Black,new PointF(400,40));
//画图例
PointF boxOrigin = new PointF(410,80);
PointF textOrigin = new PointF(435,80);
for(int i=0;i<cd.DataName.Count;i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,20,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,20,10);
g.DrawString(cd.DataName[i].ToString() + " - " + cd.DataValue[i].ToString(),new Font("Tahoma",10),Brushes.Black,textOrigin);
boxOrigin.Y += 15;
textOrigin.Y += 15;
}
//输出图形
g.Dispose();
return bm;
}
catch
{
return bm;
}
}
}
#endregion
/// <summary>
/// 统计图颜色的选择
/// </summary>
#region 统计图颜色的选择
public class ChartUtil
{
public ChartUtil(){}
public static Color GetChartItemColor(int itemIndex)
{
Color selectedColor;
switch(itemIndex)
{
case 0:
selectedColor = Color.Blue;
break;
case 1:
selectedColor = Color.Red;
break;
case 2:
selectedColor = Color.Yellow;
break;
case 3:
selectedColor = Color.Purple;
break;
case 4:
selectedColor = Color.Green;
break;
case 5:
selectedColor = Color.Plum;
break;
case 6:
selectedColor = Color.RosyBrown;
break;
default:
selectedColor = Color.Salmon;
break;
}
return selectedColor;
}
}
#endregion
/// <summary>
/// 自定义数据类。
/// 用来存的数据是一对的数据,例如(“女” 100)表示女的有100个
/// </summary>
#region 自定义数据类
public class ChartData
{
//存储的内容
private ArrayList dataName;
//存储内容的数量
private ArrayList dataValue;
#region 内容的属性
public ArrayList DataName
{
get
{
return dataName;
}
set
{
dataName = value;
}
}
#endregion
#region 数量的属性
public ArrayList DataValue
{
get
{
return dataValue;
}
set
{
dataValue = value;
}
}
#endregion
#region 无参数构造函数
public ChartData()
{
this.dataName = new ArrayList();
this.dataValue = new ArrayList();
}
#endregion
#region 参数为两个ArrayList构造函数
public ChartData(ArrayList tempdataName,ArrayList tempdataValue)
{
this.dataName = tempdataName;
this.dataValue = tempdataValue;
}
#endregion
#region 增加元素方法
public void Add(string tempName, float tempValue)
{
this.dataName.Add(tempName);
this.dataValue.Add(tempValue);
}
#endregion
#region 删除元素的方法
public bool Remove(string tempName,float tempValue)
{
if(dataName.BinarySearch(tempName) > 0 && dataValue.BinarySearch(tempValue) > 0)
{
dataName.Remove(tempName);
dataValue.Remove(tempValue);
return true;
}
else
{
return false;
}
}
#endregion
}
#endregion
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -