怎么画方图和曲线图?绝对会结贴!

boyliulang 2003-06-04 01:57:15
在C#怎么画方图和曲线图,饼图?
...全文
60 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gOODiDEA 2003-06-05
  • 打赏
  • 举报
回复

public class BarChart
{
public BarChart()
{
}

public void Render(string title, string subTitle, int width, int height, DataSet chartData, Stream target)
{
const int SIDE_LENGTH = 400;
const int CHART_TOP = 75;
const int CHART_HEIGHT = 220;
const int CHART_LEFT = 50;
const int CHART_WIDTH = 300;

DataTable dt = chartData.Tables[0];

//calculate highest data point
float highPoint = 0;
foreach(DataRow dr in dt.Rows)
{
if(highPoint<Convert.ToSingle(dr[1]))
{
highPoint = Convert.ToSingle(dr[1]);
}
}

//create a new image
Bitmap bm = new Bitmap(width,height);
Graphics g = Graphics.FromImage(bm);

//set image attributes
g.ScaleTransform((Convert.ToSingle(width))/SIDE_LENGTH,(Convert.ToSingle(height))/SIDE_LENGTH);
g.SmoothingMode = SmoothingMode.Default;
g.TextRenderingHint = TextRenderingHint.AntiAlias;

//draw canvas and border
g.Clear(Color.White);
g.DrawRectangle(Pens.Black,0,0,SIDE_LENGTH-1,SIDE_LENGTH-1);

//draw title
g.DrawString(title,new Font("黑体",20),Brushes.Black,new PointF(5,5));

//draw sub-title
g.DrawString(subTitle,new Font("宋体",12),Brushes.Black,new PointF(7,35));

//draw the bars
float barWidth = CHART_WIDTH / (float)(dt.Rows.Count * 1.5);
PointF barOrigin = new PointF(CHART_LEFT + (barWidth / 2),0);
float barHeight = dt.Rows.Count;
for(int i=0;i<dt.Rows.Count;i++)
{
barHeight = Convert.ToSingle(dt.Rows[i][1]) * 200 / highPoint;
barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight;

g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),barOrigin.X,barOrigin.Y,barWidth,barHeight);
PointF textrage = new PointF(barOrigin.X,barOrigin.Y-12);
//g.DrawString(dt.Rows[i][1].ToString(),new Font("Tahoma",8),Brushes.Black,textrage);
barOrigin.X = barOrigin.X + (float)(barWidth * 1.5);
}

//draw bottom and left margins
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+5,CHART_TOP + CHART_HEIGHT));
Point point1 =new Point(CHART_LEFT+3,CHART_TOP);
Point point2 = new Point(CHART_LEFT-3,CHART_TOP);
Point point3 = new Point(CHART_LEFT,CHART_TOP-10);
Point[] curvePoints ={point1,point2,point3};
g.FillPolygon(new SolidBrush(Color.Black),curvePoints);

if(dt.Rows.Count<=8)
{
//draw legend box and label
g.DrawRectangle(Pens.Black,200,300,199,119);
//g.DrawString("图例",new Font("宋体",10,FontStyle.Bold),Brushes.Black,new PointF(200,300));

//draw legend items
PointF boxOrigin = new PointF(210,300);
PointF textOrigin = new PointF(230,300);


for(int i=0;i<dt.Rows.Count;i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,15,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,15,10);

g.DrawString(dt.Rows[i][0].ToString() + " - " + dt.Rows[i][1].ToString(),new Font("黑体",7),Brushes.Black,textOrigin);
boxOrigin.Y += 8;
textOrigin.Y += 8;
}
}
else
{
g.DrawRectangle(Pens.Black,0,300,399,180);
g.DrawString("图例",new Font("宋体",10,FontStyle.Bold),Brushes.Black,new PointF(0,301));
//draw legend items
PointF boxOrigin = new PointF(10,300);
PointF textOrigin = new PointF(30,300);

float percent = 0;

for(int i=0;i<(dt.Rows.Count/2);i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,15,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,15,10);

g.DrawString(dt.Rows[i][0].ToString() + " - " + dt.Rows[i][1].ToString(),new Font("黑体",7),Brushes.Black,textOrigin);
boxOrigin.Y += 8;
textOrigin.Y += 8;
}

boxOrigin = new PointF(210,300);
textOrigin = new PointF(230,300);

percent = 0;
for(int i=(dt.Rows.Count/2);i<dt.Rows.Count;i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,15,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,15,10);

g.DrawString(dt.Rows[i][0].ToString() + " - " + dt.Rows[i][1].ToString(),new Font("黑体",7),Brushes.Black,textOrigin);
boxOrigin.Y += 8;
textOrigin.Y += 8;
}
}


//stream the bar chart image to the browser via the Response.OutputStream object
bm.Save(target, ImageFormat.Gif);

//garbage collection
bm.Dispose();
g.Dispose();
}
}

