- 在我们程序开发的过程中经常会需要绘制曲线图和柱状图等,尤其是在做统计功能时。但是有时候我们有觉得没有必要使用第三方控件(例如: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;
- }
- }
- 杜思波的技术讨论帖子
相关推荐
C#中wpf使用Devexpress画图:柱状图,饼状图,散点图,曲线图
C#中wpf使用Devexpress画图:柱状图,饼状图,散点图,曲线图1.效果 完整代码下载: 下图是随便生成的数据测试效果: C#中wpf使用Devexpress画图 2.部分设置可以从控件属性直接设置 画什么样的图 series选择:图中选择的是饼状图的series 3. 绑定部分1)柱状图 <dxc:XYDiagram2D SeriesDataMember="Name">
C#曲线绘制1-自定义封装曲线
1、封装绘制曲线类。2、类包括:面板绘制、数据输入、曲线显示。3、面板大小、字体、曲线颜色和粗细提供属性更改。4、静态数据曲线和动态数据曲线生成。
C# WinForm中绘制曲线图的方法及代码示例
首先,在代码文件的顶部引入System.Windows.Forms.DataVisualization.Charting命名空间,这是Chart控件所在的命名空间。在C# WinForm应用程序中,使用Chart控件可以方便地实现曲线图的绘制和展示。在数据序列中添加数据点,可以使用AddXY方法,传入X坐标和Y坐标的数值。然后,在WinForm窗体设计器中,找到工具箱中的Data部分,将Chart控件拖动到窗体上。在窗体加载事件中,对Chart控件进行一些基本设置,例如设置标题、X轴和Y轴的标签等。
用c#绘制曲线图
在实际项目中我们经常需要绘制一些实时的数据图片,比如当前各公司的用水量、用电量还有播放声音视频时实时显示当前的声频等等,在我们最熟悉的任务管理器也有这么一个功能,用来表示当前CPU的使用频率,最近笔者刚刚给朋友完成了一个类似的功能图,用曲线图来实时表示一些实际数据,由于形象直观,很受客户欢迎。 不过由于某些原因,本人不能将实际项目中的代码拿出来给大家分享,只能模拟了一个简单的实现,代码没有过多优
C#图表绘制技术全攻略
C#,作为一种流行的编程语言,为开发者提供了强大的图表绘制能力。本章将探究C#在图表绘制领域的应用,以及其如何通过.NET Framework提供的图表绘制库来实现各种视觉表现。是.NET Framework中一个专门用于数据可视化的核心库,它为开发者提供了一系列的控件和类,能够快速地实现各种复杂图表的绘制。这个库通常用于Windows窗体应用程序中,允许开发者轻松地创建丰富的用户界面和交互式图表。它包含各种基础控件如ChartLegendTitle。
C#在C/S和B/S架构下绘制曲线图表实践指南
C#(发音为“看”)是一种现代、类型安全的面向对象编程语言,由微软开发,是.NET框架的一部分。自2002年发布以来,C#就以其简洁的语法、强大的功能和灵活性,成为开发Windows桌面应用程序、Web服务和游戏开发的首选语言。在C/S架构下,WinForms应用程序通过使用.NET Framework提供的控件来构建用户界面,实现各种功能。
C#自定义曲线绘图面板
1、显示面板绘制。2、拖动面板,X轴、Y轴都可以拖动。3、显示面板缩放,放大或者缩小。4、鼠标在面板中对应的XY轴数值。5、自动生成的数据数组,曲线显示。6、鼠标是否在曲线上检测。
新手必看:用Simulink搭建飞跨电容三电平逆变器的完整流程(附SPWM配置技巧)
本文详细介绍了使用Simulink搭建飞跨电容三电平逆变器(FCNPC)的完整流程,特别聚焦于SPWM调制策略的配置技巧。通过模块拆解、参数设置和波形优化的三步法,配合实操截图和典型参数表,帮助新手快速掌握多电平逆变器的建模与仿真技能,适用于电力电子学习和项目开发。
15-C#的scottplot控件库绘制曲线图
C#的scottplot控件库绘制曲线图
飞塔防火墙认证绕过漏洞(CVE-2022-40684)深度剖析与实战复现
本文深度剖析了Fortinet飞塔防火墙高危认证绕过漏洞CVE-2022-40684的原理与影响。该漏洞允许攻击者通过构造包含特定Forwarded头和User-Agent的HTTP请求,无需凭证即可绕过认证,以管理员身份访问设备。文章详细演示了从环境搭建到实战复现,最终植入SSH密钥获取控制权的完整过程,并提供了漏洞挖掘技巧与关键防御建议。
一种4位sar adc仿真验证
4位sar adc采用下图的电容阵列,电路如下图:所有电容的正端(也称为上极板)与比较器的反相端连接,比较器同相端接Vin,其工作过程进行大致分析见之前的文章《一种4位sar adc工作过程推导(三)》,下面对这个电路进行仿真验证。 两个参考电压VrefPV_{refP}VrefP和VrefNV_{refN}VrefN,V+=VinV_{+}=V_{in}V+=Vin,假设1116(VrefP−VrefN)+VrefN<Vin<1216(VrefP−VrefN)+VrefN\frac{
c#绘制曲线图和柱状图等
在我们程序开发的过程中经常会需要绘制曲线图和柱状图等,尤其是在做统计功能时。但是有时候我们有觉得没有必要使用第三方控件(例如:ZedGraph等),这是我们可以自己编写代码来实现这些图形绘制的功能。以下是我在开发过程中所使用过的两段代码,现共享大家,希望能给大家带来一定的帮助,如有不妥敬请斧正!1.柱状图,效果图如下 代码如下:注意:请注意参数 chartTable 图形里的一些
深入探讨:StoreKit 2的交易处理与收据验证
iOS应用开发中,StoreKit 2带来收据处理和交易验证的新变化。本文通过实例分析,对比传统StoreKit与StoreKit 2的差异,指出直接访问sandboxReceipt文件可能引发错误。解决方案是使用Transaction对象和SKReceiptRefreshRequest,详细介绍了如何初始化ReceiptLoader、处理交易更新及验证收据的完整流程,帮助开发者适应新框架,确保购买流程安全可靠。
C#绘制各种统计图的实现方法
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/an_ding/archive/2009/12/01/4912440.aspxview plaincopy to clipboardprint?using System; using System.Collections.Generic; using System.Linq; using S
HDMI接口及其在编程中的应用
在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文将介绍HDMI接口的基本原理以及如何在编程中使用HDMI接口。在编程中,我们可以使用HDMI接口来控制和管理连接到计算机的HDMI设备。本文介绍了HDMI接口的基本原理,并提供了使用Python编程语言和相关库实现HDMI接口应用的示例代码。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。我们可以使用编程语言提供的音频库来生成和播放音频,并将其通过HDMI接口输出到连接的设备上。
【在 WSL2 GUI 中使用 pulseaudio 播放声音】
最近在搞一个Linux项目,由于WSL2中需要用到声音外放,无奈只能潜心研究。后来就使用了一种折中的方式替代,那就是pulseaudio。目前来讲WSL2对硬件外设的支持还是不太友好,关于USB的支持我之前在其他文章中已经论述过了,这里不讨论。1、Windows11别忘记打开声音2、可能有一定延迟,因为是通过网络传输的。3、效果的话只能见仁见智了,如果不能满足要求就安装一个实实在在的Ubuntu吧!
c#语言编程中GDI+的运用
c#语言编程中GDI+的运用 简介:c#语言编程中GDI+的运用,主要是利用利用C#中System.Drawing命名空间中的类进行操作, 自定义生成各种图形,此文章我们要完成是根据统计数据, 输出各种统计统计图形,包括饼状图、曲线分析图、柱形图、多组 -------------------------------------------
05GATK流程和找变异
05GATK流程和找变异 GATK 集合了一套功能全面的高通量测序数据基因组分析工具包,算是业界的权威,更新的速度非常快。需要注意的是,不同版本的 GATK 在工具应用上会有些许不同。这里我们使用是最新版本 GATK 4.1.4.1(截止2019年12月31日)。 数据准备 前面我们提到了,走GATK流程需要到官网下载很多数据库文件,比如下面这些: dbsnp_146.hg38.vcf.gz dbsnp_146.hg38.vcf.gz.tbi Mills_and_1000G_gold_standard.
绘制图形C#
01.using System; 02.using System.Collections.Generic; 03.using System.Linq; 04.using System.Text; 05.// 06.using System.Drawing; 07.// 08.namespace DatePrint 09.{ 10.
第3章: MMU Interval Notifier 区间通知器的核心原理⭐
摘要:区间级内存通知机制分析 本文分析了Linux内核中区间级内存通知机制(mmu_interval_notifier)的设计原理与实现。该机制针对传统全局通知(mmu_notifier)存在的性能开销大、无法精确控制等问题,通过引入区间树(Interval Tree)实现精确匹配,仅当内存变化与注册区间重叠时才触发回调。核心优势包括:1)O(log n + k)的高效查找性能;2)支持独立管理各内存区间;3)实现高并发处理不同区间的失效事件。
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
绘图Draw
public class WebForm1 : System.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { //This is the interface to outer usage int widthValue = 800; int heightValue
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
.NET MSChart画图:曲线,柱形,曲线叠加图,以及配置,下载示意图
.net坐标系绘图 C#绘制曲线通用方法 .NET MSChart画图:曲线,柱形,曲线叠加图,以及配置,下载示意图 2010-10-25 20:49:53| 分类: 其他技术 | 标签: |字号大中小 订阅 下载地址: .NET Framework 3.5 SP1 的 ASP.NET 和 Windows 窗体图表控件 ...
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
C# Winform 柱状图/曲线图(Chart组件)
柱状图: 曲线图: 要柱状图还是曲线图这边选就行了 配置: // 设置曲线的样式对象 Series singer_series = sum_chart.Series[0]; // 画样条曲线(Spline) //series.ChartType = SeriesChartType.Spline; // 线宽2个像素 sum_series.BorderWidth = 2; ...
C#曲线图柱状图和折线图,用了2个chart控件实现
chart1.ChartAreas[0].AxisX.MajorGrid.LineWidth = 0; chart1.ChartAreas[0].AxisX.Interval = 1;?? //设置X轴坐标的间隔为1 chart1.ChartAreas[0].AxisX.IntervalOffset = 1;? //设置X轴坐标偏移...
Cteechart实例:绘制曲线图利器,提升C图表展示
Cteechart实例:绘制曲线图利器,提升C#图表展示 去发现同类优质开源项目:https://gitcode.com/ 在C#开发中,图表的展示与定制是提升用户体验的关键环节。今天,我们将为您介绍一个功能强大的开源项目——Cteechart实例,它能让您轻松绘制出高质量的曲线图。 项目介绍 Cteechart实例是一个开源项目,提供了C#环境下使用teechart库绘制曲线图的相关实例代码。t...
1万+



被折叠的 条评论
为什么被折叠?



