c#画图之雷达图
public JsonResult DrawRadar()
{
List<Color> colors = new List<Color>()
{
Color.FromArgb(,,),
Color.FromArgb(,,),
Color.FromArgb(,,),
Color.FromArgb(,,),
Color.FromArgb(,,),
Color.FromArgb(,,),
Color.FromArgb(,,),
Color.FromArgb(,,),
Color.FromArgb(,,)
}; #region 允许配置项 //定义宽高 只定义宽度即可
int height = , width = height; //边缘位置留白
int margin_top = ;
int margin_right = ;
int margin_bottom = ;
int margin_left = ; //文字大小,单位:px
int fontsize = ; // 扇区名称预留的位置 颜色框20,与文字间隙5,文字80,距离折线图10,需要包含边缘留白
int lineNameWidth = - margin_right; #endregion #region 数据 //最大数量/总数量
int maxCount = ; string[] radarNameData = new string[] { "第一个", "第二个", "第三个", "第四个", "第五个" }; //雷达图名称
string[] lineName = new string[] { "折线1", "折线2" }; //雷达图数据
List<List<int>> lineData = new List<List<int>> {
new List<int>(){ ,,,, },
new List<int>(){ ,,,, }
}; for (int i = ; i < lineData.Count; i++)
{
int tempMaxCount = lineData[i].Max(); if (tempMaxCount > maxCount)
{
maxCount = tempMaxCount;
}
} maxCount = maxCount == ? : 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(, , , ));
Pen blackPen = new Pen(blackBrush, ); //灰色画笔--辅助线条颜色
Brush grayBrush = new SolidBrush(Color.FromArgb(, , , ));
Pen grayPen = new Pen(grayBrush, ); //填充区域内容
g.FillRectangle(Brushes.WhiteSmoke, , , 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 / + margin_left;
int centerY = width / + margin_top; //角的个数,规定是几边形
int len = radarNameData.Length;
//角度
int angle = / len;
// 外围半径
int radius = width / ;
// 每次递减的半径
int subRadius = radius / ; for (int k = ; k < ; k++)
{
Point[] points = new Point[len + ];
for (int i = ; i < len; i++)
{
double angleHude = i * angle * Math.PI / ;/*角度变成弧度*/
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 == )
{
RectangleF sumRec = new RectangleF(x - , y - , , );
g.DrawString(( - k * ).ToString(), font, blackBrush, sumRec);
}
} points[len] = points[]; if (k == )
{
g.DrawLines(blackPen, points); for (int i = ; i < points.Length - ; i++)
{
g.DrawLine(grayPen, points[i], new Point(centerX, centerY)); //90 270
StringFormat format = new StringFormat(); //两条竖线
int currAngle = i * angle;
int txtX = ;
int txtY = ; if (currAngle % == )
{
format.Alignment = StringAlignment.Center; txtX = points[i].X; if (currAngle == )
{
txtY = points[i].Y - ;
}
else
{
txtY = points[i].Y + ;
}
}
else
{
txtY = points[i].Y; if (currAngle > && currAngle < )
{
format.FormatFlags = StringFormatFlags.DirectionRightToLeft; txtX = points[i].X - ;
}
else
{
format.FormatFlags = ; txtX = points[i].X + ;
}
} // 文字
Rectangle recText = new Rectangle(txtX, txtY, , fontsize);
g.DrawString(radarNameData[i], font, blackBrush, recText, format);
}
}
else
{
g.DrawLines(grayPen, points);
} } //开始数据
for (int i = ; 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 + , margin_top + i * , , );
g.FillRectangle(txtBrush, rectangle); // 文字
RectangleF rec = new RectangleF(margin_left + width + , margin_top + i * + , , );
g.DrawString(lineName[i], font, blackBrush, rec, txtFormat); Point[] points = new Point[lineData[i].Count + ]; for (int j = ; j < lineData[i].Count; j++)
{
int currRadius = Convert.ToInt32(lineData[i][j] / 100.0 * radius); double angleHude = j * angle * Math.PI / ;/*角度变成弧度*/
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[]; txtBrush.Color = Color.FromArgb(Convert.ToInt32(0.7 * ), 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);
}
c#画图之雷达图的更多相关文章
- 用pChart生成雷达图图片
需求 :由于工作需要,需要在一张背景图上添加这一张雷达图,之后图片可以在微信中长按保存.所以说我必须生成一张带有雷达图的图片第一反应是用百度echars雷达图做动态显示,之后截图.考虑到工作量和效率, ...
- WPF DevExpress 设置雷达图Radar样式
DevExpress中定义的ChartControl很不错,很多项目直接使用这种控件. 本节讲述雷达图的样式设置 <Grid> <Grid.Resources> <D ...
- Chart.js中文文档-雷达图
雷达图或蛛网图(Radar chart) 简介 A radar chart is a way of showing multiple data points and the variation bet ...
- 在Excel中制作雷达图
雷达图的作用 雷达图是专门用来进行多指标体系比较分析的专业图表.从雷达图中可以看出指标的实际值与参照值的偏离程度,从而为分析者提供有益的信息.雷达图一般用于成绩展示.效果对比量化.多维数据对比等等,只 ...
- [2014.01.27]wfRadar 雷达图组件 2.5
全新开发的雷达图组件--wfRadar,使用简单,功能强大,图像处理效果极佳. 组件支持多种图片格式,包括bmp,jpg,gif,wmf,emf,ico,png,pcx,tif,tga,pcx,dcx ...
- 《BI那点儿事》SSRS图表和仪表——雷达图分析三国超一流谋士、统帅数据(图文并茂)
雷达图分析三国超一流谋士.统帅数据,献给广大的三国爱好者们,希望喜欢三国的朋友一起讨论,加深对传奇三国时代的了解 建立数据环境: -- 抽取三国超一流谋士TOP 10数据 DECLARE @t1 TA ...
- python批量制作雷达图
老板要画雷达图,但是数据好多组怎么办?不能一个一个点excel去画吧,那么可以利用python进行批量制作,得到样式如下: 首先制作一个演示的excel,评分为excel随机数生成: 1 =INT(( ...
- echarts雷达图
用echarts展现雷达图的定制 <!doctype html> <html> <head> <meta charset="utf-8"& ...
- 利用d3.js绘制雷达图
利用d3,js将数据可视化,能够做到数据与代码的分离.方便以后改动数据. 这次利用d3.js绘制了一个五维的雷达图.即将多个对象的五种属性在一张图上对照. 数据写入data.csv.数据类型写入typ ...
随机推荐
- 前端url参数中带有callback并产生错误
错误截图: 初步诊断是由于后端返回值的数据格式不正确造成的 解决方式: 1).接受在springmvc中接受callback参数 2).将对象转为Object 3).拼接callback方法,其中返回 ...
- JDK源码之Double类&Float类分析
一 概述 Double 类是基本类型double的包装类,fainl修饰,在对象中包装了一个基本类型double的值.Double继承了Number抽象类,具有了转化为基本double类型的功能. 此 ...
- js 字符串方法 和 数组方法总览
字符串方法 search() 方法搜索特定值的字符串,并返回匹配的位置. 相比于indexOf(),search()可以设置更强大的搜索值(正则表 ...
- python3中的继承和多态
*继承 当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super clas ...
- jmeter性能测试2:基础功能介绍
对于英语不好的同学建议先改为简体中文再进行使用 1.添加->threads->线程组(控制总体并发) 线程数:虚拟用户数.一个虚拟用户占用一个进程或线程 ...
- uredis ------ 异步 redis 封装的访问库(c++),基于hiredis.
详见 github : https://github.com/uniqss/uredis 底层使用hiredis库,使用libuv库. 只支持异步 支持分表分库,一般是用玩家的ID去取模,比如分库10 ...
- 国外大神制作的一个很棒的matplotlib 可视化教程
国外大神制作的一个很棒的matplotlib 可视化教程 参考:https://www.machinelearningplus.com/plots/top-50-matplotlib-visualiz ...
- 《Python学习手册 第五版》 -第7章 字符串基础
本章内容是关于字符串的,字符串是编程中经常遇到的问题,本章的内容不是包含所有字符串的讲解,而是针对其最基本的内容进行说明,后续的相关章节会根据需要进行扩展和说明,例如后续的第37章内容会讲解Unico ...
- linux入门系列11--Centos7网络服务管理
通过前面文章的学习已经掌握了Linux系统配置管理的知识,本文讲解Centos7网络配置知识. Linux要对外提供服务,需要保证网络通信正常,因此需要正确配置网络参数.本文将讲解如何使用Networ ...
- Python应用——多变量的灵活处理
本文始发于个人公众号:TechFlow,原创不易,求个关注 我们都知道Python是一个非常灵活的语言,以至于如果它不是你的第一门语言,你会发现它总能给你各种各样的惊喜,让你忍不住惊叹:woc,还有这 ...