利用C#实现条形图、饼图的绘制(二)

 

继前一篇文章提到关于使用C#绘制条形图的思路之后,这里接着介绍绘制饼图的思路。本篇文章所涉及的源代码是在前面的基础上完成的,在本文的最后,将会提供本实例的完整代码下载地址,有兴趣的朋友可以下载。
    言归正传,开始介绍饼图的绘制。其实,饼图的绘制跟条形图的绘制有颇多相似之处,其大体亦经过以下几个步骤:
    (1)创建Graphics对象实例;
    (2)设置图形及文本属性;
    (3)设置画布及边框;
    (4)绘制标题文本;
    (5)循环绘制扇形图并最终组合成饼图,这里利用了FillPie方法;
    (6)绘制图例。
    饼图的绘制在类PieGraph中实现,以下为其代码示例:

[c-sharp] view plain copy

  1. using System;  
  2. using System.Data;  
  3. using System.Drawing;  
  4. using System.Drawing.Text;  
  5. using System.Drawing.Drawing2D;  
  6. using System.Collections.Generic;  
  7.   
  8. namespace GraphDrawing  
  9. {  
  10.     class PieGraph  
  11.     {  
  12.         #region Member fields  
  13.         ///   
  14.         /// The color list for each bar drawing  
  15.         ///   
  16.         private List m_colorList;  
  17.   
  18.         ///   
  19.         /// The data for graph drawing  
  20.         ///   
  21.         private DataTable m_dataTable;  
  22.   
  23.         ///   
  24.         /// The width of graph  
  25.         ///   
  26.         private int m_width;  
  27.   
  28.         ///   
  29.         /// The height of graph  
  30.         ///   
  31.         private int m_height;  
  32.   
  33.         ///   
  34.         /// The legend width of graph  
  35.         ///   
  36.         private int m_legendWidth;  
  37.         #endregion  
  38.  
  39.         #region Public properties  
  40.         ///   
  41.         /// The title of graph  
  42.         ///   
  43.         public string GraphTitle { get; set; }  
  44.   
  45.         ///   
  46.         /// The font format of graph  
  47.         ///   
  48.         public string FontFormat { get; set; }  
  49.         #endregion  
  50.   
  51.         ///   
  52.         /// Constructor with arguments  
  53.         ///   
  54.         /// the graph width  
  55.         /// the graph height  
  56.         /// the graph legend width  
  57.         /// the graph data  
  58.         public PieGraph(int width, int height, int legendWidth, DataTable dataTable)  
  59.         {  
  60.             m_width = width;  
  61.             m_height = height;  
  62.             m_legendWidth = legendWidth;  
  63.             m_dataTable = dataTable;  
  64.   
  65.             m_colorList = Utils.GetColorList();  
  66.         }  
  67.   
  68.         ///   
  69.         /// Generate Pie graph  
  70.         ///   
  71.         /// bitmap  
  72.         public Bitmap DrawPieGraph()  
  73.         {  
  74.             int iPieDiameter = m_width < (m_height + 150) ? (m_width - 250) : (m_height - 150);  
  75.   
  76.             // Calculate the sum  
  77.             float fSum = 0;  
  78.             foreach (DataRow row in m_dataTable.Rows)  
  79.             {  
  80.                 fSum += Convert.ToSingle(row[1]);  
  81.             }  
  82.   
  83.             // Create an object of Graphics  
  84.             Bitmap bitmap = new Bitmap(m_width, m_height);  
  85.             Graphics graph = Graphics.FromImage(bitmap);  
  86.   
  87.             // Set the attribute of bar and text  
  88.             graph.ScaleTransform(1, 1);  
  89.             graph.SmoothingMode = SmoothingMode.Default;  
  90.             graph.TextRenderingHint = TextRenderingHint.AntiAlias;  
  91.   
  92.             // Set the canvas and the border  
  93.             graph.Clear(Color.White);  
  94.             graph.DrawRectangle(Pens.Green, 0, 0, m_width - 5, m_height - 5);  
  95.   
  96.             // Draw the graph title  
  97.             graph.DrawString(GraphTitle, new Font(FontFormat, 14), Brushes.Black, new PointF(7, 35));  
  98.   
  99.             // Draw the pie graph  
  100.             float fCurrentAngle = 0;  
  101.             float fTotalAngle = 0;  
  102.             for (int i = 0; i < m_dataTable.Rows.Count; i++)  
  103.             {  
  104.                 fCurrentAngle = Convert.ToSingle(m_dataTable.Rows[i][1]) / fSum * 360;  
  105.   
  106.                 graph.FillPie(new SolidBrush(m_colorList[i]), 50, 75, iPieDiameter, iPieDiameter, fTotalAngle, fCurrentAngle);  
  107.                 graph.DrawPie(Pens.Black, 50, 75, iPieDiameter, iPieDiameter, fTotalAngle, fCurrentAngle);  
  108.                 fTotalAngle += fCurrentAngle;  
  109.             }   
  110.   
  111.             // Draw the legend of graph  
  112.             bitmap = DrawLegend(bitmap);  
  113.   
  114.             return bitmap;  
  115.         }  
  116.   
  117.         ///   
  118.         /// Generate the legend  
  119.         ///   
  120.         ///   
  121.         ///   
  122.         private Bitmap DrawLegend(Bitmap graph)  
  123.         {  
  124.             Bitmap bitmap = new Bitmap(250, m_height);  
  125.             Graphics objGraphic = Graphics.FromImage(bitmap);  
  126.             Graphics graphic = Graphics.FromImage(graph);  
  127.   
  128.             int i, x;  
  129.             for (i = 0, x = m_legendWidth; i < m_dataTable.Rows.Count; i++)  
  130.             {  
  131.                 //Draw the bar  
  132.                 SolidBrush brush = new SolidBrush(m_colorList[i]);  
  133.                 objGraphic.FillRectangle(brush, 10, m_height - 90 - x, m_legendWidth, m_legendWidth);  
  134.   
  135.                 string drawString = m_dataTable.Rows[i][0].ToString() + " - " + m_dataTable.Rows[i][1].ToString();  
  136.                 Font drawFont = new Font(FontFormat, 8);  
  137.                 SolidBrush drawBrush = new SolidBrush(Color.Black);  
  138.   
  139.                 objGraphic.DrawString(drawString, drawFont, drawBrush, m_legendWidth * 2, m_height - 90 - x);  
  140.   
  141.                 //x axis spacing by m_legendWidth + 5  
  142.                 x += m_legendWidth + 5;  
  143.             }  
  144.   
  145.             // Draw the string and the rectangle for the legend  
  146.             graphic.DrawRectangle(new Pen(Color.Purple, 1), m_width - 180, m_height - 85 - x, 160, x + 10);  
  147.             graphic.DrawString("Legend", new Font(FontFormat, 11, FontStyle.Bold), Brushes.Purple, new PointF(m_width - 180, m_height - 110 - x));  
  148.   
  149.             graphic.DrawImage(bitmap, m_width - 180, 10);  
  150.   
  151.             return (graph);  
  152.         }  
  153.     }  
  154. }  

 

    同样,在WinForm中调用亦非常简单,代码示例如下:

