.net c#画多条月份折线图报表

版权:原创 更新时间:1年以上
[该文章底部包含文件资源,可根据自己情况,决定是否下载资源使用,时间>金钱,如有需要,立即查看资源]

首先第一步,写一个实体,来从数据库中读取实体数据.

        public class StatYear
        {
            /// <summary>
            /// 类型
            /// </summary>
            public string type { get; set; }
            /// <summary>
            /// 月份
            /// </summary>
            public string month { get; set; }
            /// <summary>
            /// 数量
            /// </summary>
            public int count { get; set; }
        }

根据type类型,来区分多条折线.

        /// <summary>
        /// 分类集合
        /// </summary>
        /// <returns></returns>
        public Dictionary<string, List<StatYear>> DicStat(List<StatYear> list)
        {
            Dictionary<string, List<StatYear>> dic = new Dictionary<string, List<StatYear>>();
            foreach (StatYear node in list)
            {
                if (string.IsNullOrWhiteSpace(node.type)) { continue; }
                if (dic.ContainsKey(node.type)) { dic[node.type].Add(node); }
                else { dic[node.type] = new List<StatYear>(); dic[node.type].Add(node); }
            }
            return dic;
        }

随时来显示处理.生成多条折线图实体类型.

        public void Draw()
        {
            //年某商品走势
            List<StatYear> list = new List<StatYear>();
            for (int i = 1; i <= 3; i++)
            {
                for (int j = 1; j <= 12; j++)
                {
                    list.Add(new StatYear() { month = j.ToString() + "月", count = Random(1, (int)zmax.Value), type = "类型" + i.ToString() });
                }
            }
            DrawLine(list, DateTime.Now.ToString("yyyy") + "年各月订单数");
        }

调用主方法,来生成多条折线图:

public void DrawLine(List<StatYear> list, string title)
        {
            int height = this.zpic.Height, width = this.zpic.Width;
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(width, height);
            //创建Graphics类对象
            Graphics g = Graphics.FromImage(image);
            //清空图片背景色
            g.Clear(Color.White);
            g.FillRectangle(Brushes.WhiteSmoke, 0, 0, width, height);

            Font font1 = new System.Drawing.Font("宋体", 20, FontStyle.Regular);
            Brush brush1 = new SolidBrush(Color.Blue);
            g.DrawString(title, font1, brush1, new PointF((width - title.ToString().Length * 22) / 2, 20));

            //计算数量最大值
            int countmax = list.Max(x => x.count);
            if (countmax.ToString().Length <= 2) { countmax = countmax + (10 - int.Parse(countmax.ToString().Substring(countmax.ToString().Length - 1, 1))); }
            else { countmax = countmax + (int.Parse("1".PadRight(countmax.ToString().Length, '0')) - int.Parse(countmax.ToString().Substring(1, countmax.ToString().Length - 1))); }

            Font font = new System.Drawing.Font("Arial", 10, FontStyle.Regular);
            System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Blue, 1.2f, true);
            Pen mypen = new Pen(brush, 1);

            //坐标距离上下左右距离
            int stop = 90, sleft = 60, sbottom = 40, sright = 30;
            //画2条主坐标X和Y线条
            Pen penxy = new Pen(Color.Blue, 2);
            //绘制Y柱主线
            g.DrawLine(penxy, sleft, stop, sleft, height - sbottom);
            //绘制X柱主线
            g.DrawLine(penxy, sleft - 1, height - sbottom, width - sright, height - sbottom);

            //Y柱拆分成10条线路,间距为
            int yspace = (height - sbottom - stop) / 10;
            for (int i = 1; i <= 10; i++)
            {
                //从底部向上画Y线条
                g.DrawLine(mypen, sleft, height - sbottom - yspace * i, width - sright, height - sbottom - yspace * i);
            }
            //Y柱文字写入
            int value = countmax / 10;
            for (int i = 0; i <= 10; i++)
            {
                //从底部向上写文字
                g.DrawString((value * i).ToString(), font, Brushes.Red, 25, height - sbottom - yspace * i - 8); //设置文字内容及输出位置
            }

            //写X坐标线
            //因为是多条,所有月份需要固定,坐标也需要固定
            string[] month = new string[12];
            int xspace = (width - sleft - sright) / month.Length;
            for (int i = 1; i <= month.Length; i++)
            {
                month[i - 1] = i.ToString() + "月";
                g.DrawLine(mypen, sleft + xspace * i, stop, sleft + xspace * i, height - sbottom);
                g.DrawString(month[i - 1], font, Brushes.Red, sleft + xspace * (i - 1) - 15, stop - 20); //设置文字内容及输出位置
            }

            //写X柱状效果
            Dictionary<string, List<StatYear>> dic = DicStat(list);
            int left = 0;
            //随机一种颜色
            int R = new Random().Next(Random().Next(255));
            int G = new Random().Next(Random().Next(255));
            int B = new Random().Next(Random().Next(255));
            B = (R + G > 400) ? R + G - 400 : B;
            B = (B > 255) ? 255 : B;
            Color color = Color.FromArgb(R, G, B);
            foreach (string key in dic.Keys)
            {
                List<StatYear> statlist = dic[key];
                //未防止其中月份有丢失,可进行判断读取
                List<Point> listpoint = new List<Point>();
                for (int i = 0; i < month.Length; i++)
                {
                    StatYear statyear = statlist.Find((w) => { return string.Equals(w.month, month[i]); });
                    if (statyear != null)
                    {
                        Point point = new Point();
                        point.X = sleft + xspace * i;
                        point.Y = height - sbottom - statyear.count * (yspace * 10) / countmax;
                        listpoint.Add(point);
                    }
                }
                color = GetDarkerColor(color);
                System.Drawing.Drawing2D.LinearGradientBrush brushnew = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), color, color, 1.2f, true);
                Pen pennew = new Pen(brushnew, 2);
                g.DrawLines(pennew, listpoint.ToArray());

                
                left = left + key.Length * 24 + 20;
            }
            this.zpic.BackgroundImage = image;
        }

