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;
}
}