快速生成折线图及代码详解

快速生成折线图时,只需要修改代码中的以下数据:

1、Y轴刻度个数:Ycounts

2、Y轴最小刻度数:YminValue

3、横坐标:数组mouth

4、标题:strTopic

5、用户数据:数组d

6、[可选]修改背景色:代码中27行改为所需要的颜色即可

完整代码:


 1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Text;
7 using System.Windows.Forms;
8
9 namespace Test11
10 {
11 public partial class Form1 : Form
12 {
13 public Form1()
14 {
15 InitializeComponent();
16 }
17
18 private void Form1_Paint(object sender, PaintEventArgs e)
19 {
20 int Ycounts = 9;//Y轴刻度个数
21 int YminValue = 20;//Y轴最小值
22 string[] month = new string[8] { "1至3天", "4至7天", "8至14天", "15至21天", "22至28天", "29至39天", "36至42天", "42天以后" };
23 float[] d = new float[8] { 36, 35, 33.5F, 31.5F, 29, 27, 26, 21 };
24 //画图初始化
25 Bitmap bMap = new Bitmap(500, 500);
26 Graphics gph = Graphics.FromImage(bMap);
27 gph.Clear(Color.White);
28 PointF cPt = new PointF(40, 420);//中心点
29 PointF[] xPt = new PointF[3] { new PointF(cPt.Y + 15, cPt.Y), new PointF(cPt.Y, cPt.Y - 8), new PointF(cPt.Y, cPt.Y + 8) };//X轴三角形
30 PointF[] yPt = new PointF[3] { new PointF(cPt.X, cPt.X - 15), new PointF(cPt.X - 8, cPt.X), new PointF(cPt.X + 8, cPt.X) };//Y轴三角形
31 string strTopic = "畜禽温度时刻图表";
32 gph.DrawString(strTopic, new Font("宋体", 14), Brushes.Black, new PointF((cPt.Y-strTopic.Length*14)/2, cPt.X*2f/3));//图表标题,居中对齐
33 //画X轴
34 gph.DrawLine(Pens.Black, cPt.X, cPt.Y, cPt.Y, cPt.Y);
35 gph.DrawPolygon(Pens.Black, xPt);
36 gph.FillPolygon(new SolidBrush(Color.Black), xPt);
37 gph.DrawString("天数", new Font("宋体", 12), Brushes.Black, new PointF(cPt.Y + 12, cPt.Y + 12));//12为字体大小
38 //画Y轴
39 gph.DrawLine(Pens.Black, cPt.X, cPt.Y, cPt.X, cPt.X);
40 gph.DrawPolygon(Pens.Black, yPt);
41 gph.FillPolygon(new SolidBrush(Color.Black), yPt);
42 gph.DrawString("单位(摄氏度)", new Font("宋体", 12), Brushes.Black, new PointF(0, 6));//6为字体大小的一半
43
44 for (int i = 0; i < Ycounts; i++)
45 {
46 //画Y轴刻度
47 string strY = (i * 2 + YminValue).ToString();//Y轴刻度值
48 gph.DrawString(strY, new Font("宋体", 11), Brushes.Black, new PointF(cPt.X - strY.Length*11, cPt.Y - i * (cPt.Y-cPt.X)/Ycounts-11*2f/3));//11为字体大小
49 if (i != 0)
50 {
51 gph.DrawLine(Pens.Black, cPt.X + 3, cPt.Y - i * (cPt.Y - cPt.X) / Ycounts , cPt.X, cPt.Y - i * (cPt.Y - cPt.X) / Ycounts);
52 }
53 }
54
55 for (int i = 1; i <= month.Length; i++)
56 {
57 //画X轴项目
58 int positionWordTian=month[i-1].IndexOf("天");
59 int positionWordZhi = month[i - 1].IndexOf("至");
60 int py = 0;
61 if (positionWordZhi > 0)
62 {
63 gph.DrawString(month[i - 1].Substring(0, positionWordZhi).PadLeft(2), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + (i - 1) * (cPt.Y-cPt.X)/month.Length-11, cPt.Y));
64 gph.DrawString(month[i - 1].Substring(positionWordZhi, 1), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length-11, cPt.Y + 15));//15为字体比例大小,下同
65 gph.DrawString(month[i - 1].Substring(positionWordZhi + 1, positionWordTian - positionWordZhi - 1).PadLeft(2), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length-11, cPt.Y + 30));
66 py = 30;
67 }
68 else
69 {
70 gph.DrawString(month[i - 1].Substring(0, positionWordTian), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length-11, cPt.Y));
71 }
72 for (int j = positionWordTian; j < month[i - 1].Length;j++ )
73 gph.DrawString(month[i - 1].Substring(j, 1), new Font("宋体", 11), Brushes.Black, new PointF(cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length-11, cPt.Y + (j - positionWordTian + 1) * 15 + py));
74 //画X轴刻度
75 if (i != 0)
76 {
77 gph.DrawLine(Pens.Black, cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length, cPt.Y-3, cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length, cPt.Y);
78 }
79 //画点
80 float YpointPosition = (cPt.Y - cPt.X) / (Ycounts * 2f);
81 gph.DrawEllipse(Pens.Black, cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length, cPt.Y - (d[i - 1] - YminValue) * YpointPosition - 1.5F, 3, 3);
82 gph.FillEllipse(new SolidBrush(Color.Black), cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length, cPt.Y - (d[i - 1] - YminValue) * YpointPosition - 1.5F, 3, 3);
83 //画折线
84 if (i > 1) gph.DrawLine(Pens.Red, cPt.X + (i - 2) * (cPt.Y - cPt.X) / month.Length, cPt.Y - (d[i - 2] - YminValue) * YpointPosition - 1.5F, cPt.X + (i - 1) * (cPt.Y - cPt.X) / month.Length, cPt.Y - (d[i - 1] - YminValue) * YpointPosition - 1.5F);
85 }
86 pictureBox1.Image = bMap;
87 }
88 }
89 }

