C#的WinForm中制作饼状图和柱状图

using System;
using System.IO;//用于文件存取
using System.Data;//用于数据访问
using System.Drawing;//提供画GDI+图形的基本功能
using System.Drawing.Text;//提供画GDI+图形的高级功能
using System.Drawing.Drawing2D;//提供画高级二维,矢量图形功能
using System.Drawing.Imaging;//提供画GDI+图形的高级功能
namespace BaseLayer
{
 public class PieChart
 {
  public PieChart()
  {
  } 

//Render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和饼图的数据集要表示出来的数据

  public Image Render(string title, string subTitle, int width, int height, DataSet chartData,int DataLine)
  {
   const int SIDE_LENGTH = 400;
   const int PIE_DIAMETER = 200;
   DataTable dt = chartData.Tables[0]; 

   //通过输入参数,取得饼图中的总基数
   float sumData = 0;
   foreach(DataRow dr in dt.Rows)
   {
    sumData += Convert.ToSingle(dr[DataLine]);
   }
   //产生一个image对象,并由此产生一个Graphics对象
   Bitmap bm = new Bitmap(width,height);
   Graphics g = Graphics.FromImage(bm);
   //设置对象g的属性
   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",14),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<dt.Rows.Count;i++)
   {
    curAngle = Convert.ToSingle(dt.Rows[i][DataLine]) / 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,200,300,199,99);
   g.DrawString("图表说明",new Font("Tahoma",12,FontStyle.Bold),Brushes.Black,new PointF(200,300)); 

   //画图例各项
   PointF boxOrigin = new PointF(210,330);
   PointF textOrigin = new PointF(235,326);
   float percent = 0;
   for(int i=0;i<dt.Rows.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(dt.Rows[i][DataLine]) / sumData * 100;
    g.DrawString(dt.Rows[i][1].ToString() + " - " + dt.Rows[i][0].ToString() + " (" + percent.ToString("0") + "%)",new Font("Tahoma",10),Brushes.Black,textOrigin);
    boxOrigin.Y += 15;
    textOrigin.Y += 15;
   }
   //回收资源
   g.Dispose();
   return (Image) bm; 

  }
 } 

 //画条形图
 public class BarChart
 {
  public BarChart()
  {
  } 

//Render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和饼图的数据集
  public Image Render(string title, string subTitle, int width, int height, DataSet chartData)
  {
   const int SIDE_LENGTH = 400;
   const int CHART_TOP = 75;
   const int CHART_HEIGHT = 200;
   const int CHART_LEFT = 50;
   const int CHART_WIDTH = 300;
   DataTable dt = chartData.Tables[0]; 

   //计算最高的点
   float highPoint = 0;
   foreach(DataRow dr in dt.Rows)
   {
    if(highPoint<Convert.ToSingle(dr[0]))
    {
     highPoint = Convert.ToSingle(dr[0]); 

 }
   }
   //建立一个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",14),Brushes.Black,new PointF(5,5));
    //画小标题
    g.DrawString(subTitle,new Font("Tahoma",12),Brushes.Black,new PointF(7,35));
    //画条形图
    float barWidth = CHART_WIDTH / (dt.Rows.Count * 2);
    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][0]) * 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),200,300,199,99);
    g.DrawString("图表说明",new Font("Tahoma",12,FontStyle.Bold),Brushes.Black,new PointF(200,300)); 

    //画图例
    PointF boxOrigin = new PointF(210,330);
    PointF textOrigin = new PointF(235,326);
    for(int i=0;i<dt.Rows.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(dt.Rows[i][1].ToString() + " - " + dt.Rows[i][0].ToString(),new Font("Tahoma",10),Brushes.Black,textOrigin);
     boxOrigin.Y += 15;
     textOrigin.Y += 15;
    }
    //输出图形
    g.Dispose();
    return bm;
   }
   catch
   {
    return bm;
   }
  }
 }
 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;
    default:
     selectedColor = Color.Green;
     break;
   }
   return selectedColor;
  }
 }
} 