public class ChartUtil
{
public ChartUtil()
{
}

public static Color GetChartItemColor(int itemIndex)
{
Color selectedColor;

switch(itemIndex)
{
case 0:
selectedColor = Color.DarkRed;
break;
case 1:
selectedColor = Color.Aqua;
break;
case 2:
selectedColor = Color.Indigo;
break;
case 3:
selectedColor = Color.Goldenrod;
break;
case 4:
selectedColor = Color.Blue;
break;
case 5:
selectedColor = Color.Teal;
break;
case 6:
selectedColor = Color.DarkKhaki;
break;
case 7:
selectedColor = Color.GreenYellow;
break;
case 8:
selectedColor = Color.Gold;
break;
case 9:
selectedColor = Color.Crimson;
break;
case 10:
selectedColor = Color.MediumSeaGreen;
break;
case 11:
selectedColor = Color.Yellow;
break;
case 12:
selectedColor = Color.BlueViolet;
break;
case 13:
selectedColor = Color.LightSteelBlue;
break;
case 14:
selectedColor = Color.Red;
break;
case 15:
selectedColor = Color.DarkSalmon;
break;
case 16:
selectedColor = Color.Cornsilk;
break;
case 17:
selectedColor = Color.Chartreuse;
break;
case 18:
selectedColor = Color.CornflowerBlue;
break;
case 19:
selectedColor = Color.DarkGoldenrod;
break;
case 20:
selectedColor = Color.Beige;
break;
case 21:
selectedColor = Color.Orange;
break;
default:
selectedColor = Color.DarkGreen;
break;
}

return selectedColor;
}
}
}
gOODiDEA 2003-06-05
  • 打赏
  • 举报
回复
using System;
using System.IO;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace xxx
{
/// <summary>
/// chart 的摘要说明。
/// </summary>
public class PieChart
{
public PieChart()
{
}

public void Render(string title, string subTitle, int width, int height, DataSet chartData, Stream target)
{
const int SIDE_LENGTH = 400;
const int PIE_DIAMETER = 245;

DataTable dt = chartData.Tables[0];

//calculate total amount of units in the pie, based on the data passed in
float sumData = 0;
foreach(DataRow dr in dt.Rows)
{
sumData += Convert.ToSingle(dr[1]);
}

//create a new image
Bitmap bm = new Bitmap(width,height);
Graphics g = Graphics.FromImage(bm);

//set image attributes
g.ScaleTransform((Convert.ToSingle(width))/SIDE_LENGTH,(Convert.ToSingle(height))/SIDE_LENGTH);
g.SmoothingMode = SmoothingMode.Default;
g.TextRenderingHint = TextRenderingHint.AntiAlias;

//draw canvas and border
g.Clear(Color.White);
g.DrawRectangle(Pens.Black,0,0,SIDE_LENGTH-1,SIDE_LENGTH-1);

//draw title
g.DrawString(title,new Font("黑体",20),Brushes.Black,new PointF(5,5));

//draw sub-title
g.DrawString(subTitle,new Font("宋体",12),Brushes.Black,new PointF(7,35));

//draw the pie
float curAngle = 0;
float totalAngle = 0;
for(int i=0;i<dt.Rows.Count;i++)
{
curAngle = Convert.ToSingle(dt.Rows[i][1]) / sumData * 360;

g.FillPie(new SolidBrush(ChartUtil.GetChartItemColor(i)),80,53,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);
g.DrawPie(Pens.Black,80,53,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);

totalAngle += curAngle;
}
if(dt.Rows.Count<=12)
{
//draw legend box and label
g.DrawRectangle(Pens.Black,200,300,199,119);
//g.DrawString("图例",new Font("宋体",10,FontStyle.Bold),Brushes.Black,new PointF(200,300));

//draw legend items
PointF boxOrigin = new PointF(210,300);
PointF textOrigin = new PointF(230,300);

float percent = 0;

for(int i=0;i<dt.Rows.Count;i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,16,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,16,10);

percent = Convert.ToSingle(dt.Rows[i][1]) / sumData * 100;
g.DrawString(dt.Rows[i][0].ToString() + " - " + dt.Rows[i][1].ToString() + " (" + percent.ToString("0") + "%)",new Font("黑体",7),Brushes.Black,textOrigin);
boxOrigin.Y +=8;
textOrigin.Y += 8;
}
}
else
{
g.DrawRectangle(Pens.Black,0,300,399,180);
//g.DrawString("图例",new Font("宋体",10,FontStyle.Bold),Brushes.Black,new PointF(0,301));
//draw legend items
PointF boxOrigin = new PointF(10,300);
PointF textOrigin = new PointF(30,300);

float percent = 0;

for(int i=0;i<(dt.Rows.Count/2);i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,15,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,15,10);

percent = Convert.ToSingle(dt.Rows[i][1]) / sumData * 100;
g.DrawString(dt.Rows[i][0].ToString() + " - " + dt.Rows[i][1].ToString() + " (" + percent.ToString("0") + "%)",new Font("黑体",7),Brushes.Black,textOrigin);
boxOrigin.Y += 8;
textOrigin.Y += 8;
}

boxOrigin = new PointF(210,300);
textOrigin = new PointF(230,300);

percent = 0;
for(int i=(dt.Rows.Count/2);i<dt.Rows.Count;i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,15,10);
g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,15,10);

percent = Convert.ToSingle(dt.Rows[i][1]) / sumData * 100;
g.DrawString(dt.Rows[i][0].ToString() + " - " + dt.Rows[i][1].ToString() + " (" + percent.ToString("0") + "%)",new Font("黑体",7),Brushes.Black,textOrigin);
boxOrigin.Y += 8;
textOrigin.Y += 8;
}
}

//stream the pie chart image to the browser via the Response.OutputStream object
bm.Save(target, ImageFormat.Gif);

//garbage collection
bm.Dispose();
g.Dispose();
}
}
online 2003-06-04
  • 打赏
  • 举报
回复
http://www.codeproject.com/aspnet/WebChart.asp
http://developer.ccidnet.com/pub/disp/Article?columnID=340&articleID=46869&pageNO=1
online 2003-06-04
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1840/1840374.xml?temp=9.948367E-02
xf_david921 2003-06-04
  • 打赏
  • 举报
回复
用控件,具体名字不记得了,可以去查查

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