[c-sharp] view plain copy

  1. ///   
  2. /// Draw the pie graph  
  3. ///   
  4. private void DrawPieGraph()  
  5. {  
  6.     this.ReadInputData();  
  7.   
  8.     string strTitle = txtGraphTitle.Text;  
  9.     string strFont = "Courier";  
  10.     int iWidth = picPieGraph.Width;  
  11.     int iHeight = picPieGraph.Height;  
  12.     int iLegendWidth = (iWidth - 200) / (m_dataTable.Rows.Count * 2);  
  13.   
  14.     PieGraph pieGraph = new PieGraph(iWidth, iHeight, iLegendWidth, m_dataTable);  
  15.     pieGraph.GraphTitle = strTitle;  
  16.     pieGraph.FontFormat = strFont;  
  17.   
  18.     // Output the graph to the picture box  
  19.     picPieGraph.Image = pieGraph.DrawPieGraph();  
  20. }  

 

    最终的饼图绘制界面效果如下图所示:

    整个绘图程序的源代码可以从以下地址下载:http://download.csdn.net/source/2386682。到此,利用C#的GDI+绘制条形图和饼图就介绍到这里,这里介绍的都是很基本的方法,并未作深入探讨,更深层次的研究有待日后继续。绘图,就是如此简单。

 

你可能感兴趣的:(C#)