最终生成的效果如下:

附件:下载该文件资源,减少时间成本(增值服务)
完整版权,经报备授权后可商用
上传者拥有该资源完整版权,下载既表明已授权您可以进行报备商用,无报备或者使用后报备,视为侵权,报备后使用,为合法有效使用,报备方式,下载后,在下载列表,点击报备,填写使用场景即可
File Source
.rar
253.19 KB
文件部分展示图(单击放大)
.net c#画多条月份折线图报表.net c#画多条月份折线图报表
留言
该资源可下载
File Source
.rar
253.19 KB
.net c#画多条月份折线图报表.net c#画多条月份折线图报表
最新结算
股权转让协议意向书模板
类型: .docx 金额: CNY 2.23¥ 状态: 待结算 详细>
股权转让协议意向书模板
类型: .docx 金额: CNY 0.28¥ 状态: 待结算 详细>
CSS3图片向上3D翻转渐隐消失特效
类型: .rar 金额: CNY 0.29¥ 状态: 待结算 详细>
CSS3图片向上3D翻转渐隐消失特效
类型: .rar 金额: CNY 2.31¥ 状态: 待结算 详细>
.net c# 将金额转人名币大写金额
类型: .rar 金额: CNY 2.39¥ 状态: 待结算 详细>
.net c# 将金额转人名币大写金额
类型: .rar 金额: CNY 0.3¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 2.23¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 0.28¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 2.23¥ 状态: 待结算 详细>
合伙退伙协议书范本模板
类型: .doc 金额: CNY 0.28¥ 状态: 待结算 详细>
我们力求给您提供有用的文章,再此基础上,会附加营收资源,不做任何广告,让平台可以更好发展 若您发现您的权利被侵害,或使用了您的版权,请发邮件联系 sunlifel@foxmail.com ggbig觉得 : 不提供源码的文章不是好文章
合作伙伴
联系我们
  • QQ:21499807
  • 邮箱:sunlifel@foxmail.com
  • QQ扫一扫加QQ
    QQ扫一扫
Copyright 2023-2024 ggbig.com·皖ICP备2023004211号-1
打赏文章