快速生成折线图时,只需要修改代码中的以下数据:
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 }
效果图如下:
时间: 2025-01-07 13:51:46