ASP.Net绘制柱状图和曲线图示例
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int widthvalue = 800;
int heightvalue = 500;
string xTile, yTitle;
int offsetX = 20;
int offsetY = 20;
//柱状之间的间距
int spaceSpan = 15;
xTile = "Title";
yTitle = "Sum";
Bitmap imgbitmap = new Bitmap(widthvalue + 5 * offsetX, heightvalue + 2 * offsetY, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(imgbitmap);
g.Clear(Color.Snow);
Pen linePen = new Pen(Color.Black);
linePen.Width = 2;
//Draw Title
Font txtFont = new Font("Courier", 10, GraphicsUnit.Point);
String title = "This is the title to be displayed";
g.DrawString(title, txtFont, Brushes.Blue, new PointF(imgbitmap.Width / 2, 0));
Point original = new Point(offsetX, heightvalue + offsetY);
Point xEndPonit = new Point(widthvalue + offsetX, heightvalue + offsetY);
Point yEndPonit = new Point(offsetX, 0);
//X coordinate
g.DrawLine(linePen, original, xEndPonit);
//Y Coordinate
g.DrawLine(linePen, original, yEndPonit);
//Draw arrows
Point leftArrowStart = new Point(offsetX * 3 / 4, offsetY / 3);
Point rightArrowEnd = new Point(offsetX * 5 / 4, offsetY / 3);
g.DrawLine(linePen, leftArrowStart, yEndPonit);
g.DrawLine(linePen, yEndPonit, rightArrowEnd);
Point topArrowStart = new Point(widthvalue + offsetX * 3 / 4, heightvalue + offsetY * 3 / 4);
Point bottomArrowEnd = new Point(widthvalue + offsetX * 3 / 4, heightvalue + offsetY * 5 / 4);
g.DrawLine(linePen, topArrowStart, xEndPonit);
g.DrawLine(linePen, xEndPonit, bottomArrowEnd);
//Draw X-Title
g.DrawString(xTile, txtFont, Brushes.Blue, new PointF(bottomArrowEnd.X - g.MeasureString(xTile, txtFont).Width, topArrowStart.Y + 10));
StringFormat f = new StringFormat();
//f.Alignment = StringAlignment.Center;
//Draw Y-Title
f.LineAlignment = StringAlignment.Center;
g.DrawString(yTitle, txtFont, Brushes.Blue, new PointF(offsetX * 5 / 3, 15), f);
//画单个柱状图的代码
//测试数据
/**
int[] staticData = new int[]{20,30,80,50,200,120,20,30,80,50,200,120,60,90,140};
int maxValue = MaxValue(staticData);
int ratio = heightvalue/maxValue;
int groupCount = staticData.Length; //柱状图组数
ResetValue(staticData,ratio);
int rectWidth = (widthvalue - (groupCount +1)*spaceSpan )/ groupCount;
Rectangle rect;
int startX = offsetX + spaceSpan; //起始坐标点
for(int i=0;i
{
rect = new Rectangle(startX,heightvalue +offsetY - staticData,rectWidth,staticData);
g.DrawRectangle(Pens.Green,rect);
g.FillRectangle(Brushes.Green,rect);
startX = startX + rectWidth + spaceSpan;
}
**/
// Type t = dataList.GetType();
// if(t.IsArray)
// {
// }
//画分组柱状图代码
ArrayList dataList = new ArrayList();
int[] data1 = new int[] { 20, 30, 50, 100 };
int[] data2 = new int[] { 50, 60, 30, 30 };
int[] data3 = new int[] { 80, 50, 60, 85 };
int[] data4 = new int[] { 20, 30, 90, 58 };
int[] data5 = new int[] { 50, 60, 30, 30 };
int[] data6 = new int[] { 80, 50, 60, 85 };
int[] data7 = new int[] { 20, 30, 90, 58 };
dataList.Add(data1);
dataList.Add(data2);
dataList.Add(data3);
dataList.Add(data4);
dataList.Add(data5);
dataList.Add(data6);
dataList.Add(data7);
int maxValue = MaxValue(dataList);
int ratio = heightvalue / maxValue;
int groupCount = dataList.Count; //柱状图组数
ResetValue(dataList, ratio);
//根据比率画坐标
//Draw X-Grids, The height value is divided into 10 parts
int heightStep = heightvalue / 10;
Point point1, point2;
for (int i = 1; i <= 10; i++)
{
point1 = new Point(offsetX * 3 / 4, offsetY + heightvalue - heightStep * i);
point2 = new Point(offsetX, point1.Y);
g.DrawLine(Pens.Black, point1, point2);
String text = maxValue / 10 * i + "";
g.DrawString(text, txtFont, Brushes.Blue, new PointF(-2, point1.Y));
}
//画坐标结束
int rectWidth = (widthvalue - (groupCount +1)*spaceSpan )/ groupCount;
int innerGroupCount = GetInnerGroupCount(dataList);
int innerWidth = rectWidth / innerGroupCount;
Rectangle rect;
int startX = offsetX + spaceSpan; //起始坐标点
for(int i=0;i<dataList.Count;i++)
{
int[] staticData = (int[])dataList;
for(int j=0;j<staticData.Length;j++)
{
rect = new Rectangle(startX,heightvalue +offsetY - staticData[j],innerWidth,staticData[j]);
g.DrawRectangle(GetPenColor(j),rect);
g.FillRectangle(GetBrushColor(j),rect);
startX = startX + innerWidth;
}
startX = startX + spaceSpan;
}
//画曲线
Point pnt1 = new Point(200+offsetX,heightvalue+offsetY-300);
Point pnt2 = new Point(300+offsetX,heightvalue+offsetY-500);
Point pnt3 = new Point(400+offsetX,heightvalue+offsetY-300);
Point pnt4 = new Point(600+offsetX,heightvalue+offsetY-600);
g.DrawCurve(Pens.Purple,new Point[]{pnt1,pnt2,pnt3,pnt4});
//g.DrawCurve(Pens.Purple,new Point[]{pnt1,pnt2,pnt3,pnt4});
//画饼图
g.DrawPie ( Pens.Red , 50 , 50 , 150 , 150 , 0 , 30 ) ;
imgbitmap.Save(Response.OutputStream,ImageFormat.Gif);
}
private int MaxValue(int[] data)
{
int maxValue = 0;
for(int i=0;i<data.Length;i++)
{
if(data>maxValue)
maxValue = data;
}
return maxValue;
}
private int MaxValue(ArrayList dataList)
{
int maxValue = 0;
for (int i = 0; i < dataList.Count; i++)
{
int newMaxValue = MaxValue((int[])dataList);
if (newMaxValue > maxValue)
maxValue = newMaxValue;
}
return maxValue;
}
private void ResetValue(int[] data, int ratio)
{
for (int i = 0; i < data.Length; i++)
data *= ratio;
}
private void ResetValue(ArrayList dataList, int ratio)
{
for (int i = 0; i < dataList.Count; i++)
{
ResetValue((int[])dataList, ratio);
}
}
private int GetInnerGroupCount(ArrayList dataList)
{
int groupCount = 0;
for (int i = 0; i < dataList.Count; i++)
{
int count = ((int[])dataList).Length;
if (count > groupCount)
groupCount = count;
}
return groupCount;
}
private Pen GetPenColor(int index)
{
Pen linePen = new Pen(Color.Black);
linePen.Width = 1;
linePen.CompoundArray = new float[] { 0.0F, 0.2F };
switch (index)
{
case 0:
linePen.Color = Color.Gray;
break;
case 1:
linePen.Color = Color.Green;
break;
case 2:
linePen.Color = Color.Blue;
break;
case 3:
linePen.Color = Color.Purple;
break;
}
return linePen;
}
private Brush GetBrushColor(int index)
{
switch (index)
{
case 0:
return Brushes.Gray;
case 1:
return Brushes.Green;
case 2:
return Brushes.Blue;
case 3:
return Brushes.Purple;
}
return Brushes.Red;
}
}
{
protected void Page_Load(object sender, EventArgs e)
{
int widthvalue = 800;
int heightvalue = 500;
string xTile, yTitle;
int offsetX = 20;
int offsetY = 20;
//柱状之间的间距
int spaceSpan = 15;
xTile = "Title";
yTitle = "Sum";
Bitmap imgbitmap = new Bitmap(widthvalue + 5 * offsetX, heightvalue + 2 * offsetY, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(imgbitmap);
g.Clear(Color.Snow);
Pen linePen = new Pen(Color.Black);
linePen.Width = 2;
//Draw Title
Font txtFont = new Font("Courier", 10, GraphicsUnit.Point);
String title = "This is the title to be displayed";
g.DrawString(title, txtFont, Brushes.Blue, new PointF(imgbitmap.Width / 2, 0));
Point original = new Point(offsetX, heightvalue + offsetY);
Point xEndPonit = new Point(widthvalue + offsetX, heightvalue + offsetY);
Point yEndPonit = new Point(offsetX, 0);
//X coordinate
g.DrawLine(linePen, original, xEndPonit);
//Y Coordinate
g.DrawLine(linePen, original, yEndPonit);
//Draw arrows
Point leftArrowStart = new Point(offsetX * 3 / 4, offsetY / 3);
Point rightArrowEnd = new Point(offsetX * 5 / 4, offsetY / 3);
g.DrawLine(linePen, leftArrowStart, yEndPonit);
g.DrawLine(linePen, yEndPonit, rightArrowEnd);
Point topArrowStart = new Point(widthvalue + offsetX * 3 / 4, heightvalue + offsetY * 3 / 4);
Point bottomArrowEnd = new Point(widthvalue + offsetX * 3 / 4, heightvalue + offsetY * 5 / 4);
g.DrawLine(linePen, topArrowStart, xEndPonit);
g.DrawLine(linePen, xEndPonit, bottomArrowEnd);
//Draw X-Title
g.DrawString(xTile, txtFont, Brushes.Blue, new PointF(bottomArrowEnd.X - g.MeasureString(xTile, txtFont).Width, topArrowStart.Y + 10));
StringFormat f = new StringFormat();
//f.Alignment = StringAlignment.Center;
//Draw Y-Title
f.LineAlignment = StringAlignment.Center;
g.DrawString(yTitle, txtFont, Brushes.Blue, new PointF(offsetX * 5 / 3, 15), f);
//画单个柱状图的代码
//测试数据
/**
int[] staticData = new int[]{20,30,80,50,200,120,20,30,80,50,200,120,60,90,140};
int maxValue = MaxValue(staticData);
int ratio = heightvalue/maxValue;
int groupCount = staticData.Length; //柱状图组数
ResetValue(staticData,ratio);
int rectWidth = (widthvalue - (groupCount +1)*spaceSpan )/ groupCount;
Rectangle rect;
int startX = offsetX + spaceSpan; //起始坐标点
for(int i=0;i
{
rect = new Rectangle(startX,heightvalue +offsetY - staticData,rectWidth,staticData);
g.DrawRectangle(Pens.Green,rect);
g.FillRectangle(Brushes.Green,rect);
startX = startX + rectWidth + spaceSpan;
}
**/
// Type t = dataList.GetType();
// if(t.IsArray)
// {
// }
//画分组柱状图代码
ArrayList dataList = new ArrayList();
int[] data1 = new int[] { 20, 30, 50, 100 };
int[] data2 = new int[] { 50, 60, 30, 30 };
int[] data3 = new int[] { 80, 50, 60, 85 };
int[] data4 = new int[] { 20, 30, 90, 58 };
int[] data5 = new int[] { 50, 60, 30, 30 };
int[] data6 = new int[] { 80, 50, 60, 85 };
int[] data7 = new int[] { 20, 30, 90, 58 };
dataList.Add(data1);
dataList.Add(data2);
dataList.Add(data3);
dataList.Add(data4);
dataList.Add(data5);
dataList.Add(data6);
dataList.Add(data7);
int maxValue = MaxValue(dataList);
int ratio = heightvalue / maxValue;
int groupCount = dataList.Count; //柱状图组数
ResetValue(dataList, ratio);
//根据比率画坐标
//Draw X-Grids, The height value is divided into 10 parts
int heightStep = heightvalue / 10;
Point point1, point2;
for (int i = 1; i <= 10; i++)
{
point1 = new Point(offsetX * 3 / 4, offsetY + heightvalue - heightStep * i);
point2 = new Point(offsetX, point1.Y);
g.DrawLine(Pens.Black, point1, point2);
String text = maxValue / 10 * i + "";
g.DrawString(text, txtFont, Brushes.Blue, new PointF(-2, point1.Y));
}
//画坐标结束
int rectWidth = (widthvalue - (groupCount +1)*spaceSpan )/ groupCount;
int innerGroupCount = GetInnerGroupCount(dataList);
int innerWidth = rectWidth / innerGroupCount;
Rectangle rect;
int startX = offsetX + spaceSpan; //起始坐标点
for(int i=0;i<dataList.Count;i++)
{
int[] staticData = (int[])dataList;
for(int j=0;j<staticData.Length;j++)
{
rect = new Rectangle(startX,heightvalue +offsetY - staticData[j],innerWidth,staticData[j]);
g.DrawRectangle(GetPenColor(j),rect);
g.FillRectangle(GetBrushColor(j),rect);
startX = startX + innerWidth;
}
startX = startX + spaceSpan;
}
//画曲线
Point pnt1 = new Point(200+offsetX,heightvalue+offsetY-300);
Point pnt2 = new Point(300+offsetX,heightvalue+offsetY-500);
Point pnt3 = new Point(400+offsetX,heightvalue+offsetY-300);
Point pnt4 = new Point(600+offsetX,heightvalue+offsetY-600);
g.DrawCurve(Pens.Purple,new Point[]{pnt1,pnt2,pnt3,pnt4});
//g.DrawCurve(Pens.Purple,new Point[]{pnt1,pnt2,pnt3,pnt4});
//画饼图
g.DrawPie ( Pens.Red , 50 , 50 , 150 , 150 , 0 , 30 ) ;
imgbitmap.Save(Response.OutputStream,ImageFormat.Gif);
}
private int MaxValue(int[] data)
{
int maxValue = 0;
for(int i=0;i<data.Length;i++)
{
if(data>maxValue)
maxValue = data;
}
return maxValue;
}
private int MaxValue(ArrayList dataList)
{
int maxValue = 0;
for (int i = 0; i < dataList.Count; i++)
{
int newMaxValue = MaxValue((int[])dataList);
if (newMaxValue > maxValue)
maxValue = newMaxValue;
}
return maxValue;
}
private void ResetValue(int[] data, int ratio)
{
for (int i = 0; i < data.Length; i++)
data *= ratio;
}
private void ResetValue(ArrayList dataList, int ratio)
{
for (int i = 0; i < dataList.Count; i++)
{
ResetValue((int[])dataList, ratio);
}
}
private int GetInnerGroupCount(ArrayList dataList)
{
int groupCount = 0;
for (int i = 0; i < dataList.Count; i++)
{
int count = ((int[])dataList).Length;
if (count > groupCount)
groupCount = count;
}
return groupCount;
}
private Pen GetPenColor(int index)
{
Pen linePen = new Pen(Color.Black);
linePen.Width = 1;
linePen.CompoundArray = new float[] { 0.0F, 0.2F };
switch (index)
{
case 0:
linePen.Color = Color.Gray;
break;
case 1:
linePen.Color = Color.Green;
break;
case 2:
linePen.Color = Color.Blue;
break;
case 3:
linePen.Color = Color.Purple;
break;
}
return linePen;
}
private Brush GetBrushColor(int index)
{
switch (index)
{
case 0:
return Brushes.Gray;
case 1:
return Brushes.Green;
case 2:
return Brushes.Blue;
case 3:
return Brushes.Purple;
}
return Brushes.Red;
}
}