news 2026/4/25 21:19:19

【WinForm UI控件系列】散点图/折线图控件 (支持数值型、时间型、字符串型)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【WinForm UI控件系列】散点图/折线图控件 (支持数值型、时间型、字符串型)

前言:c# winform UI控件系列(Net6+),纯GDI绘图无依赖,虽然做不到最好,争取做好更好用!

一、效果图 (x轴三种类型:数值、时间、字符串)





  • 支持五种颜色风格。
  • 标题:位置支持(左中右布局)
  • x轴标题、y轴标题:支持旋转角度。图例支持位置定义(选择合适位置)
  • 是否显示连线,是否显示网格线,是否圆滑曲线

二、使用说明

ScatterPlot 散点图/折线图控件

控件简介

ScatterPlot 是一个功能强大的散点图和折线图控件,参考 ScottPlot 设计,支持平滑曲线、多种X轴类型(数值型、字符串型、日期时间型)、网格线、值提示和图例显示。

主要特性

  • 多种X轴类型:支持 Numeric(数值)、Category(字符串类别)、DateTime(日期时间)
  • 平滑曲线:支持 Smooth 平滑曲线显示,可调整张力
  • 网格线:支持 X/Y 轴网格线显示控制
  • 值提示:鼠标悬停显示数据点值,支持自动格式化
  • 图例位置控制:支持 7 种图例位置(None, TopLeft, TopCenter, TopRight, BottomLeft, BottomCenter, BottomRight)
  • 轴标签旋转:支持 X/Y 轴标签旋转角度设置
  • 自动日期时间格式:根据时间跨度自动选择最优显示格式
  • 属性变更通知:实现 INotifyPropertyChanged,属性值改变立即生效

基本使用

简单散点图

// 创建散点图控件varscatterPlot=newScatterPlot{Dock=DockStyle.Fill,ColorType=ColorType.Primary};// 添加数据系列varseries=newScatterSeries{Name="系列1",ShowLine=true,ShowMarkers=true,Smooth=true};// 添加数据点for(inti=0;i<10;i++){series.Points.Add(newScatterPoint(i,Math.Sin(i*0.5)*10+20));}scatterPlot.Series.Add(series);scatterPlot.RefreshPlot();this.Controls.Add(scatterPlot);

X轴类型设置

// 数值型(默认)scatterPlot.XAxisType=XAxisType.Numeric;// 字符串类别型scatterPlot.XAxisType=XAxisType.Category;// 日期时间型scatterPlot.XAxisType=XAxisType.DateTime;

日期时间型数据

当使用XAxisType.DateTime时,控件会自动根据时间跨度选择合适的显示格式:

时间跨度X轴显示格式Tooltip格式
≤24小时HH:mmHH:mm
≤72小时MM-dd HH:mmMM-dd HH:mm
≤30天MM-ddMM-dd
≤1年yyyy-MMyyyy-MM
>1年yyyy-MM-ddyyyy-MM-dd
// 日期时间型示例(24小时内数据)scatterPlot.XAxisType=XAxisType.DateTime;scatterPlot.Title="24小时温度变化";scatterPlot.XAxisLabel="时间";varseries=newScatterSeries{Name="今日温度",ShowLine=true,ShowMarkers=true};// 添加24小时内的数据点DateTimetoday=DateTime.Now.Date;series.Add(today.AddHours(0),18);series.Add(today.AddHours(6),20);series.Add(today.AddHours(12),28);series.Add(today.AddHours(18),24);series.Add(today.AddHours(24),19);scatterPlot.AddSeries(series);scatterPlot.RefreshPlot();

图例位置控制

scatterPlot.ShowLegend=true;scatterPlot.LegendPosition=LegendPosition.TopRight;// 右上角scatterPlot.LegendOrientation=LegendOrientation.Horizontal;// 水平排列

轴标签旋转

