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);
        }

原文地址:https://www.cnblogs.com/zhoushangwu/p/11741868.html

时间: 2024-10-08 00:12:47

c#画图之雷达图的相关文章

用pChart生成雷达图图片

需求 :由于工作需要,需要在一张背景图上添加这一张雷达图,之后图片可以在微信中长按保存.所以说我必须生成一张带有雷达图的图片第一反应是用百度echars雷达图做动态显示,之后截图.考虑到工作量和效率,放弃.改为pchart 直接生成雷达图图片 然后用imagick拓展贴到背景图上面.由于imagick攻略比较详细,这里不做赘述,而pchart中文文档则比较匮乏,所以简略介绍下. 第一步 在pchart官网下载类库 http://www.pchart.net/download  建议在本地环境调试

数据可视化分析(柱状图、饼图、折线图、雷达图)

分析文件’课程成绩.xlsx’,至少要完成内容: 1)每年不同班级平均成绩情况 2)不同年份总体平均成绩情况 3)不同性别学生成绩情况,并分别用合适的图表展示出三个内容的分析结果. 导入相应的库 from functools import reduce import xlrd from flask import Flask, jsonify, render_template, request, url_for from pyecharts import Line,Bar,Pie,Radar py

在Excel中制作雷达图

雷达图的作用 雷达图是专门用来进行多指标体系比较分析的专业图表.从雷达图中可以看出指标的实际值与参照值的偏离程度,从而为分析者提供有益的信息.雷达图一般用于成绩展示.效果对比量化.多维数据对比等等,只要有前后2组3项以上数据均可制作雷达图,其展示效果非常直观,而且图像清晰耐看,而且通过EXCEL 2007(含)以上版本制作的雷达图非常漂亮,而且还可个性美化. 文中的雷达图只是方便以后记忆,故不详,具体细节没有截图保存,详细了解的,请自行百度

《BI那点儿事》SSRS图表和仪表——雷达图分析三国超一流谋士、统帅数据(图文并茂)

雷达图分析三国超一流谋士.统帅数据,献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解 建立数据环境: -- 抽取三国超一流谋士TOP 10数据 DECLARE @t1 TABLE ( [姓名] NVARCHAR(255) , [统率] FLOAT , [武力] FLOAT , [智力] FLOAT , [政治] FLOAT , [魅力] FLOAT ) INSERT INTO @t1 SELECT TOP 10 [姓名] , [统率] , [武力] , [智力] ,

javascript雷达图/星形图/极坐标图Radar &amp; Polar chart介绍

Radar & Polar chart 控件为软件开发人员提供了雷达图/星形图/极坐标图,它以轴上的同一个点为起点,绘制出三个或更多的变量. 具体功能: 任意多的轴 动态或静态 简单.堆积.100%堆积的图表 网格线能转换为圆环 在轴之间进行填充 以自定义范围值填充 跨平台 导出为图像 可通过JavaScript进行控制 可直接通过HTML文件进行设置和数据交换 自定义图像和Flash(动态)背景 无限的标签 可旋转的标签 可使用预设频率重新加载数据 格式任何气球文本 Amcharts可以从简单

Excel图表-创意雷达图-原创图表

p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; padding: 5px; margin: 1em 0 1em 0; } .alextitlep{ font-size: 18px; font-weight: bold; color: red; } .alexrootdiv span{ color:blue;font-weight:bold;font-s

雷达图

该雷达图是依赖于Echarts框架的. 1 <!DOCTYPE html> 2 <head> 3 <meta charset="utf-8"> 4 <title>ECharts</title> 5 <script src="js/jquery-2.1.3.js" type="text/javascript" charset="utf-8"></scr

利用d3.js绘制雷达图

利用d3,js将数据可视化,可以做到数据与代码的分离,方便以后修改数据. 这次利用d3.js绘制了一个五维的雷达图,即将多个对象的五种属性在一张图上对比. 数据写入data.csv.数据类型写入type.csv文件. 效果如下图所示 源码连接:http://download.csdn.net/detail/svap1/7358123 使用是只需调用 radar()函数即可,如下是测试页面代码. <!DOCTYPE html> <html> <head> <meta

echarts雷达图大小自适应

结合了媒体查询 首先在css样式表中写出你希望雷达图在不同分辨率下的大小 @media screen and (max-height:780px){ .left-score-image { width: 190px; height: 135px; margin-left: 36px; margin-top: 10px; } } 其次,在js文件中加入 var scoreImage = document.getElementById('scoreImage'); var myChart = ech