前言

工具:PdfSharpCore或Pdfsharp
知识 :基本的三角函数
思路 : 画坐标,确定点-------->画多个半径渐变的正多边形------->根据数据确定雷达图的数值位置

StepOne:画一个正五边形

先画一个辅助坐标轴,
再通过三角函数确认其各个点的坐标,这里画一张图展示

因为pdfsharp默认的原点为左上角,正值为第四象限,
所以为了更好的确定各点的坐标,
则需要移动原点的位置,旋转坐标轴,以求设置为熟悉的常用坐标
好在pdfsharpcore提供了现成的方法,调整起来也比较简单
代码:

const double PAI = Math.PI;static void Main(string[] args){PdfDocument doc = new PdfDocument();PdfPage page = new PdfPage(doc);XGraphics graphics = XGraphics.FromPdfPage(page);//这个方法用来移动坐标原点的位置graphics.TranslateTransform(200, 200);//这个方法用来旋转坐标轴graphics.RotateTransform(180);graphics.DrawLine(new XPen(XBrushes.AliceBlue), new XPoint(-200,0), new XPoint(200,0));graphics.DrawLine(new XPen(XBrushes.AliceBlue), new XPoint(0,200), new XPoint(0,-200));double radius = 60;XPoint[] points = new XPoint[6]{new XPoint(){ X = 0,Y = radius },new XPoint(){ X = Math.Sin(72*PAI/180)*radius,Y = Math.Sin(18*PAI/180)*radius },new XPoint(){ X = Math.Sin(36*PAI/180)*radius,Y = -1*Math.Sin(54*PAI/180)*radius },new XPoint(){ X = -1*Math.Sin(36*PAI/180)*radius,Y = -1*Math.Sin(54*PAI/180)*radius },new XPoint(){ X = -1*Math.Sin(72*PAI/180)*radius,Y = Math.Sin(18*PAI/180)*radius},new XPoint(){ X = 0,Y = radius }};graphics.DrawLines(new XPen(XColors.RoyalBlue),points);graphics.Save();doc.AddPage(page);doc.Save("../../../wdnmd.pdf");

运行后可以得到

StepTwo:以原点为中心,以等比的半径画若干个五边形

有了以上的代码,只需要准备一个半径数组即可
如下:

const double PAI = Math.PI;static void Main(string[] args){PdfDocument doc = new PdfDocument();PdfPage page = new PdfPage(doc);XGraphics graphics = XGraphics.FromPdfPage(page);graphics.TranslateTransform(200, 200);graphics.RotateTransform(180);graphics.DrawLine(new XPen(XBrushes.AliceBlue), new XPoint(-200,0), new XPoint(200,0));graphics.DrawLine(new XPen(XBrushes.AliceBlue), new XPoint(0,200), new XPoint(0,-200));//等差/或等比都行double[] radius_list = new double[5]{60,75,90,105,120};radius_list.ToList<double>().ForEach(item=> {XPoint[] points = new XPoint[6]{new XPoint(){ X = 0,Y = item },new XPoint(){ X = Math.Sin(72*PAI/180)*item,Y = Math.Sin(18*PAI/180)*item },new XPoint(){ X = Math.Sin(36*PAI/180)*item,Y = -1*Math.Sin(54*PAI/180)*item },new XPoint(){ X = -1*Math.Sin(36*PAI/180)*item,Y = -1*Math.Sin(54*PAI/180)*item },new XPoint(){ X = -1*Math.Sin(72*PAI/180)*item,Y = Math.Sin(18*PAI/180)*item},new XPoint(){ X = 0,Y = item }};graphics.DrawLines(new XPen(XColors.RoyalBlue), points);});graphics.Save();doc.AddPage(page);doc.Save("../../../wdnmd.pdf");}

StepThree:填充数据

假设有一组数据如下

[100,20,66,33,55]
[44,77,30,100,88]
[66,88,77,50,20]

然后你要在以下两种方法中选择一种
1.固定顶点数值
2.以组中对位最大值为顶点数值(可以更充分的绘制)

这里选择第二种
接下来是确定组中各点在图中的位置
因为点一定在原点到多边形顶点的连线上,且长度为self/Max*R
所以可以确定点的具体坐标,

这里直接省去计算的步骤,得出三组的坐标点为

[(0,100/100*R),
(-1*20/88*R*sin72,20/88*R*sin18),
(-1*66/77*R*sin36,-1*66/77*R*sin54),
(33/100*R*sin36,-1*33/100*R*sin54),
(55/88*R*sin72,55/88*R*sin18)
]
[(0,44/100*R),
(-1*77/88*R*sin72,77/88*R*sin18),
(-1*30/77*R*sin36,-1*30/77*R*sin54),
(100/100*R*sin36,-1*100/100*R*sin54),
(88/88*R*sin72,88/88*R*sin18)
]
[(0,66/100*R),
(-1*88/88*R*sin72,88/88*R*sin18),
(-1*77/77*R*sin36,-1*77/77*R*sin54),
(50/100*R*sin36,-1*50/100*R*sin54),
(20/88*R*sin72,20/88*R*sin18)
]

StepFour:绘制多边形

在确定了各个点的坐标位置后,直接调用graphics.DrawPolygon方法即可
代码如下:

const double PAI = Math.PI;static void Main(string[] args){PdfDocument doc = new PdfDocument();PdfPage page = new PdfPage(doc);XGraphics graphics = XGraphics.FromPdfPage(page);graphics.TranslateTransform(200, 200);graphics.RotateTransform(180);graphics.DrawLine(new XPen(XBrushes.AliceBlue), new XPoint(-200,0), new XPoint(200,0));graphics.DrawLine(new XPen(XBrushes.AliceBlue), new XPoint(0,200), new XPoint(0,-200));/* double radius = 60;XPoint[] points = new XPoint[6]{new XPoint(){ X = 0,Y = radius },new XPoint(){ X = Math.Sin(72*PAI/180)*radius,Y = Math.Sin(18*PAI/180)*radius },new XPoint(){ X = Math.Sin(36*PAI/180)*radius,Y = -1*Math.Sin(54*PAI/180)*radius },new XPoint(){ X = -1*Math.Sin(36*PAI/180)*radius,Y = -1*Math.Sin(54*PAI/180)*radius },new XPoint(){ X = -1*Math.Sin(72*PAI/180)*radius,Y = Math.Sin(18*PAI/180)*radius},new XPoint(){ X = 0,Y = radius }};graphics.DrawLines(new XPen(XColors.RoyalBlue),points);*///等差/或等比都行double[] radius_list = new double[5]{60,75,90,105,120};radius_list.ToList<double>().ForEach(item=> {XPoint[] points = new XPoint[6]{new XPoint(){ X = 0,Y = item },new XPoint(){ X = Math.Sin(72*PAI/180)*item,Y = Math.Sin(18*PAI/180)*item },new XPoint(){ X = Math.Sin(36*PAI/180)*item,Y = -1*Math.Sin(54*PAI/180)*item },new XPoint(){ X = -1*Math.Sin(36*PAI/180)*item,Y = -1*Math.Sin(54*PAI/180)*item },new XPoint(){ X = -1*Math.Sin(72*PAI/180)*item,Y = Math.Sin(18*PAI/180)*item},new XPoint(){ X = 0,Y = item }};graphics.DrawLines(new XPen(XColors.RoyalBlue), points);});//假设以下是数据List<double[]> doubles = new List<double[]>(){new double[]{100,20,66,33,55},new double[]{44,77,30,100,88},new double[]{ 66, 88, 77, 50, 20 }};//寻找数据中每一列的最大值double maxOne = 0;double maxTwo = 0;double maxThree = 0;double maxFour = 0;double maxFive = 0;foreach(double[] temp in doubles){maxOne = Math.Max(temp[0],maxOne);maxTwo = Math.Max(temp[1], maxTwo);maxThree = Math.Max(temp[2], maxThree);maxFour = Math.Max(temp[3], maxFour);maxFive = Math.Max(temp[4], maxFive);}doubles.ForEach(item => {//根据同上的三角函数,确定各点的坐标XPoint[] points = new XPoint[6]{new XPoint(0,item[0]/maxOne*120),new XPoint(-1*item[1]/maxTwo*120*Math.Sin(72*PAI/180),item[1]/maxTwo*120*Math.Sin(18*PAI/180)),new XPoint(-1*item[2]/maxThree*120*Math.Sin(36*PAI/180),-1*item[2]/maxThree*120*Math.Sin(54*PAI/180)),new XPoint(item[3]/maxFour*120*Math.Sin(36*PAI/180),-1*item[3]/maxFour*120*Math.Sin(54*PAI/180)),new XPoint(item[4]/maxFive*120*Math.Sin(72*PAI/180),item[4]/maxFive*120*Math.Sin(18*PAI/180)),new XPoint(0,item[0]/maxOne*120)};graphics.DrawPolygon(new XPen(XColors.Red, 1), points);});graphics.Save();doc.AddPage(page);doc.Save("../../../wdnmd.pdf");}

效果如下

StepFive:总结

PdfSharp/Core的绘图方法很丰富,可以用来绘制比较精密的图形。
同时,如果想要更进一步的绘制,最好将数据Model固定,弄一种固定格式,也可以借此展示更多信息。
最后注意坐标点的计算需要用到一些三角函数,请不要忘光了。

C#在Pdf画统计图表之【雷达图】(以五边形为例)相关推荐

  1. python画出的雷达图效果-PYTHON绘制雷达图代码实例

    这篇文章主要介绍了PYTHON绘制雷达图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.雷达图 import matplotlib.py ...

  2. MATLAB 雷达图画图函数

    本人终于写了第一篇博客 因毕业设计画图需要,用MATLAB写了一个自动画雷达图的程序,可以画两种雷达图:多边形风格和圆风格的雷达图,有需要的朋友可以参考. 一.多边形风格雷达图 画图的原理是,先一条一 ...

  3. cinrad修改雷达图背景色

    cinrad修改雷达图背景色 使用python画出的雷达图背景色一般默认为黑色,若想要将背景色改为白色,需要在cinrad源代码中修改 找到cinrad的安装文件夹,我的装在d盘,路径为 " ...

  4. Python数据可视化神奇利器,Pyecharts的使用(4.雷达图的使用之FIFA足球明星分析)

    前面安装步骤以及大致使用在主页柱状图的使用那篇文章中,可以点击主页进行访问! FIFA22球星前五雷达图展示 数据清洗 import numpy as np import pandas as pd f ...

  5. 平凡的世界电子书pdf下载_零基础彩铅画入门教程步骤图及全套PDF电子书教程下载!...

    零基础彩铅画入门教程步骤图及全套PDF电子书教程下载! 很多小伙伴喜欢看彩铅画也想尝试自己画一下,不过大家担心没有绘画基础能画好彩铅画吗.在这里小编要告诉大家没有绘画基础也可以学好画画的,今天小编给大 ...

  6. python画雷达图-Python 详解雷达图/蛛网图

    雷达图-pyecharts 蛛网图,最早知道是在玩FIFA游戏的时候,球员的能力用蛛网图来表示与比较,那时觉得非常新鲜.后来,在实际的工作中,其实很少用到:一方面,直接提供蛛网图的工具少:另一方面,过 ...

  7. 可视化框架、Axure原型、大屏可视化、图表组件、图表元件库、统计图表、数据可视化模板、条形图、折线图、散点图、时间轴、仪表盘、饼图、散点图、雷达图、高山图、登录模板、弹窗、弹幕、预警、散点图

    可视化框架.数据可视化综合管理平台.大屏可视化.图表组件.图表元件库.统计图表.数据可视化模板.条形图.折线图.散点图.时间轴.仪表盘.饼图.散点图.雷达图.高山图.登录模板.弹窗.弹幕.预警.散点图 ...

  8. python画雷达图-python 雷达图

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 假设某天某地每三个小时取样的气温为 0时 3时 6时 9时 12时 15 ...

  9. JS Echarts之雷达图 | 使用Excel画雷达图

    文章目录 第一部分:JS Echarts之雷达图 1. 什么是 Echarts 2. JS Echarts之雷达图 2.1 使用Echarts画雷达图 2.3 echarts雷达图中常用修改 修改in ...

最新文章

  1. python 二进制流转图片_Python零基础入门到精通-5.1节:Python程序的执行过程
  2. windows 连Linux,Windows下访问Linux资源
  3. 计算机指令格式_计算机科学组织| 指令格式
  4. scala java抽象理解_scala – 抽象覆盖如何在Java代码方面起作用?
  5. 机智云CEO黄灼:优秀的企业在何时都不会遇到融资困境
  6. 在Java中导出word、excel格式文件时JSP页面头的设置
  7. 高级数理逻辑试卷参考答案
  8. 通过百度BAE搭建微信二次开发的服务(2)
  9. 网贷查询接口开发 网贷黑名单查询 个人网贷黑名单查询
  10. 一夜闪崩35%!全球GPU显卡价格开始大幅度跳水
  11. Office 365 Certification 考试心得
  12. 泡沫经济中的泡沫游戏
  13. linuxDebian英伟达显卡驱动的安装方法
  14. 计算机无法打开用友通,用友通服务启动后又停止了?
  15. Procast仿真模拟过程监控软件
  16. carla官方文档笔记1
  17. iis7设置html支持asp,图解IIS7如何添加支持asp功能
  18. C++:害死人不偿命的(3n+1)猜想(PTA)
  19. 迎来全民网络支付新时代
  20. XP打印机任务无法删除

热门文章

  1. 入门学习-Python-小甲鱼学习资料-Day023-递归:这帮小兔崽子
  2. Zcash中的description
  3. 如何将Android数据库操作通用化(四)
  4. ES 文件浏览器安全漏洞分析(CVE-2019-6447)
  5. 《我和PIC单片机:基于PIC18》——第1章 初识PIC 1.1 与众不同的PIC
  6. 微服务架构中服务集成的主要技术
  7. 第二证券|卡塔尔给体育烧的钱,不止世界杯
  8. 扩展DailyRollingFileAppender使其支持限定日志文件的数量
  9. 【墨者学院】主机溢出提权漏洞分析
  10. 【游戏设计模式】之二 论撤消重做 回放系统的实现 命令模式