// X轴标签旋转 45 度scatterPlot.AxisLabelStyle.XAxisRotation=45;// Y轴标签旋转 -90 度scatterPlot.AxisLabelStyle.YAxisRotation=-90;

网格线控制

// 显示 X 轴网格线scatterPlot.GridLineStyle.ShowX=true;// 显示 Y 轴网格线scatterPlot.GridLineStyle.ShowY=true;// 设置网格线颜色scatterPlot.GridLineStyle.Color=Color.FromArgb(230,230,230);

属性说明

主要属性

属性名类型默认值说明
SeriesList-数据系列集合
XAxisTypeXAxisTypeNumericX轴类型
ColorTypeColorTypePrimary色彩类型
Titlestring“”图表标题
XAxisLabelstring“”X轴标题
YAxisLabelstring“”Y轴标题

图例属性

属性名类型默认值说明
ShowLegendbooltrue是否显示图例
LegendPositionLegendPositionBottomCenter图例位置
LegendOrientationLegendOrientationHorizontal图例排列方向

轴标签样式

属性名类型默认值说明
AxisLabelStyle.XAxisRotationint0X轴标签旋转角度
AxisLabelStyle.YAxisRotationint0Y轴标签旋转角度
AxisLabelStyle.FontSizefloat9标签字体大小
AxisLabelStyle.ColorColorGray标签颜色

网格线样式

属性名类型默认值说明
GridLineStyle.ShowXbooltrue是否显示X轴网格线
GridLineStyle.ShowYbooltrue是否显示Y轴网格线
GridLineStyle.ColorColorLightGray网格线颜色
GridLineStyle.Widthint1网格线宽度

事件

PointClicked

数据点点击事件,可用于显示详细信息:

scatterPlot.PointClicked+=(sender,args)=>{stringxValue;if(scatterPlot.XAxisType==XAxisType.DateTime){xValue=newDateTime((long)args.Point.X).ToString("MM-dd HH:mm");}else{xValue=args.Point.X.ToString();}MessageBox.Show($"系列:{args.Series.Name}\nX:{xValue}\nY:{args.Point.Y:F2}");};

完整示例

24小时温度变化

varscatterPlot=newScatterPlot{Dock=DockStyle.Fill,Title="24小时温度变化",XAxisLabel="时间",YAxisLabel="温度 (°C)",XAxisType=XAxisType.DateTime,ShowLegend=true,LegendPosition=LegendPosition.BottomCenter};// 今日温度vartodaySeries=newScatterSeries{Name="今日温度",LegendText="今日",ShowLine=true,ShowMarkers=true,Smooth=true,SmoothTension=0.4f,LineWidth=2};DateTimetoday=DateTime.Now.Date;todaySeries.Add(today.AddHours(0),18);todaySeries.Add(today.AddHours(2),17);todaySeries.Add(today.AddHours(4),16);todaySeries.Add(today.AddHours(6),17);todaySeries.Add(today.AddHours(8),20);todaySeries.Add(today.AddHours(10),24);todaySeries.Add(today.AddHours(12),28);todaySeries.Add(today.AddHours(14),30);todaySeries.Add(today.AddHours(16),29);todaySeries.Add(today.AddHours(18),26);todaySeries.Add(today.AddHours(20),23);todaySeries.Add(today.AddHours(22),20);todaySeries.Add(today.AddHours(24),19);scatterPlot.AddSeries(todaySeries);scatterPlot.RefreshPlot();this.Controls.Add(scatterPlot);

多日期温度对比

varscatterPlot=newScatterPlot{Dock=DockStyle.Fill,Title="温度趋势图",XAxisLabel="日期",YAxisLabel="温度 (°C)",XAxisType=XAxisType.DateTime,ShowLegend=true,LegendPosition=LegendPosition.TopRight};// 本周温度varseries1=newScatterSeries{Name="本周温度",LegendText="本周",ShowLine=true,ShowMarkers=true,Smooth=true,LineWidth=2};// 添加7天数据for(inti=-6;i<=0;i++){series1.Add(DateTime.Now.AddDays(i).Date,20+Math.Sin(i*0.5)*5);}scatterPlot.AddSeries(series1);scatterPlot.RefreshPlot();

