合肥中山医院靠谱吗:C#绘制曲线图和柱状图

来源:百度文库 编辑:偶看新闻 时间:2024/05/04 17:07:28

在我们程序开发的过程中经常会需要绘制曲线图和柱状图等,尤其是在做统计功能时。但是有时候我们有觉得没有必要使用第三方控件(例如:ZedGraph等),这是我们可以自己编写代码来实现这些图形绘制的功能。以下是我在开发过程中所使用过的两段代码,现共享大家,希望能给大家带来一定的帮助,如有不妥敬请斧正!
1.柱状图,效果图如下

代码如下:

注意:请注意参数 chartTable 图形里的一些元素需要从chartTable里面取。具体请查看代码。

        //Render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和饼图的数据集 
        public Image Render(string title, int width, int height, DataTable chartTable)
        {
            Bitmap bm = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bm);
            g.Clear(Color.White);

            DataTable dt = chartTable;
            const int top = 30;
            const int left = 35;

            if (width < left * 2 || height < top * 2)
            {
                g.DrawString("绘图区域太小", new Font("Tahoma", 8),
                    Brushes.Blue, new PointF(0, 0));
                return bm;
            }

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

                if (highPoint < Convert.ToSingle(dr[1]))
                {
                    highPoint = Convert.ToSingle(dr[1]);
                }
            }
            try
            {
                //画大标题 
                g.DrawString(title, new Font("Tahoma", 12), Brushes.Black, new PointF(2, 2));
                StringFormat drawFormat = new StringFormat();
                drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;

                g.DrawString("[红--" + dt.Columns[0].ToString() + "]", new Font("Tahoma", 8),
                    Brushes.Red, new PointF(2, top), drawFormat);
                g.DrawString("[蓝--" + dt.Columns[1].ToString() + "]", new Font("Tahoma", 8),
                    Brushes.Blue, new PointF(17, top), drawFormat);

                //画条形图 
                float barWidth = (Convert.ToSingle(width) - left) / (dt.Rows.Count * 3 + 1);
                PointF barOrigin = new PointF(left + barWidth, 0);
                float barHeight = dt.Rows.Count;
                float topFontSize = (barWidth / highPoint.ToString().Length);
                
                if (topFontSize > 2*top/3)
                {
                    topFontSize = 2*top/3;
                }
                if (topFontSize < 5)
                {
                    topFontSize = 5;
                }
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //底部字体的大小
                    float bottomFontSize = (2 * barWidth / dt.Rows[i][2].ToString().Length) + 2;
                    if (bottomFontSize > 2 * top / 3)
                    {
                        bottomFontSize = 2 * top / 3;
                    }

                    barHeight = Convert.ToSingle(dt.Rows[i][0]) * (height - 2 * top) / highPoint * 1;
                    barOrigin.Y = height - barHeight - top;
                    g.FillRectangle(new SolidBrush(Color.Red), barOrigin.X, barOrigin.Y, barWidth, barHeight);
                    //柱状图底部
                    g.DrawString(dt.Rows[i][2].ToString(), new Font("Tahoma", bottomFontSize), Brushes.Black,
                        new PointF(barOrigin.X, height - top));
                    //柱状图顶部
                    g.DrawString(dt.Rows[i][0].ToString(), new Font("Tahoma", topFontSize), Brushes.Red,
                        new PointF(barOrigin.X, barOrigin.Y - 3*topFontSize/2));

                    barOrigin.X = barOrigin.X + barWidth;


                    barHeight = Convert.ToSingle(dt.Rows[i][1]) * (height - 2 * top) / highPoint * 1;
                    barOrigin.Y = height - barHeight - top;
                    g.FillRectangle(new SolidBrush(Color.Blue), barOrigin.X, barOrigin.Y, barWidth, 

barHeight);
                    //柱状图顶部
                    g.DrawString(dt.Rows[i][1].ToString(), new Font("Tahoma", topFontSize), Brushes.Blue,
                        new PointF(barOrigin.X, barOrigin.Y - 3 * topFontSize/2));
                    barOrigin.X = barOrigin.X + (barWidth * 2);
                }

                //设置边 
                g.DrawLine(new Pen(Color.Blue, 2), new Point(left, top),
                    new Point(left, height - top));

                g.DrawLine(new Pen(Color.Blue, 2), new Point(left, height - top),
                    new Point(left + width, height - top));

                g.Dispose();
                return bm;
            }
            catch
            {
                return bm;
            }
        }
2.线状图,效果如下:

