使用C#自定义生成折线图源码
private void button1_Click(object sender, EventArgs e)
{
int width = 920; // 画布宽度
int height = 800; // 画布高度
Bitmap bitmap = new Bitmap(width, height);
Graphics g = Graphics.FromImage(bitmap);
// 设置背景色为白色
g.Clear(Color.White);
// 设置高质量绘图
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// 设置画笔和字体
Pen pen = new Pen(Color.FromArgb(192, 192, 192));
System.Drawing.Font font = new System.Drawing.Font("Arial", 20);
Brush brush = new SolidBrush(Color.Black);
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
// 设置坐标系的大小和位置
int xAxisLength = 800; // X轴长度
int yAxisLength = 700; // Y轴长度
int originX = 30; // 原点X坐标
int originY = height - 40; // 原点Y坐标
//y坐标范围,计算用
int y = 0;
int maxy = 0;
for (int i = 10; i <= 710; i += 70)
{
if (i == 10)
y = originY - i;
maxy = originY - i;
g.DrawLine(pen, originX, originY - i, originX + xAxisLength, originY - i);
g.DrawString(Convert.ToInt32((i / 70).ToString() + "0").ToString(), font, brush, new PointF(originX - 35, originY - 15 - i));
}
//38.5 61.5
// 设置线条颜色和宽度
Pen penxuxian = new Pen(Color.DeepSkyBlue, 2);
// 设置虚线样式
penxuxian.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Single y385 = Convert.ToSingle((y - maxy) / 100.00 * 38.5);
g.DrawLine(penxuxian, originX, originY - 10 - y385, originX + xAxisLength, originY - 10 - y385);
g.DrawString("38.5", font, brush, new PointF(originX + xAxisLength, originY - 18 - y385));
Single y615 = Convert.ToSingle((y - maxy) / 100.00 * 61.5);
g.DrawLine(penxuxian, originX, originY - 10 - y615, originX + xAxisLength, originY - 10 - y615);
g.DrawString("61.5", font, brush, new PointF(originX + xAxisLength, originY - 18 - y615));
//43.3 56.7
// 设置线条颜色和宽度
Pen penblack = new Pen(Color.Black, 1);
// 设置虚线样式
penxuxian.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Single y433 = Convert.ToSingle((y - maxy) / 100.00 * 43.3);
g.DrawLine(penblack, originX, originY - 10 - y433, originX + xAxisLength, originY - 10 - y433);
g.DrawString("43.3", font, brush, new PointF(originX + xAxisLength, originY - 18 - y433));
Single y567 = Convert.ToSingle((y - maxy) / 100.00 * 56.7);
g.DrawLine(penblack, originX, originY - 10 - y567, originX + xAxisLength, originY - 10 - y567);
g.DrawString("56.7", font, brush, new PointF(originX + xAxisLength, originY - 18 - y567));
///写名称
//定义四个数值X值
int eStrX = originX + 50;
int nStrX = originX + 250;
int pStrX = originX + 450;
int lStrX = originX + 650;
g.DrawString("数值E", font, brush, new PointF(eStrX, originY));
g.DrawString("数值N", font, brush, new PointF(nStrX, originY));
g.DrawString("数值P", font, brush, new PointF(pStrX, originY));
g.DrawString("数值L", font, brush, new PointF(lStrX, originY));
double E = 56.3;
double N = 75.9;
double P = 76.6;
double L = 53.8;
//画线
Single eY = Convert.ToSingle((y - maxy) / 100.00 * E) + 10;//75.2数值
Single nY = Convert.ToSingle((y - maxy) / 100.00 * N) + 10;//36.8数值
// 绘制第一个点到第二个点的连线
g.DrawLine(new Pen(Color.DarkOrange, 2), eStrX + 30, originY - eY, nStrX + 40, originY - nY);
Single pY = Convert.ToSingle((y - maxy) / 100.00 * P) + 10;//53数值
// 绘制第二个点到第三个点的连线
g.DrawLine(new Pen(Color.DarkGray, 2), nStrX + 40, originY - nY, pStrX + 40, originY - pY);
Single lY = Convert.ToSingle((y - maxy) / 100.00 * L) + 10;//88数值
// 绘制第三个点到第四个点的连线
g.DrawLine(new Pen(Color.Orange, 2), pStrX + 40, originY - pY, lStrX + 40, originY - lY);
//标数值
//如果第二个点比第一个点低,数值再原点上,否则在下边
Single VlueEY = (originY - eY) > (originY - nY) ? originY - eY + 10 : originY - eY - 25;
g.DrawString(E.ToString("0.00"), font, brush, new PointF(eStrX + 20, VlueEY));
//如果第二个点比第三个点低,数值再原点下,否则在上边
Single VlueNY = (originY - nY) > (originY - pY) ? originY - nY + 10 : originY - nY - 25;
g.DrawString(N.ToString("0.00"), font, brush, new PointF(nStrX + 20, VlueNY));
//如果第三个点比第四个点低,数值再原点下,否则在上边
Single VluePY = (originY - pY) > (originY - lY) ? originY - pY + 10 : originY - pY - 25;
g.DrawString(P.ToString("0.00"), font, brush, new PointF(pStrX + 20, VluePY));
//如果第四个点比第三个点低,数值再原点下,否则在上边
Single VluelY = (originY - lY) > (originY - pY) ? originY - lY + 10 : originY - lY - 25;
g.DrawString(L.ToString("0.00"), font, brush, new PointF(lStrX + 30, VluelY));
//标题
g.DrawString("标题", font, brush, new PointF(xAxisLength / 2, 0));
pictureBox1.Image = bitmap;
保存图像
bitmap.Save("D:\\EPQChart3.png", ImageFormat.Png);
}