C#绘制柱状图和折线图的方法

 更新时间:2022年2月12日 19:47  点击:1111 作者:VIProgram

本文实例为大家分享了C#绘制柱状图和折线图的具体代码,供大家参考,具体内容如下

运行效果如下图:

设计上面的柱状图和折线图其实并没有什么难度,主要是各个坐标的计算,完全是精细活。首先在窗体在添加了一个tabControl控件来切换柱状图和折线图的显示,在tabPage1中显示柱状图,在tabPage2中显示折线图。然后在各自的Page页属性中定义Paint事件,具体实现过程可以从下面的代码中看到。

代码如下:

添加头文件:

using System.Drawing.Drawing2D;

tabPage1的Paint事件(画柱状图):

private void tabPage1_Paint(object sender, PaintEventArgs e)
        {
            BackColor = Color.White;
            //标题
            Graphics g = tabPage1.CreateGraphics();
            Font f = new Font("宋体", 24, FontStyle.Regular);
            Pen p = new Pen(Color.Blue);
            g.DrawString("报名及考试统计柱状图", f, p.Brush, 200, 20);
 
            //画表格
            for (int i = 0; i <= 9; i++)
            {
                g.DrawLine(p, 30, 90 + 31 * i, 620, 90 + 31 * i);
            }
            for (int i = 1; i <= 14; i++)
            {
                g.DrawLine(p, 30 + 42 * i, 60, 30 + 42 * i, 370);
            }
 
            Pen MyPen = new Pen(Color.Blue, 2);
            Point p1 = new Point(30, 60);
            Point p2 = new Point(30, 370);
            Point p3 = new Point(30, 370);
            Point p4 = new Point(620, 370);
            g.DrawLine(MyPen, p1, p2);
            g.DrawLine(MyPen, p3, p4);
 
            //红色图形部分
            Pen drawPen = new Pen(Color.Red, 1);
            SolidBrush mybrush = new SolidBrush(Color.Red);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 21, 370 - 41, 21, 41);
            e.Graphics.FillRectangle(mybrush, 30 + 21, 370 - 41, 21, 41);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 42 * 2 + 21, 370 - 31 * 4 - 10, 21, 31 * 4 + 10);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 2 + 21, 370 - 31 * 4 - 10, 21, 31 * 4 + 10);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 42 * 4 + 21, 370 - 31 * 2 - 20, 21, 31 * 2 + 20);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 4 + 21, 370 - 31 * 2 - 20, 21, 31 * 2 + 20);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 42 * 6 + 21, 370 - 31 * 1 - 20, 21, 31 * 1 + 20);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 6 + 21, 370 - 31 * 1 - 20, 21, 31 * 1 + 20);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 42 * 8 + 21, 370 - 31 * 5 - 25, 21, 31 * 5 + 25);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 8 + 21, 370 - 31 * 5 - 25, 21, 31 * 5 + 25);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 42 * 10 + 21, 370 - 31 * 4 - 7, 21, 31 * 4 + 7);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 10 + 21, 370 - 31 * 4 - 7, 21, 31 * 4 + 7);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 42 * 12 + 21, 60, 21, 370 - 60);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 12 + 21, 60, 21, 370 - 60);
 
 
            //绿色图形部分
            Pen drawPen2 = new Pen(Color.Green, 1);
            SolidBrush brush = new SolidBrush(Color.Green);
            e.Graphics.DrawRectangle(drawPen2, 30 + 42, 370 - 31, 21, 31);
            e.Graphics.FillRectangle(brush, 30 + 42, 370 - 31, 21, 31);
 
            e.Graphics.DrawRectangle(drawPen2, 30 + 42 * 3, 370 - 31 * 2 - 15, 21, 31 * 2 + 15);
            e.Graphics.FillRectangle(brush, 30 + 42 * 3, 370 - 31 * 2 - 15, 21, 31 * 2 + 15);
 
            e.Graphics.DrawRectangle(drawPen2, 30 + 42 * 5, 370 - 31 - 10, 21, 41);
            e.Graphics.FillRectangle(brush, 30 + 42 * 5, 370 - 31 - 10, 21, 41);
 
            e.Graphics.DrawRectangle(drawPen2, 30 + 42 * 7, 370 - 16, 21, 16);
            e.Graphics.FillRectangle(brush, 30 + 42 * 7, 370 - 16, 21, 16);
 
            e.Graphics.DrawRectangle(drawPen2, 30 + 42 * 9, 370 - 31 * 3 - 20, 21, 31 * 3 + 20);
            e.Graphics.FillRectangle(brush, 30 + 42 * 9, 370 - 31 * 3 - 20, 21, 31 * 3 + 20);
 
            e.Graphics.DrawRectangle(drawPen2, 30 + 42 * 11, 370 - 31 * 1 - 28, 21, 31 * 1 + 28);
            e.Graphics.FillRectangle(brush, 30 + 42 * 11, 370 - 31 * 1 - 28, 21, 31 * 1 + 28);
 
            e.Graphics.DrawRectangle(drawPen2, 30 + 42 * 13, 370 - 31 * 5 - 15, 21, 31 * 5 + 15);
            e.Graphics.FillRectangle(brush, 30 + 42 * 13, 370 - 31 * 5 - 15, 21, 31 * 5 + 15);
 
            //图上的文字部分
            Font font2 = new Font("宋体", 10, FontStyle.Regular);
            g.DrawString("第一期", font2, p.Brush, 30 + 21, 375);
            g.DrawString("第二期", font2, p.Brush, 30 + 42 * 2 + 21, 375);
            g.DrawString("第三期", font2, p.Brush, 30 + 42 * 4 + 21, 375);
            g.DrawString("第四期", font2, p.Brush, 30 + 42 * 6 + 21, 375);
            g.DrawString("上半年", font2, p.Brush, 30 + 42 * 8 + 21, 375);
            g.DrawString("下半年", font2, p.Brush, 30 + 42 * 10 + 21, 375);
            g.DrawString("全年统计", font2, p.Brush, 30 + 42 * 12 + 21, 375);
 
            //图上数字部分
            g.DrawString("25", font2, p.Brush, 10, 370 - 35);
            g.DrawString("50", font2, p.Brush, 10, 370 - 35 * 2);
            g.DrawString("75", font2, p.Brush, 10, 370 - 34 * 3);
            g.DrawString("100", font2, p.Brush, 5, 370 - 33 * 4);
            g.DrawString("125", font2, p.Brush, 5, 370 - 33 * 5);
            g.DrawString("150", font2, p.Brush, 5, 370 - 32 * 6);
            g.DrawString("175", font2, p.Brush, 5, 370 - 32 * 7);
            g.DrawString("200", font2, p.Brush, 5, 370 - 32 * 8);
            g.DrawString("225", font2, p.Brush, 5, 370 - 32 * 9);
            g.DrawString("250", font2, p.Brush, 5, 370 - 32 * 10);
 
            //红色数
            Pen pen2 = new Pen(Color.Red);
            g.DrawString("39", font2, pen2.Brush, 30 + 21, 370 - 41 - 15);
            g.DrawString("111", font2, pen2.Brush, 30 + 42 * 2 + 21, 370 - 31 * 4 - 10 - 15);
            g.DrawString("71", font2, pen2.Brush, 30 + 42 * 4 + 21, 370 - 31 * 2 - 20 - 15);
            g.DrawString("40", font2, pen2.Brush, 30 + 42 * 6 + 21, 370 - 31 * 1 - 20 - 15);
            g.DrawString("150", font2, pen2.Brush, 30 + 42 * 8 + 21, 370 - 31 * 5 - 25 - 15);
            g.DrawString("111", font2, pen2.Brush, 30 + 42 * 10 + 21, 370 - 31 * 4 - 7 - 15);
            g.DrawString("261", font2, pen2.Brush, 30 + 42 * 12 + 21, 60 - 15);
 
 
            //绿色数
            Pen pen3 = new Pen(Color.Green);
            g.DrawString("39", font2, pen2.Brush, 30 + 21, 370 - 41 - 15);
            g.DrawString("111", font2, pen2.Brush, 30 + 42 * 2 + 21, 370 - 31 * 4 - 10 - 15);
            g.DrawString("71", font2, pen2.Brush, 30 + 42 * 4 + 21, 370 - 31 * 2 - 20 - 15);
            g.DrawString("40", font2, pen2.Brush, 30 + 42 * 6 + 21, 370 - 31 * 1 - 20 - 15);
            g.DrawString("150", font2, pen2.Brush, 30 + 42 * 8 + 21, 370 - 31 * 5 - 25 - 15);
            g.DrawString("111", font2, pen2.Brush, 30 + 42 * 10 + 21, 370 - 31 * 4 - 7 - 15);
            g.DrawString("261", font2, pen2.Brush, 30 + 42 * 12 + 21, 60 - 15);
 
 
            //最下面的矩形框
            e.Graphics.DrawRectangle(p, 30 + 42 * 2 + 30, 400, 42 * 7, 31 * 2);
 
            e.Graphics.DrawRectangle(drawPen, 30 + 42 * 5, 410, 21, 10);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 5, 410, 21, 10);
            g.DrawString("报名人数", font2, pen2.Brush, 30 + 42 * 6, 410);
 
            e.Graphics.DrawRectangle(drawPen2, 30 + 42 * 5, 440, 21, 10);
            e.Graphics.FillRectangle(brush, 30 + 42 * 5, 440, 21, 10);
            g.DrawString("通过人数", font2, pen3.Brush, 30 + 42 * 6, 440);
 }

