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 ...
随机推荐
- 整合dubbo的依赖
<!-- 版本信息 --> <properties> <dubbo.version>2.7.3</dubbo.version> <maven-ja ...
- Django自动化测试平台项目案例
引言 在项目组待了近半年时间,根据自己的感受和体验,做了一个辅助测试的工具(数据预报平台),主要目的是针对目前项目接口文档缺失,自动化预报脚本无法可视化,资源循环利用,统一管理化. 业务背景 我们项目 ...
- 基于H5与webGL的 3d 电子围栏展示
前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...
- cmd 重定向
关于cmd 命令的重定向输出 2>&1 mycommand >mylog.txt 2>&1 应该是最经典的用法了. 命令的结果可以通过" %> &qu ...
- Netty源码分析之ChannelPipeline—入站事件的传播
之前的文章中我们说过ChannelPipeline作为Netty中的数据管道,负责传递Channel中消息的事件传播,事件的传播分为入站和出站两个方向,分别通知ChannelInboundHandle ...
- 【做题笔记】 P1610 鸿山洞的灯
正解:DP 比较好写的/我用的算法:贪心 首先需要理解几个地方: 第二行输入的 \(n\) 个数字是每盏灯所在的地方.可以不按顺序,灯与灯之间的距离是个变量. 对于任意一段区间,只要是在 \(\tex ...
- python学习记录(八)
0910--https://www.cnblogs.com/fnng/archive/2013/04/28/3048356.html Python异常 Python用异常对象(exception ob ...
- CCF_ 201312-2_ISBN号码
水. #include<cstdio>#include<string>#include<iostream>using namespace std; int main ...
- c++中的 static 关键字
注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...
- Jumpserver:跳板机
简介 jumpserver是github上的一个开源项目,其能有效的对服务器.用户进行分组,实现用户-系统用户-服务器的对应权限控制,并结合审计.日志等功能,据说是 4A 级的专业运维审计系统,系统提 ...