C# Winfrom chart图 实例练习
代码太多了我就不展示了,贴一些比较有代表性的
成品效果展示:
Excel转Chart示例
简单说一下我的思路
\
先把Excel数据展示在dataGridView控件上

XLIST 为 X轴的数据
XLIST 为 Y轴的数据
ZLIST 为 展示的数据进行数据处理点击展示即可
// 将Excel数据复制到DataTable
DataTable dataTable = new DataTable();private List<string> XList = new List<string>();
private List<double> YList = new List<double>();
private List<double> ZList = new List<double>();series.ChartType = SeriesChartType.Column; // 柱状图
series.ChartType = SeriesChartType.Line; // 折线图 && (趋势图 SORT Y 轴)
series.ChartType = SeriesChartType.Bar; // 横条图
series.ChartType = SeriesChartType.BoxPlot; // 箱线图//切换主窗导致卡顿解决方案private void Form1_Resize(object sender, EventArgs e){//当主窗体变更大小时解决多控件加载卡顿//重置窗口布局//在窗体加载时候 解决闪烁问题//将图像绘制到缓冲区 减少闪烁this.DoubleBuffered = true;//设置本窗体SetStyle(ControlStyles.UserPaint, true);SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲}//打开文件路径获取Excel数据至dataGridView
string excelFilePath = textBox1.Text;
//使用方式:引用 Microsoft.Office.Interop.Excel 调用Excel读取
//优点:不受Excel版本限制,可指定sheet读取
//缺点:读取速度慢,几千数据10分钟
//ExcelToDataGridView.FillDataGridViewFromExcel(excelFilePath, dataGridView1);
// 方式一 OLEDB读取 数据库引擎
// 优点:读取速度快,依据sheet排序读取
// 缺点:对于Excel版本依赖强,无法读取指定sheet
// 错误提示:本地计算机未指定 Microsoft.ACE.OLEDB.12.0
// 解决方法:win7(64位) + office 2010(64位) 更改目标平台为X86
// win10(64位) + office 2010(64位) 更改目标平台无效,下载安装AccessDatabaseEngine.exeif (String.IsNullOrEmpty(textBox1.Text)){//空不调用}else{dataTable = ReadExcelFile(excelFilePath);}private DataTable ReadExcelFile(string excelFilePath){string connectionString = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source= {excelFilePath};Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";using (OleDbConnection conn = new OleDbConnection(connectionString)){conn.Open();OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);DataTable dataTable = new DataTable();adapter.Fill(dataTable);return dataTable;}}//设定折线图均值
addLateline(chart1, max, "最大值");
addLateline(chart1, roundedAverage, "平均值");
addLateline(chart1, min, "最小值");private void addLateline(Chart chart, double y, string name)
{//chart.ChartAreas[0].AxisX.StripLines.Clear();StripLine stripline = new StripLine();//stripline.Interval = 1; //重复的次数 stripline.IntervalOffset = y; //横线y轴位置stripline.Text = name + ":" + y;stripline.TextOrientation = TextOrientation.Horizontal;stripline.TextAlignment = StringAlignment.Near; // 文本左对齐stripline.StripWidth = 0.15; //线宽度if (name != "平均值"){ stripline.BackColor = System.Drawing.Color.Red; }else{ stripline.BackColor = System.Drawing.Color.Blue; }stripline.BorderDashStyle = ChartDashStyle.Solid; //实线chart.ChartAreas[0].AxisY.StripLines.Add(stripline); //横线//chart.ChartAreas[0].AxisX.StripLines.Add(stripline);//竖线chart.ChartAreas[0].AxisY.MinorGrid.Enabled = true; // 启用Y轴次刻度线chart.ChartAreas[0].AxisY.MajorTickMark.Size = 2; // 设置Y轴主刻度线大小chart.ChartAreas[0].AxisY.MinorTickMark.Size = 1; // 设置Y轴次刻度线大小chart.ChartAreas[0].AxisY.MinorGrid.LineDashStyle = ChartDashStyle.Dot; // 设置Y轴次刻度线的样式chart.ChartAreas[0].AxisY.MinorGrid.LineColor = System.Drawing.Color.LightGray; // 设置Y轴次刻度线的颜色// 开启数据点标签的显示}//开启X轴的左右拖拽
chart1.ChartAreas[0].AxisX.ScaleView.Size = 10; // 设置了 X 轴上显示的数据点的数量
chart1.ChartAreas[0].AxisX.ScaleView.MinSize = 5; // 设置或获取X轴的视图的最小尺寸
chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false; // 滚动条位于图表外侧// 折线图获取不同的随机颜色
bool flag = false;
System.Drawing.Color randomColor;while (true)
{randomColor = ColorHelper.GetRandomColor();for (int i = 0; i < YList.Count / XList.Count; i++){if (chart1.Series[i].Color == randomColor){flag = false;break;}else{ flag = true;series.Color = randomColor;break;}}if ( flag == true){break;}
};series.ChartType = SeriesChartType.Line;
System.Drawing.Color seriesColor = GetSeriesColor(chart1, series.Name);//箱线图的计算逻辑//这个就不把代码带出来了 自己算一算就行了//奇数时
//17,19,22,24,25,28,34,35,36,37,38.
//除异常点以外的数据中最小 17
//除异常点以外的数据中最大 38
//中位数 28 // 2 * (当前个数 + 1)/ 4 = 位置
//下四分位数 22 // 1 * (当前个数 + 1)/ 4 = 位置
//上四分位数 36 // 3 * (当前个数 + 1)/ 4 = 位置
//异常点(算的值不在此范围内都算异常值)
//22 - 1.5*(36 - 22 ) = 1;
//36 + 1.5*(36 - 22 ) = 57;//偶数
//12,15,17,19,20,23,25,28,30,33,34,35,36,37
//Q1所在的位置=1(14+1)/4=3.75, 1.25 2.75
//Q2所在的位置=2(14+1)/4=7.5, 2.5
//Q3所在的位置=3(14+1)/4=11.25. 3.75 5.5//下四分位数Q1=0.25×第三项+0.75×第四项=0.25×17+0.75×19=18.5;
//中位数 Q2=0.5×第七项+0.5×第八项=0.5×25+0.5×28=26.5;
//上四分位数Q3=0.75×第十一项+0.25×第十二项=0.75×34+0.25×35=34.25.//18.5 - 1.5*(34.25 - 18.5 ) = 5.125;
//34.25 + 1.5*(34.25 - 18.5) = 57.875;
//string result = "下界+下四分位数+中位数+上四分位数+上界+异常点";
作为新手我解决不了的问题为我转换成3D导致左右拖拽框失效 所以我给注释了如下:
private void radioButton1_Click(object sender, EventArgs e)
{if (rbcheck1)//if (radioButton1.Checked){rbcheck1 = false;radioButton1.Checked = false;// 假设chart是一个Chart控件实例chart1.ChartAreas[0].Area3DStyle.Enable3D = false;chart1.ChartAreas[0].Area3DStyle.Inclination = 30;chart1.ChartAreas[0].Area3DStyle.IsClustered = true;chart1.ChartAreas[0].Area3DStyle.IsRightAngleAxes = false;chart1.ChartAreas[0].Area3DStyle.Perspective = 30;chart1.ChartAreas[0].Area3DStyle.Rotation = 30;chart1.ChartAreas[0].Area3DStyle.WallWidth = 0;//开启X轴的左右拖拽chart1.ChartAreas[0].AxisX.ScaleView.Size = 10; // 设置了 X 轴上显示的数据点的数量chart1.ChartAreas[0].AxisX.ScaleView.MinSize = 5; // 设置或获取X轴的视图的最小尺寸chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false; // 滚动条位于图表外侧chart1.ChartAreas[0].InnerPlotPosition.Auto = true;}else{radioButton1.Checked = true;rbcheck1 = true;chart1.ChartAreas.Clear();ChartArea chartArea1 = new ChartArea();设置为3D效果//chartArea1.InnerPlotPosition.Auto = false;chartArea1.Area3DStyle.Enable3D = true; // 启用3D效果chartArea1.Area3DStyle.IsClustered = true; // 设置为集群样式chartArea1.Area3DStyle.Rotation = 20; // 设置旋转角度chartArea1.Area3DStyle.Perspective = 10; // 设置透视角度chartArea1.Area3DStyle.Inclination = 15; // 设置倾斜角度chartArea1.Area3DStyle.LightStyle = LightStyle.Realistic; // 设置光源样式chartArea1.Area3DStyle.WallWidth = 0; // 设置墙宽chartArea1.Area3DStyle.IsRightAngleAxes = false; // 设置是否为右角轴chartArea1.AxisX.ScaleView.Size = 10; // 设置了 X 轴上显示的数据点的数量chartArea1.AxisX.ScaleView.MinSize = 5; // 设置或获取X轴的视图的最小尺寸chartArea1.AxisX.ScrollBar.IsPositionedInside = false; // 滚动条位于图表外侧chart1.ChartAreas.Add(chartArea1);}
}
一:柱状图
二:折线图

三:直方图

四:横条图

五:箱线图

六:趋势图

相关文章:
C# Winfrom chart图 实例练习
代码太多了我就不展示了,贴一些比较有代表性的 成品效果展示: Excel转Chart示例 简单说一下我的思路 \ 先把Excel数据展示在dataGridView控件上 XLIST 为 X轴的数据 XLIST 为 Y轴的数据 ZLIST 为 展示的数据进行数据处理点击展示即可 // 将Excel数…...
iOS从Matter的设备认证证书中获取VID和PID
设备认证证书也叫 DAC, 相当于每个已经认证的设备的标识。包含了 VID 和 PID. VID: Vendor ID ,标识厂商 PID: Product ID, 标识设备的 根据 Matter 对于设备证书的规定,DAC证书subject应该包含VID 和 PID. 可通过解析 X509 证书读取subject…...
带着国标充电器出国怎么办? 适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 适配器模式适配器模式(Adapter Pattern)概述talk is cheap, show you my code总结 适配器模式 适配器模式(Adapter Pattern)是面向对象软件设计中的一种结构型设计…...
破解海外业务困局:新加坡服务器托管与跨境组网策略
在当今全球化商业蓬勃发展的浪潮之下,众多企业将目光投向海外市场,力求拓展业务版图、抢占发展先机。而新加坡,凭借其卓越的地理位置、强劲的经济发展态势以及高度国际化的营商环境,已然成为企业海外布局的热门之选。此时…...
Mybatis-Plus快速入门
参考:黑马MyBatisPlus教程全套视频教程,快速精通mybatisplus框架 1.Mapper-plus配置 1.MapperScan("Mapper目录的位置") 2.Mapper层文件需要继承BaseMapper extends BaseMapper<实体类> 3.开启日志 4.配置类 Configuration public cl…...
Chrome被360导航篡改了怎么改回来?
一、Chrome被360导航篡改了怎么改回来? 查看是否被360主页锁定,地址栏输入chrome://version,看命令行end后面(蓝色部分),是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步:…...
Coding(Jenkinsfile)+ Docker 自动化部署 Springboot —— 图文细节和一些注意事项说明
前言:本章讲述一下我使用Coding(Jenkinsfile) Docker部署Springboot项目过程,记录图文细节和一些需要注意的问题。 说明:为什么要使用Coding去集成Docker? 节约了服务器内存,不需要单独部署 Jen…...
docker django uwsgi 报错记录
这个配置中是能够正常进行网页访问的,能够查看网页 [uwsgi] chdir /home/luichun/lc/Pyfile/PyCursor/app module app.wsgi:application plugin-dir /usr/lib/uwsgi/plugins plugins python311 env TZAsia/Shanghai socket-timeout 60 websocket-ma…...
数据分析思维(五):分析方法——假设检验分析方法
数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python,更重要的是数据分析思维。没有数据分析思维和业务知识,就算拿到一堆数据,也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》,本文内容就是提取…...
【ES6复习笔记】集合Set(13)
ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用『扩展运算符』和『for…of…』进行遍历。 集合的属性和方法 size:返回集合的元素个数。add…...
基础爬虫案例实战
我们已经学习了多进程、requests、正则表达式的基本用法,但还没有完整地实现过一个爬取案例。这一节,我们就来实现一个完整的网站爬虫,把前面学习的知识点串联起来,同时加深对这些知识点的理解。 准备工作 我们需要先做好如下准备工作。 安…...
深度学习工作:从追求 SoTA 到揭示新现象
TLDR:主要讨论了从追求模型 SoTA 到揭示新现象的转变。通过几个例子,包括ACNet到RepVGG的发展,RIFE插帧、Film插帧,以及OpenAI的近期工作,阐述了这种转变的重要性。 知乎:黄哲威 hzwer链接:http…...
学习记录—正则表达式-基本语法
正则表达式简介-《菜鸟教程》 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 本期内容将介绍普通字符,特殊…...
智慧农业物联网传感器:开启农业新时代
在当今科技飞速发展的时代,农业领域正经历着一场前所未有的变革,而智慧农业物联网传感器无疑是这场变革中的关键利器。它宛如农业的 “智慧大脑”,悄然渗透到农业生产的各个环节,为传统农业注入了全新的活力,让农业生产…...
普通人怎么入门学习并使用AI?
前言 作为普通人看着AI一天一天变革,心急如焚,未来但是就是不知道怎么才算真正进入了AI,使用AI....作为从头至尾追随AI脚步的码农有几点小建议~ 一、💻使用 AI 网站或软件,解决实际问题 不管用哪种AI,先用…...
Java中处理if-else的几种高级方法
前言 在我看来多写几个if-else没啥大不了的,但是就是看起来没啥逼格,领导嫌弃。我根据开发的经历写几个不同的替代方法 一、枚举法替代 我先前写了一篇文章,可以去看看。 通过枚举替换if-else语句的解决方案_枚举代替if else c语言-CSDN博…...
前端知识补充—CSS
CSS介绍 什么是CSS CSS(Cascading Style Sheet),层叠样式表, ⽤于控制⻚⾯的样式 CSS 能够对⽹⻚中元素位置的排版进⾏像素级精确控制, 实现美化⻚⾯的效果. 能够做到⻚⾯的样式和结构分离 基本语法规范 选择器 {⼀条/N条声明} 1)选择器决定针对谁修改…...
企业架构学习笔记-数字化转型
1. 企业数字化发展阶段 案例1.业务部门“点菜”,IT部门叫苦 随着企业信息化进程的不断推进,IT部门的角色和面临的挑战也在发生显著变化。在信息化建设的初级阶段,确实存在IT部门需要积极引导和说服业务部门重视信息技术价值的情况。当时&am…...
Linux网络——TCP的运用
系列文章目录 文章目录 系列文章目录一、服务端实现1.1 创建套接字socket1.2 指定网络接口并bind2.3 设置监听状态listen2.4 获取新链接accept2.5 接收数据并处理(服务)2.6 整体代码 二、客户端实现2.1 创建套接字socket2.2 指定网络接口2.3 发起链接con…...
Vue3之状态管理Vuex
Vuex作为Vue.js的官方状态管理库,在大型或复杂的前端项目中扮演着至关重要的角色。本文将从Vuex的原理、特点、应用场景等多个方面进行深入解析,并通过代码示例展示如何在Vuex中实现特定功能。 一、Vuex原理 Vuex是一个专为Vue.js应用程序开发的状态管…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