C#的WinForm中制作饼状图和柱状图

时间: 2024-10-10 22:41:54

C#的WinForm中制作饼状图和柱状图的相关文章

arcgis api for flex之专题图制作(饼状图,柱状图等)

最近公司给我一个任务,就是利用arcgis api for flex实现在地图上点(业务数据)直接显示饼状图以及柱状图的专题图制作,而不是通过点击点显示气泡窗口的形式来实现,这个公司已经实现了. 经过一段时间的摸索,参照一些网上资源,目前大概弄出来了,里面还有待完善的地方的. 效果图如下: (1)Chart.mxml,主要的展示地图专题图效果的页面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

JFreeChart框架中生成饼状图上怎样显示数据 [问题点数:40分,结帖人GreenLawn]

我用JFreeChart框架生成饼状图,但想把数据信息在饼图上显示,是在饼图内部(即圆内)显示!怎样实现啊?? 去掉lablepieplot.setLabelGenerator(null);去掉线pieplot.setLabelLinksVisible(false); 饼图标签显示百分比方法PiePlot pp = (PiePlot)chart.getPlot();pp.setLabelGenerator(new StandardPieSectionLabelGenerator("{2}&quo

JfreeChart在EXCEL中生成饼状图/柱状图/折线图

Maven <dependency> <groupId>jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.13</version> </dependency> Java import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.She

PHP实现动态生成饼状图、柱状图和折线图(转载)

PHP在图像操作方面的表现非常出色,我们只需借助可以免费得到的GD库便可以轻松实现图.表勾画.下面将分别介绍PHP实现的饼状图.折线图和柱状图以 及他们的使用方法,这几段代码的特点就是不需要再把它们复制到你的代码之中,只需要把计算得到的数据作为参数传入,即可得到相应的图形效果 代码中所有使用的函数的说明,请参见php开发文档 饼状图 设计思路 饼状图表对于查看一个值占总值的百分比是一个好的方法.我们就用PHP来实现一个饼形图表. 它的设计思想是: 1 接受参数,得到所有数值的和,得到每一个值占数

用FusionChartsFree做饼状图、柱状图、折线图的实例

1.先来看看要进行表现的页面:myChart.jsp <%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/

reportservice制作饼状图

数据源: 制作: 效果图:

转:C# 中 MSCHART 饼状图显示百分比

转自:http://blog.sina.com.cn/s/blog_51beaf0e0100yffo.html 1)显示百分比 Chart1.Series["Series1"].Label = "#PERCENT{P2}" 2)解决百分比设定后,legend的显示也为百分比的问题 首先确保你已经在设计器里将Chart设置为饼图形式 在chart的属性,打开legends集合,如果还没有legend成员添加一个,添加legend成员后,在其右边 打开    cellC

javascript将数据展示成饼状图、柱状图和折线图

本文以展示柱状图为例进行介绍,当然这仅仅是一种方法而已:还有很多方法可以用于展示图表,例如自定义图表标签.使用jfreechart插件等: 1.导入js文件,包含了很多展示方法: <script type="text/javascript" src=<select:link page="/js/ChartObject.js"/>></script> <script type="text/javascript&quo

【 D3.js 进阶系列 — 6.2 】 饼状图的拖拽

本文讲解稍微复杂一些的拖拽应用,即拖拽饼图的各部分. 在[入门 - 第 9.1 章]讲解了如何制作饼状图.饼状图的各部分是用具有宽度的弧线来表示的.在与用户进行交互的时候,如果每一部分都能拖拽,是很有趣的. 1.饼状图的绘制 与[入门 - 第 9.1 章]稍有有些不同,我们对饼状图的每一个区域都使用一个 g 标签将其包围起来,以便平移操作. var gAll = svg.append("g") .attr("transform","translate(&q