tabPage2的Paint事件(画折线图):

private void tabPage2_Paint(object sender, PaintEventArgs e)
        {
            BackColor = Color.White;
            //标题
            Graphics g = tabPage2.CreateGraphics();
            Font f = new Font("宋体", 24, FontStyle.Regular);
            Pen p = new Pen(Color.Blue);
            g.DrawString("报名及考试统计折线图", f, p.Brush, 200, 20);
 
            //画表格
            for (int i = 0; i <= 9; i++)
            {
                g.DrawLine(p, 30, 90 + 31 * i, 620, 90 + 31 * i);
            }
            for (int i = 1; i <= 7; i++)
            {
                g.DrawLine(p, 30 + 84 * i, 60, 30 + 84 * i, 370);
            }
            Pen MyPen = new Pen(Color.Blue, 2);
            Point p1 = new Point(30, 60);
            Point p2 = new Point(30, 370);
            Point p3 = new Point(30, 370);
            Point p4 = new Point(620, 370);
            g.DrawLine(MyPen, p1, p2);
            g.DrawLine(MyPen, p3, p4);
 
 
            //绘制折线
            Pen pen1 = new Pen(Color.Red, 2);
            Pen pen2 = new Pen(Color.Green,2);
 
            //红色折线
            Point a1, a2, a3, a4, a5, a6, a7;
            a1 = new Point(30,370-31-20);
            a2 = new Point(30+84*1,370-(31*4+9));
            a3 = new Point(30 + 84 * 2,370-(31*2+28));
            a4 = new Point(30 + 84 * 3, 370 - (31 * 1 + 20));
            a5 = new Point(30 + 84 * 4, 370 - (31 * 5 + 21));
            a6 = new Point(30 + 84 * 5, 370 - (31 * 4 + 10));
            a7 = new Point(30 + 84 * 6, 60);
            Point[] points = { a1,a2,a3,a4,a5,a6,a7};
            g.DrawLines(pen1, points);
 
            //绿色折线
            Point b1, b2, b3, b4, b5, b6, b7;
            b1 = new Point(30,370-(31*1+1));
            b2 = new Point(30+84*1,370-(31*2+15));
            b3 = new Point(30 + 84 * 2, 370 - (31 * 1 + 10));
            b4 = new Point(30 + 84 * 3, 370 - (31 * 0 + 15));
            b5 = new Point(30 + 84 * 4, 370 - (31 * 3 + 15));
            b6 = new Point(30 + 84 * 5, 370 - (31 * 1 + 29));
            b7 = new Point(30 + 84 * 6, 370 - (31 * 5 + 14));
            Point[] points2 = { b1, b2, b3, b4, b5, b6, b7 };
            g.DrawLines(pen2,points2);
 
            //图上数字部分
            Font font2 = new Font("宋体", 10, FontStyle.Regular);
            g.DrawString("25", font2, pen1.Brush, 10, 370 - 35);
            g.DrawString("50", font2, pen1.Brush, 10, 370 - 35 * 2);
            g.DrawString("75", font2, pen1.Brush, 10, 370 - 34 * 3);
            g.DrawString("100", font2, pen1.Brush, 5, 370 - 33 * 4);
            g.DrawString("125", font2, pen1.Brush, 5, 370 - 33 * 5);
            g.DrawString("150", font2, pen1.Brush, 5, 370 - 32 * 6);
            g.DrawString("175", font2, pen1.Brush, 5, 370 - 32 * 7);
            g.DrawString("200", font2, pen1.Brush, 5, 370 - 32 * 8);
            g.DrawString("225", font2, pen1.Brush, 5, 370 - 32 * 9);
            g.DrawString("250", font2, pen1.Brush, 5, 370 - 32 * 10);
 
            //文字
            g.DrawString("第一期", font2, pen1.Brush, 15, 375);
            g.DrawString("第二期", font2, pen1.Brush, 15 + 84 * 1, 375);
            g.DrawString("第三期", font2, pen1.Brush, 15 + 84 * 2, 375);
            g.DrawString("第四期", font2, pen1.Brush, 15 + 84 * 3, 375);
            g.DrawString("上半年", font2, pen1.Brush, 15 + 84 * 4, 375);
            g.DrawString("下半年", font2, pen1.Brush, 15 + 84 * 5, 375);
            g.DrawString("全年统计", font2, pen1.Brush, 15 + 84 * 6, 375);
 
 
            //折线图上的数字
            g.DrawString("39", font2, pen1.Brush, 30, 370 - 31 - 20 - 15);
            g.DrawString("111", font2, pen1.Brush, 30 + 84 * 1, 370 - (31 * 4 + 9) - 15);
            g.DrawString("71", font2, pen1.Brush, 30 + 84 * 2, 370 - (31 * 2 + 28) - 15);
            g.DrawString("40", font2, pen1.Brush, 30 + 84 * 3, 370 - (31 * 1 + 20) - 15);
            g.DrawString("150", font2, pen1.Brush, 30 + 84 * 4, 370 - (31 * 5 + 21) - 15);
            g.DrawString("111", font2, pen1.Brush, 30 + 84 * 5, 370 - (31 * 4 + 10) - 15);
            g.DrawString("261", font2, pen1.Brush, 30 + 84 * 6, 60 - 15);
 
            g.DrawString("26", font2, pen2.Brush, 30, 370 - (31 * 1 + 1) - 15);
            g.DrawString("68", font2, pen2.Brush, 30 + 84 * 1, 370 - (31 * 2 + 15) - 15);
            g.DrawString("35", font2, pen2.Brush, 30 + 84 * 2, 370 - (31 * 1 + 10) - 15);
            g.DrawString("14", font2, pen2.Brush, 30 + 84 * 3, 370 - (31 * 0 + 15) - 15);
            g.DrawString("94", font2, pen2.Brush, 30 + 84 * 4, 370 - (31 * 3 + 15) - 15);
            g.DrawString("49", font2, pen2.Brush, 30 + 84 * 5, 370 - (31 * 1 + 29) - 15);
            g.DrawString("143", font2, pen2.Brush, 30 + 84 * 6, 370 - (31 * 5 + 14) - 15);

            //最下面的矩形框
 
            SolidBrush mybrush = new SolidBrush(Color.Red);
            SolidBrush brush = new SolidBrush(Color.Green);
 
            e.Graphics.DrawRectangle(pen1, 30 + 42 * 2 + 30, 400, 42 * 7, 31 * 2);
 
            e.Graphics.DrawRectangle(pen1, 30 + 42 * 5, 410, 21, 10);
            e.Graphics.FillRectangle(mybrush, 30 + 42 * 5, 410, 21, 10);
            g.DrawString("报名人数", font2, pen1.Brush, 30 + 42 * 6, 410);
 
            e.Graphics.DrawRectangle(pen2, 30 + 42 * 5, 440, 21, 10);
            e.Graphics.FillRectangle(brush, 30 + 42 * 5, 440, 21, 10);
            g.DrawString("通过人数", font2, pen2.Brush, 30 + 42 * 6, 440);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

原文出处:https://blog.csdn.net/VIProgram/article/details/49592379

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • matplotlib bar()实现百分比堆积柱状图

    这篇文章主要介绍了matplotlib bar()实现百分比堆积柱状图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-24
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25