注意事项

  1. 日期时间数据:使用DateTime.ToOADate()DateTime.Ticks转换为数值存储
  2. 刷新图表:修改数据后调用RefreshPlot()重新绘制
  3. 平滑曲线:设置Smooth = true并可通过SmoothTension调整平滑度(0-1之间)
  4. 图例绘制:图例始终在最上层显示,不会被网格线遮挡
  5. 轴标题:设置XAxisLabelYAxisLabel会自动预留空间,避免与轴标签重叠

三、后记

陆续补充完善中,敬请关注,如有需求,有好的建议,请留言(xue5zhijing)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 21:16:12

RP2040与MicroMod开发板的嵌入式快速原型设计实践

1. 项目概述SparkFun近期推出的两款开发板——基于Raspberry Pi RP2040的mikroBUS开发板和MicroMod mikroBUS载板&#xff0c;为嵌入式开发者提供了全新的快速原型设计解决方案。这两款产品最引人注目的特点在于集成了mikroBUS接口和Qwiic连接器&#xff0c;使得开发者可以轻松…

作者头像 李华
网站建设 2026/4/25 21:05:21

打破传统娱乐局限,超元力无限方舟重塑沉浸体验新范式

随着科技的不断进步和人们娱乐需求的升级&#xff0c;沉浸式娱乐行业正经历从“视觉冲击”向“全感融合”的转型&#xff0c;不再局限于简单的画面呈现&#xff0c;更注重体验者的感官参与和情感共鸣。超元力无限方舟作为全感沉浸领域的创新项目&#xff0c;以其独特的设计理念…

作者头像 李华
网站建设 2026/4/25 21:03:03

招聘 Agent:JD 解析、简历筛选与面试题生成的可控方案

招聘 Agent:JD 解析、简历筛选与面试题生成的可控落地方案 引言 痛点引入 你作为互联网公司的HR或者技术负责人,有没有遇到过以下场景: 收到200份校招简历,光是挨个打开看完就要花3天时间,看完之后还记不住每个人的优势,漏了很多合适的候选人; 业务部门写的JD模糊不清…

作者头像 李华
网站建设 2026/4/25 20:57:32

部署与可视化系统:边缘设备部署:YOLOv8 量化 + NCNN 在树莓派 5 上实时检测

写在前面:当你必须用一块“卡片电脑”跑实时AI推理 如果你拿到过树莓派5,大概率经历过这样的心理路线图: 开机那一刻:“哇,这么小的板子,跑个完整桌面都行!” 装上PyTorch之后:“等等,加载个YOLOv8模型怎么要两分钟?” 真正跑推理的时候:“一秒一帧?PPT都比这流畅…

作者头像 李华
网站建设 2026/4/25 20:55:37

实测:能否用龙虾openclaw做浏览器指纹模拟?

在跨境电商、海外社媒运营和广告投放这个圈子里&#xff0c;账号安全永远是悬在头顶的一把剑。最近龙虾 OpenClaw 这个工具特别火&#xff0c;很多人被它强大的自动化能力吸引&#xff0c;开始琢磨能不能直接用它来模拟浏览器指纹&#xff0c;实现多账号防关联。我自己也是做跨…

作者头像 李华
网站建设 2026/4/25 20:52:28

BilldDesk:3个关键优势让你告别传统远程控制限制

BilldDesk&#xff1a;3个关键优势让你告别传统远程控制限制 【免费下载链接】billd-desk 基于Vue3 WebRTC Nodejs Flutter搭建的远程桌面控制、游戏串流 项目地址: https://gitcode.com/gh_mirrors/bi/billd-desk 你是否曾因远程控制软件的高延迟而烦恼&#xff1f;…

作者头像 李华