• c#画图之雷达图


    public JsonResult DrawRadar()
            {
                List<Color> colors = new List<Color>()
                {
                    Color.FromArgb(255,182,193),
                    Color.FromArgb(238,130,238),
                    Color.FromArgb(220,20,60),
                    Color.FromArgb(153,50,204),
                    Color.FromArgb(30,144,255),
                    Color.FromArgb(60,179,113),
                    Color.FromArgb(255,215,0),
                    Color.FromArgb(255,140,0),
                    Color.FromArgb(105,105,105)
                };
    
                #region 允许配置项
    
                //定义宽高  只定义宽度即可
                int height = 500, width = height;
    
                //边缘位置留白
                int margin_top = 60;
                int margin_right = 40;
                int margin_bottom = 40;
                int margin_left = 40;
    
                //文字大小,单位:px
                int fontsize = 12;
    
                // 扇区名称预留的位置  颜色框20,与文字间隙5,文字80,距离折线图10,需要包含边缘留白
                int lineNameWidth = 200 - margin_right;
    
                #endregion
    
                #region 数据
    
                //最大数量/总数量
                int maxCount = 0;
    
                string[] radarNameData = new string[] { "第一个", "第二个", "第三个", "第四个", "第五个" };
    
                //雷达图名称
                string[] lineName = new string[] { "折线1", "折线2" };
    
                //雷达图数据
                List<List<int>> lineData = new List<List<int>> {
                    new List<int>(){ 12,23,15,44,32 },
                    new List<int>(){ 9,33,6,21,22 }
                };
    
                for (int i = 0; i < lineData.Count; i++)
                {
                    int tempMaxCount = lineData[i].Max();
    
                    if (tempMaxCount > maxCount)
                    {
                        maxCount = tempMaxCount;
                    }
                }
    
                maxCount = maxCount == 0 ? 5 : maxCount;
    
                #endregion
    
                //单位转换对象
                Spire.Pdf.Graphics.PdfUnitConvertor unitCvtr = new Spire.Pdf.Graphics.PdfUnitConvertor();
    
                //生成图像对象
                Bitmap image = new Bitmap(width + margin_left + margin_right + lineNameWidth, height + margin_top + margin_bottom);
    
                //创建画布
                Graphics g = Graphics.FromImage(image);
                //消除锯齿
                g.SmoothingMode = SmoothingMode.AntiAlias;
                //质量
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.CompositingQuality = CompositingQuality.HighQuality;
    
                //黑色画笔--主轴颜色
                Brush blackBrush = new SolidBrush(Color.FromArgb(255, 102, 102, 102));
                Pen blackPen = new Pen(blackBrush, 1);
    
                //灰色画笔--辅助线条颜色
                Brush grayBrush = new SolidBrush(Color.FromArgb(255, 200, 200, 200));
                Pen grayPen = new Pen(grayBrush, 1);
    
                //填充区域内容
                g.FillRectangle(Brushes.WhiteSmoke, 0, 0, width + margin_left + margin_right + lineNameWidth, height + margin_top + margin_bottom);
    
                Font font = new Font("宋体", unitCvtr.ConvertUnits(fontsize, Spire.Pdf.Graphics.PdfGraphicsUnit.Pixel, Spire.Pdf.Graphics.PdfGraphicsUnit.Point));
    
                //圆心
                int centerX = height / 2 + margin_left;
                int centerY = width / 2 + margin_top;
    
                //角的个数,规定是几边形
                int len = radarNameData.Length;
                //角度
                int angle = 360 / len;
                // 外围半径
                int radius = width / 2;
                // 每次递减的半径
                int subRadius = radius / 5;
    
                for (int k = 0; k < 5; k++)
                {
                    Point[] points = new Point[len + 1];
                    for (int i = 0; i < len; i++)
                    {
                        double angleHude = i * angle * Math.PI / 180;/*角度变成弧度*/
                        int x = (int)((radius - k * subRadius) * Math.Cos(angleHude)) + centerX;
                        int y = (int)((radius - k * subRadius) * Math.Sin(angleHude)) + centerY;
    
                        Point point = new Point(x, y);
    
                        points[i] = point;
    
                        if (i == 0)
                        {
                            RectangleF sumRec = new RectangleF(x - 30, y - 15, 30, 15);
                            g.DrawString((100 - k * 20).ToString(), font, blackBrush, sumRec);
                        }
                    }
    
                    points[len] = points[0];
    
                    if (k == 0)
                    {
                        g.DrawLines(blackPen, points);
    
                        for (int i = 0; i < points.Length - 1; i++)
                        {
                            g.DrawLine(grayPen, points[i], new Point(centerX, centerY));
    
                            //90 270
                            StringFormat format = new StringFormat();
    
                            //两条竖线
                            int currAngle = i * angle;
                            int txtX = 0;
                            int txtY = 0;
    
                            if (currAngle % 180 == 90)
                            {
                                format.Alignment = StringAlignment.Center;
    
                                txtX = points[i].X;
    
                                if (currAngle == 90)
                                {
                                    txtY = points[i].Y - 20;
                                }
                                else
                                {
                                    txtY = points[i].Y + 20;
                                }
                            }
                            else
                            {
                                txtY = points[i].Y;
    
                                if (currAngle > 90 && currAngle < 270)
                                {
                                    format.FormatFlags = StringFormatFlags.DirectionRightToLeft;
    
                                    txtX = points[i].X - 50;
                                }
                                else
                                {
                                    format.FormatFlags = 0;
    
                                    txtX = points[i].X + 10;
                                }
                            }
    
                            // 文字
                            Rectangle recText = new Rectangle(txtX, txtY, 40, fontsize);
                            g.DrawString(radarNameData[i], font, blackBrush, recText, format);
                        }
                    }
                    else
                    {
                        g.DrawLines(grayPen, points);
                    }
    
    
                }
    
                //开始数据
                for (int i = 0; i < lineData.Count; i++)
                {
                    /*
                     * 这个是色块
                     */
                    //颜色快代表的内容
                    Color tempColor = colors[i];//GetRandomColor();
    
                    //文字内容
                    StringFormat txtFormat = new StringFormat();
                    //format.Alignment = StringAlignment.Center; //居中
    
                    //画笔
                    SolidBrush txtBrush = new SolidBrush(tempColor);
    
                    // 名称处理
                    // 颜色块
                    Rectangle rectangle = new Rectangle(margin_left + width + 50, margin_top + i * 25, 20, 20);
                    g.FillRectangle(txtBrush, rectangle);
    
                    // 文字
                    RectangleF rec = new RectangleF(margin_left + width + 75, margin_top + i * 25 + 4, 80, 20);
                    g.DrawString(lineName[i], font, blackBrush, rec, txtFormat);
    
                    Point[] points = new Point[lineData[i].Count + 1];
    
                    for (int j = 0; j < lineData[i].Count; j++)
                    {
                        int currRadius = Convert.ToInt32(lineData[i][j] / 100.0 * radius);
    
                        double angleHude = j * angle * Math.PI / 180;/*角度变成弧度*/
                        int x = (int)(currRadius * Math.Cos(angleHude)) + centerX;
                        int y = (int)(currRadius * Math.Sin(angleHude)) + centerY;
    
                        Point point = new Point(x, y);
    
                        points[j] = point;
                    }
    
                    points[lineData[i].Count] = points[0];
    
                    txtBrush.Color = Color.FromArgb(Convert.ToInt32(0.7 * 255), tempColor.R, tempColor.G, tempColor.B);
    
                    g.FillPolygon(txtBrush, points);
                }
    
                string relativePath = @"draw-image" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
                string path = Server.MapPath(relativePath);
                image.Save(path, System.Drawing.Imaging.ImageFormat.Jpeg);
    
                //return relativePath;
                return Json(relativePath, JsonRequestBehavior.AllowGet);
            }

  • 相关阅读:
    关于抑或
    【vue】条件渲染 v-if v-else
    【vue】vue的目录结构、项目流程、vue-router
    【vue】在vue中引入iview
    【vue】vue如何创建一个项目
    【jquery】jquery怎么实现点击一个按钮控制一个div的显示和隐藏
    【angularjs】ng-model controller中取不到值(input)
    打印机增强软件pdfpro
    vagrant 安装ubuntu12.04 64 bit
    debian 7 stable 不能编译android源码
  • 原文地址:https://www.cnblogs.com/zhoushangwu/p/11741868.html
Copyright © 2020-2023  润新知