效果图如下:

时间: 2024-08-29 05:31:31

快速生成折线图及代码详解的相关文章

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解

DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43225445 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Convolutional Neural Networks (LeNet).经详细注释的代码和原始代码:放在我的github地址上,可下载. 一.CNN卷积神经网络原理

20155326《网络对抗》免考项目—— 深入恶意代码之恶意代码详解

20155326<网络对抗>免考项目--深入恶意代码之恶意代码详解 什么是恶意代码 恶意代码是一种程序,它通过把代码在不被察觉的情况下镶嵌到另一段程序中,从而达到破坏被感染电脑数据.运行具有入侵性或破坏性的程序.破坏被感染电脑数据的安全性和完整性的目的. 恶意代码生命周期 攻击目标: 个人计算机 服务器 移动智能终端 手机.平板等 智能设备 特斯拉汽车.智能家居.智能手表等 通信设备 路由器.交换机等 安全设备等 防火墙.IDS, IPS. VDS 攻击目标范围: 定点攻击 邮件.IP.域名.

tiny_cnn代码详解(3)——层间继承关系

在上一篇博文中我们顺利将tiny_cnn的程序调试通过,在这篇博文中我们尝试从整体角度给出对tiny_cnn这个深度学习框架的解读,重点论述一下其各个层直接类封装的继承关系. 一.卷积神经网络快速入门 tiny_cnn作为卷积神经网络的一种实现形式,在探讨其框架结构之前,首先需要简要介绍一些卷积神经网络相关的知识.首先,给出经典卷积神经网络的网络结构: 这个是经典的LeNet-5的网络结构图,五层网络.最早用于支票上的手写数字识别,也是最早的商业化的深度学习模型.从上图中可以看出,卷积神经网络主

highcharts实例教程一:结合php与mysql生成折线图

Highcharts是一款纯javascript和html5编写的图表库,不仅几乎能兼容所有pc浏览器,而且对ios和android手机端的兼容 性也不错,它能够很简单便捷的在Web网站或Web应用中添加交互性的图表,Highcharts目前支持直线图.折线图.面积图.柱状图.饼图.散点图 等多达28种不同类型的图表,还支持3D立体图表的生成,可以满足你对Web图表的任何需求 !而且Highcharts对学习者.非商业机构是免费使用的. 案例场景:要求针对技术cto网站,直观地显示一周网站pv.

Github-jcjohnson/torch-rnn代码详解

Github-jcjohnson/torch-rnn代码详解 [email protected] http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-3-18 声明: 1)本文仅供学术交流,非商用.所以每一部分具体的参考资料并没有详细对应.如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除. 2)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢. 请联系:[email protected] 或[email protected] 本研

图的应用详解-数据结构

图的应用详解-数据结构 概述 最小生成树——无向连通图的所有生成树中有一棵边的权值总和最小的生成树 拓扑排序 ——由偏序定义得到拓扑有序的操作便是拓扑排序.建立模型是AOV网 关键路径——在AOE-网中有些活动可以并行地进行,所以完成工程的最短时间是从开始点到完成点的最长路径的长度,路径长度最长的路径叫做关键路径(Critical Path). 最短路径——最短路径问题是图研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 1.最小生成树 1.1 问题背景:  

jQuery选择器代码详解(八)——addCombinator函数

function addCombinator(matcher, combinator, base) 1.源码 function addCombinator(matcher, combinator, base) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++; return combinator.first ? // Check a

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]

chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文: 默认情况下如下图 Y轴并不是从0开始,这样折现图的幅度会很大,不是正常的幅度,解决办法如下, 示例代码: window.onload = function () { var ctx = document.getElementById("canvas").getContext("2d"); window.myLine = new Chart(ctx).Line(lineChartDat

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43221829 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参考本文第一部分的算法简介. 经详细注释的代码:放在我的gith