代码如下:
注意:请注意参数 chartTable 图形里的一些元素需要从chartTable里面取。具体请查看代码。

        //Render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和饼图的数据集 
        public Image Render(string title, int width, int height, DataTable chartTable)
        {
            Bitmap bm = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bm);
            g.Clear(Color.White);

            const int top = 30;
            const int left = 35;
            if (width < left * 2 || height < top * 2)
            {
                g.DrawString("绘图区域太小" ,new Font("Tahoma", 8),
                    Brushes.Blue, new PointF(0, 0));
                return bm;
            }

            if (chartTable == null)
            {
                g.DrawString("没有数据", new Font("Tahoma", 7),
                    Brushes.Blue, new PointF(0, 0));
                return bm;
            }

            DataTable dt = chartTable;

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

                if (highPoint < Convert.ToSingle(dr[1]))
                {
                    highPoint = Convert.ToSingle(dr[1]);
                }
            }

            //建立一个Graphics对象实例 
            try
            {
                //画大标题 
                g.DrawString(title, new Font("Tahoma", 12), Brushes.Black, new PointF(2, 2));
                StringFormat drawFormat = new StringFormat();
                drawFormat.FormatFlags = StringFormatFlags.DirectionVertical;

                g.DrawString("[红--" + dt.Columns[0].ToString() + "]", new Font("Tahoma", 8),
                    Brushes.Red, new PointF(2, top), drawFormat);
                g.DrawString("[蓝--" + dt.Columns[1].ToString() + "]", new Font("Tahoma", 8),
                    Brushes.Blue, new PointF(17, top), drawFormat);

                //画条形图 
                float barWidth = (Convert.ToSingle(width) - left) / (dt.Rows.Count + 1);
                PointF barOrigin = new PointF(left + barWidth , 0);
                float barHeight = dt.Rows.Count;
                float topFontSize = 7;
                float bottomFontSize = 7;

                PointF[] pt1 = new PointF[dt.Rows.Count];
                PointF[] pt2 = new PointF[dt.Rows.Count];

                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    //底部字体的大小
                    barHeight = Convert.ToSingle(dt.Rows[i][0]) * (height - 2 * top) / highPoint * 1;
                    barOrigin.Y = height - barHeight - top;
                    g.FillEllipse(new SolidBrush(Color.Red), barOrigin.X - 3, barOrigin.Y - 3, 6, 6);
                    pt1[i] = new PointF(barOrigin.X, barOrigin.Y);
                    //顶部
                    g.DrawString(dt.Rows[i][0].ToString(), new Font("Tahoma", topFontSize), Brushes.Red,
                        new PointF(barOrigin.X, barOrigin.Y - 4 * topFontSize / 2));

                    barHeight = Convert.ToSingle(dt.Rows[i][1]) * (height - 2 * top) / highPoint * 1;
                    barOrigin.Y = height - barHeight - top;
                    g.FillEllipse(new SolidBrush(Color.Blue), barOrigin.X - 3, barOrigin.Y - 3, 6, 6);
                    pt2[i] = new PointF(barOrigin.X, barOrigin.Y);
                    //顶部
                    g.DrawString(dt.Rows[i][1].ToString(), new Font("Tahoma", topFontSize), Brushes.Blue,
                        new PointF(barOrigin.X, barOrigin.Y - 4 * topFontSize / 2));
                    barOrigin.X = barOrigin.X + barWidth;
                }
                if (dt.Rows.Count > 10)
                {
                    int dis = dt.Rows.Count / 10;
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (i % dis == 0)
                        {
                            g.DrawLine(new Pen(Color.Blue, 2), new PointF(left + (i + 1) * barWidth, height - 

top + 5),
                                new PointF(left + (i + 1) * barWidth, height - top - 3));
                            //底部
                            g.DrawString(dt.Rows[i][2].ToString(), new Font("Tahoma", bottomFontSize), 

Brushes.Black,
                                new PointF(left + (i + 1) * barWidth, height - top));
                        }
                        else
                        {
                            g.DrawLine(new Pen(Color.Gray, 1), new PointF(left + (i+1) * barWidth, height - 

top + 3),
                                new PointF(left + (i+1) * barWidth, height - top - 3));
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        g.DrawLine(new Pen(Color.Gray, 1), new PointF(left + (i + 1) * barWidth, height - top 

+ 3),
                            new PointF(left + (i + 1) * barWidth, height - top - 3));
                    }
                }

                //绘制曲线
                g.DrawLines(new Pen(new SolidBrush(Color.Red), 1), pt1);
                g.DrawLines(new Pen(new SolidBrush(Color.Blue),1), pt2);
                //设置边 
                g.DrawLine(new Pen(Color.Blue, 2), new Point(left, top),
                    new Point(left, height - top));
                g.DrawLine(new Pen(Color.Blue, 2), new Point(left, height - top),
                    new Point(left + width, height - top));

                g.Dispose();
                return bm;
            }
            catch
            {
                return bm;
            }
        }