利用 QPainter实现雷达图(玫瑰图)。效果如下:

源码如下

//.h文件#ifndef CRADARDLG_H
#define CRADARDLG_H#include <QWidget>
#include <QPainter>
#include <QPainterPath>
#include <QMap>
#include "qmath.h"enum RadarType
{Radar=0,  //雷达图Spider    //蜘蛛网图
};enum PointTpye
{ScatterPoints=0, //散点图LinePoints       //连线图
};typedef struct RadarData
{QColor color;QMap<qreal,qreal> datamap;           //key : 角度 value:值 QMap<qreal,qreal> transitiondatmap;  //key : 角度 value:转换的值 }RadarData;#define  PI 3.14159class CRadarDlg : public QWidget
{Q_OBJECTpublic:CRadarDlg(QWidget *parent = 0);~CRadarDlg();void setRadarType(RadarType radartype);void setPointTpye(PointTpye pointstype);
protected:void paintEvent(QPaintEvent *e);private:void init();void drawRadarType(QPainter *painter);void drawRadar(QPainter *painter);void drawSpider(QPainter *painter);void drawAxisLabel(QPainter *painter);void drawLabel(QPainter *painter);void drawData(QPainter *painter);void drawScatterPoints(QPainter *painter);void drawLinePoints(QPainter *painter);private:RadarType m_radartype;PointTpye m_pointstype;int m_cylindernum;  //圈数int m_lineangle;    //角度,决定多少。默认是30int m_Axis_max,m_Axis_min; //最大最小QStringList m_AxisLabelList; //标签 刻度标签QStringList m_labelList;     //外围标签bool m_showAxisLabel;bool m_showLabel;   QMap<int,RadarData> m_datamap;  //key 表示组,value表示对于的值QList<QColor> m_colorlist;};#endif // CRADARDLG_H
//cpp文件#include "cradardlg.h"CRadarDlg::CRadarDlg(QWidget *parent): QWidget(parent)
{init();
}CRadarDlg::~CRadarDlg()
{}void CRadarDlg::setRadarType( RadarType radartype )
{m_radartype = radartype;
}void CRadarDlg::setPointTpye( PointTpye pointstype )
{m_pointstype = pointstype;
}void CRadarDlg::init()
{setRadarType(Radar);setPointTpye(LinePoints);m_cylindernum = 5;  //默认6圈m_lineangle = 30; //默认30度m_showAxisLabel = true;m_Axis_min = 0;m_Axis_max = 100;m_AxisLabelList << "0" << "20" << "40" << "60" << "80" << "100";m_colorlist << QColor(136,68,255);m_colorlist << QColor(102,170,238);m_colorlist << QColor(146,39,143);m_colorlist << QColor(238,187,34);m_colorlist << QColor(238,187,34);m_colorlist << QColor(238,187,34);m_colorlist << QColor(141,198,63);m_colorlist << QColor(255,242,0);for (int i = 0 ; i < 360; i+=m_lineangle){m_labelList << QString("%1").arg(i);}RadarData tlist1,tlist2;QMap<qreal,qreal> datamap,datamap2;for (int i = 0; i < 10;++i){datamap2 .insert (i*20,i*10);datamap .insert(i*30,i*5);}tlist2.color = QColor(136,68,255);;tlist1.color = QColor(146,39,143);;tlist1.transitiondatmap = datamap;tlist2.transitiondatmap = datamap2;m_datamap.insert(0,tlist2);m_datamap.insert(1,tlist1);}void CRadarDlg::paintEvent( QPaintEvent *e )
{QPainter *painter = new QPainter(this);painter->setRenderHint(QPainter::Antialiasing);painter->setRenderHint(QPainter::SmoothPixmapTransform);painter->setRenderHint(QPainter::TextAntialiasing);//添加背景颜色
//  painter->save();
//  painter->setBrush(Qt::blue);
//  painter->drawRect(0,0,width(),height());
//  painter->restore();
//drawRadarType(painter);drawAxisLabel(painter);drawLabel(painter);drawData(painter);}void CRadarDlg::drawRadarType( QPainter *painter )
{   switch (m_radartype){case Radar:drawRadar(painter);break;case Spider:drawSpider(painter);break;default:drawRadar(painter);break;}
}void CRadarDlg::drawRadar( QPainter *painter )
{painter->save();QPen pen;QColor color(Qt::lightGray);pen.setWidthF(0.4);//pen.setColor(color/*.lighter(100)*/); //添加线的颜色painter->setPen(pen);QPainterPath looppath;int w = width();int h = height();int count = m_cylindernum; int radius = qMin(w,h);int step = radius/(count+1);  //加1是为了四周留出空间,写标签int x = w*0.2;int y = h*0.2;QRectF outrect;for (int i = 1; i < count+1; ++i){radius = step*i;x = w/2-radius/2;y = h/2-radius/2;QRectF rect(x,y,radius,radius);looppath.addEllipse(rect);outrect = rect;}painter->drawPath(looppath);
//if (m_lineangle == 0){m_lineangle =90;}int linecount = 360/m_lineangle; int x0 = w/2 ;int y0 = h/2;int newradius = outrect.height()/2;for (int i = 0 ; i < linecount; ++i){int x1 = x0 + newradius*qSin(PI*2/linecount*i);int y1 = y0 + newradius*qCos(PI*2/linecount*i);painter->drawLine(x0,y0,x1,y1);}painter->restore();}void CRadarDlg::drawSpider( QPainter *painter )
{painter->save();QPen pen;QColor color(Qt::lightGray);pen.setWidthF(0.4);//pen.setColor(color/*.lighter(100)*/); //添加线的颜色painter->setPen(pen);QPainterPath looppath;int w = width();int h = height();if (m_lineangle == 0){m_lineangle =90;}int  laycount = m_cylindernum;  //默认是几层 int count = 360/m_lineangle; int radius = qMin(w,h)/2;int x0 = w/2 ;int y0 = h/2;for (int j = 1 ; j < laycount+1; ++j){int newradius = radius*j/(laycount+1);for (int i = 0 ; i < count; ++i){int x1 = x0 + newradius*qSin(PI*2/count*i);int y1 = y0 + newradius*qCos(PI*2/count*i);painter->drawLine(x0,y0,x1,y1);int x2;int y2; if (i == count*2-1){x2 = x0 + newradius*qSin(0);y2 = y0 + newradius*qCos(0);}else{x2 = x0 + newradius*qSin(PI*2/count*(i+1));y2 = y0 + newradius*qCos(PI*2/count*(i+1));}painter->drawLine(x1,y1,x2,y2);}}painter->drawPath(looppath);painter->restore();}void CRadarDlg::drawAxisLabel( QPainter *painter )
{if (!m_showAxisLabel) return;painter->save();//QPen pen;//QColor color(Qt::lightGray);//pen.setColor(color/*.lighter(100)*/); //添加线的颜色//painter->setPen(pen);int  laycount = m_cylindernum;  //默认是几层 int w = width();int h = height();int count = 360/m_lineangle; int radius = qMin(w,h)/2;int x0 = w/2 ;int y0 = h/2;QFont font;int fontsize = 10;if (h > 500)fontsize = 15;font.setPointSize(fontsize);painter->setFont(font);for (int j = 0 ; j < laycount+1; ++j){int newradius = radius*j/(laycount+1);int x1 = x0 + newradius*qSin(PI);int y1 = y0 + newradius*qCos(PI)+20;if (j < m_AxisLabelList.count()){painter->drawText(x1,y1,m_AxisLabelList.at(j));}}painter->restore();
}void CRadarDlg::drawLabel( QPainter *painter )
{if (!m_showLabel) return;painter->save();//QPen pen;//QColor color(Qt::lightGray);//pen.setColor(color/*.lighter(100)*/); //添加线的颜色//painter->setPen(pen);int  laycount = m_cylindernum;  //默认是几层 int w = width();int h = height();int count = 360/m_lineangle; int radius = qMin(w,h)/2;int x0 = w/2 ;int y0 = h/2;QFont font;int fontsize = 10;if (h > 500)fontsize = 15;font.setPointSize(fontsize);painter->setFont(font);for (int i = 0 ; i < count; ++i){int newradius = radius*laycount/(laycount+1)+10;newradius = newradius+10*qSin(PI*2/count*i);int x1 = x0 - newradius*qSin(PI*2/count*i);int y1 = y0 - newradius*qCos(PI*2/count*i);if (y0 < y1 && x0 < x1){y1 -= fontsize*qSin(PI*2/count*i);}else{if (x1 < x0)x1-=fontsize;y1 += fontsize*qSin(PI*2/count*i);}if (i < m_labelList.count()){painter->drawText(x1,y1,m_labelList.at(i));}}painter->restore();
}void CRadarDlg::drawData( QPainter *painter )
{switch(m_pointstype){case ScatterPoints:drawScatterPoints(painter);break;case LinePoints:drawLinePoints(painter);break;default:drawLinePoints(painter);break;}}void CRadarDlg::drawScatterPoints( QPainter *painter )
{painter->save();int w = width();int h = height();int count = 360/m_lineangle; int radius = qMin(w,h)/2*m_cylindernum/(m_cylindernum+1);QList<int> keyilist = m_datamap.keys();qreal step = 1.0*radius/(m_Axis_max-m_Axis_min);foreach (qreal key, keyilist){RadarData rdata = m_datamap.value(key);QColor color = rdata.color;painter->setPen(color.darker(200));painter->setBrush(color.darker(200));foreach (qreal angle ,rdata.transitiondatmap.keys()){qreal length = step*rdata.transitiondatmap.value(angle);angle+=90; //因为转90QPointF certp(w/2 + length*qCos(angle*PI/180),h/2 - length*qSin(angle*PI/180));painter->drawEllipse(certp,2,2);}}painter->restore();
}void CRadarDlg::drawLinePoints( QPainter *painter )
{painter->save();int w = width();int h = height();int count = 360/m_lineangle; int radius = qMin(w,h)/2*m_cylindernum/(m_cylindernum+1);QList<int> keyilist = m_datamap.keys();qreal step = 1.0*radius/(m_Axis_max-m_Axis_min);foreach (qreal key, keyilist){RadarData rdata = m_datamap.value(key);QPainterPath path;int  i = 0;QPointF startp;QColor color = rdata.color;painter->setPen(color.darker(200));painter->setBrush(color.darker(200));foreach (qreal angle ,rdata.transitiondatmap.keys()){qreal length = step*rdata.transitiondatmap.value(angle);angle+=90; //因为转90QPointF certp(w/2 + length*qCos(angle*PI/180),h/2 - length*qSin(angle*PI/180));painter->drawEllipse(certp,2,2);if (i == 0){path.moveTo(certp);startp = certp;}elsepath.lineTo(certp);++i;}path.lineTo(startp);painter->setBrush(color.lighter(100));painter->drawPath(path);}painter->restore();
}

Qt使用QPainter实现雷达图(玫瑰图)相关推荐

  1. 用Python pyecharts v1.x 绘制图形(一):柱状图、柱状堆叠图、条形图、直方图、帕累托图、饼图、圆环图、玫瑰图

    文章目录 关于pyecharts 柱状图 堆叠柱状图 条形图 直方图 帕累托图(复合图) 饼图 圆环图 玫瑰图 下一节 关于pyecharts pyecharts是一个用于生成echart(百度开源的 ...

  2. echart 圆饼图 显示单位_玩转ECharts之实现“1/2圆的玫瑰图”

    前言 玩转ECharts系列,主要为大家讲解我们基于ECharts如何实现企业级大屏项目中较为常用的各种奇奇怪怪的图表,接下来我们将通过几篇文章从基础图表开始为大家详细讲解实现这些图表样式的一些&qu ...

  3. python用matplotlib画玫瑰_Python可视化:用Matplotlib画个玫瑰图

    emmmm,差不多 差不多就行,哈哈哈 100%还原太麻烦了 文字的和其他的修饰,作者实在嫌麻烦,有兴趣的朋友,可以自己尝试一下 下面进入教学时间,大家鼓掌 1.什么是玫瑰图 玫瑰图,玫瑰图,就是长得 ...

  4. 循序渐进,学会用pyecharts绘制玫瑰图

    循序渐进,学会用pyecharts绘制玫瑰图 玫瑰图简介 玫瑰图全称南丁格尔玫瑰图,是英国护士和统计学家弗罗伦斯·南丁格尔发明的,又名为极区图. 南丁格尔自己常昵称这类图为鸡冠花图(coxcomb), ...

  5. Python之基础详解(十二):进阶,用pyecharts绘制世界地图、玫瑰图、雷达图

    我之前发过一篇博文基本讲解了基本绘制地图的方法. 我这里打算直接调用api来创建实时动态地图,并且分析数据绘制了玫瑰图,雷达图. 步骤 配套资源下载: 第一步:配置环境 第二步:爬取数据 第三步:创建 ...

  6. Python画玫瑰图

    Python画玫瑰图 第一步,读取数据: 第二步,设置柱长: 第三步,设置角度: 第四步,设置颜色 第五步,做图; 普通型 中央空白型 半透明型 第六步,添加标签,美化图形. 第一步,读取数据: im ...

  7. 用Excel仿制了一个玫瑰图!

    本文说明 如果说有下面这样一个数据,要是在工作中,你肯定会直接做一个下图所示的的柱形图,因为简单方便! 但要是你有时间,想要做个图形吸引别人呢? 哈哈,今天要讲的玫瑰图肯定是一个不错的选择,因为很多人 ...

  8. 教你做超惊艳的南丁格尔玫瑰图

    其实早在今年初,疫情还很严重的时候,人民日报发布的这个图就吸引了广大数据分析者的注意. 今天我们就把这个图的前因后果以及怎么做一次性讲清楚. 玫瑰图的前世今生 这个图学名:南丁格尔玫瑰图,是弗罗伦斯· ...

  9. 词云图、动态图、统计图、玫瑰图、象形图、多渐变色柱状图、双色叠加象形图等十个图(可单独运行,直接拿来用)

    把这些图给大家分享的目的是因为我在需要使用的时候网上的图要不就是需要下载,要不就是不全,最好的也是需要自己下载js包,但是对于学习后端的我们来说上手十分不容易.尤其是课程项目紧张,难道我们还需要去学习 ...

最新文章

  1. error C2061: 语法错误: 标识符“std”
  2. Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
  3. 洛谷——P2678 跳石头
  4. 神经网络的物理学解释(一)---权重与概率幅
  5. python考试pass or fail_python-pytest学习(十二)-标记失败xfail
  6. 宜搭数据量扩容升级公告
  7. WebStorm For Mac下载及破解方法
  8. mysql将备份的数据导入_成功将MySQL的大型数据导入导出和备份(转载)
  9. mysql简单创建数据库权限(待修改备注)
  10. 绝地服务器维护7月5日,绝地求生正式服7月5日停机更新维护内容公告
  11. 程序员面试金典 - 面试题 16.24. 数对和(双指针/哈希map)
  12. 我对DevOps的理解
  13. 罗永浩称赚钱没有太大难度,是凡尔赛还是感慨?
  14. mysql左外连接条件_mysql – 左外连接的MAX条件
  15. 让网页附件为Word或Excel的文件,下载时直接弹出下载对话框,而不打开它
  16. 信创终端高效运维与安全管理方案
  17. 【深入理解JS核心技术】11. 什么是一级函数
  18. 内部收益率计算公式用计算机,用EXCEL计算财务内部收益率
  19. 华为智慧屏鸿蒙评测,搭载鸿蒙系统的荣耀智慧屏值得入手吗?荣耀智慧屏全面评测...
  20. PointCloudLibrary点云库介绍

热门文章

  1. zepto 事件分析4(事件队列)
  2. 第三课--AMP架构双核应用程序开发和软中断处理(一)
  3. 全新安装2008操作系统和2008 server core核心安装
  4. python控制svn_jenkins+svn+python的使用
  5. [JS3] 立即执行JS
  6. jstorm mysql_Jstorm+Spring+mybatis整合
  7. Android Google Map APIKey申请
  8. php开发_图片验证码
  9. java导出excel 客户端_java如何将导出的excel下载到客户端
  10. 让LYNC 2010 登录OCS 2007 R2