1 前言

1.1 定义

数据可视化的定义有很多,像百度百科的定义是:数据可视化,是关于数据视觉表现形式的科学技术研究。其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽提出来的信息,包括相应信息单位的各种属性和变量。其实就是利用运用计算机图形学、图像、人机交互等技术,将采集或模拟的数据映射为可识别的图形、图像,说白了就是使用图像形式展示数据。

1.2 分类

常用的数据可视化有柱状图、线状图、条形图、面积图、饼图、点图、仪表盘、走势图外,还有和弦图、圈饼图、金字塔、漏斗图、K线图、关系图、网络图、玫瑰图、帕累托图、数学公式图、预测曲线图、正态分布图、迷你图、行政地图、GIS地图等等。

1.3 说明

可视化类型太多,此文不可能一一列出(后续有机会补充),本文使用Qt官方例子为引,描述如何使用QChart进行如下图的数据可视化:

qt官方例子可依据下图方式查找(安装qt的时候需要把exaples安装)。

2 正文

以下代码基本照搬qt示例代码,也就是说此文深度有限,我们以学习为主,主要搞清楚QChart的使用即达到目的,如有需要深入解析QChart源码,我们另发文章分析。

2.1 QChart的介绍

以下内容来源官网并翻译,且括号为自写内容:

QChart是一个在QGaphicScene中可以显示的QGraphicsWidget。它管理不同类型系列和其他图表相关对象(如图例和轴)的图形表示。为了仅在布局中显示图表,可以使用便利类QChartView代替QChart(QChart实例化后,将其指针传入QChartView的构造函数)。另外,通过使用QPolarChart类,可以将折线,样条曲线,面积和散布序列表示为极坐标图。

而QChart属于QCharts图表模块下的一部分,QCharts介绍:

Qt图表模块提供了一组易于使用的图表组件。它使用Qt Graphics View Framework,因此可以轻松地将图表集成到现代用户界面中。Qt图表可用作QWidgets,QGraphicsWidget或QML类型。用户可以通过选择图表主题之一轻松创建令人印象深刻的图表。

2.2 QChart的使用

1、既然属于QCharts模块,所以需要在pro文件中添加charts模块:

QT += core gui charts

2、上面介绍时也说了:

为了仅在布局中显示图表,可以使用便利类QChartView代替QChart(QChart实例化后,将其指针传入QChartView的构造函数)

所以想要显示QChart内容,QChartView构造时候传入QChart指针,如下所示:

    QChartView *chartView;QChart *chart = createLineChart();chartView = new QChartView(chart);  //线覆盖

createLineChart()为下文函数。
查看qt源代码,可了解QChartView继承于QGraphicsView类,而QGraphicsView又继承于QAbstractScrollArea,最后QAbstractScrollArea继承于QFrame,这样说明QChartView最终继承于基础控件类,即new后指定或不指定父对象就直接在ui中显示。

3、显示数据的传入,上面都说了QChart如何显示,下面说明其显示数据来源。
QChart类的所有数据通过addSeries接口传入,参数类型为QAbstractSeriesQAbstractSeries类从名字上来看就知道是一个抽象类,这里使用其多态特性,作为抽象类派生各种数据子类,如:

  • 折线数据类:QLineSeries
  • 曲线数据类:QSplineSeries
  • 离散点数据类:QScatterSeries
  • 面积数据类:QAreaSeries
  • 直方图数据类:QStackedBarSeries
  • 扇型数据类:QPieSeries

以上类下文需要使用,但到底其子类还有哪些,不多说,自个按F1查看帮助文档,如下图:

其中官方例子中(下文代码),所有数据来源m_dataTable,其定义为

 DataTable m_dataTable;

追查其定义来源:

typedef QPair<QPointF, QString> Data;
typedef QList<Data> DataList;
typedef QList<DataList> DataTable;

具体数据解析显示部分自己查看下文理解。

2.3 折线图

QChart *ThemeWidget::createLineChart() const
{QChart *chart = new QChart();   //创建图表chart->setTitle("Line chart");  //设置图表名称QString name("Series ");int nameIndex = 0;for (const DataList &list : m_dataTable){QLineSeries *series = new QLineSeries(chart);   //创建曲线(数据坐标类)for (const Data &data : list)series->append(data.first);     //为曲线添加数据点series->setName(name + QString::number(nameIndex++)); //设置曲线名字chart->addSeries(series);   //添加曲线}chart->createDefaultAxes(); //为坐标系添加轴,需要在所有曲线数据填入后再调用此函数return chart;
}

2.4 曲线图

注意,此处与2中唯一不同就是曲线数据类,此处使用QSplineSeries

QChart *ThemeWidget::createSplineChart() const
{// spine chartQChart *chart = new QChart();chart->setTitle("Spline chart");QString name("Series ");int nameIndex = 0;for (const DataList &list : m_dataTable){QSplineSeries *series = new QSplineSeries(chart);   //创建平滑曲线for (const Data &data : list)series->append(data.first);series->setName(name + QString::number(nameIndex));nameIndex++;chart->addSeries(series);}chart->createDefaultAxes();return chart;
}

2.5 散点图

注意,此处与2\3中唯一不同就是曲线数据类,此处使用QScatterSeries

QChart *ThemeWidget::createScatterChart() const
{// scatter chartQChart *chart = new QChart();chart->setTitle("Scatter chart");QString name("Series ");int nameIndex = 0;for (const DataList &list : m_dataTable){QScatterSeries *series = new QScatterSeries(chart);     //离散点曲线数据类for (const Data &data : list)series->append(data.first);series->setName(name + QString::number(nameIndex));nameIndex++;chart->addSeries(series);}chart->createDefaultAxes();return chart;
}

2.6 面积图

QChart *ThemeWidget::createAreaChart() const
{QChart *chart = new QChart();chart->setTitle("Area chart");// The lower series initialized to zero valuesQLineSeries *lowerSeries = 0;QString name("Series ");int nameIndex = 0;for (int i(0); i < m_dataTable.count(); i++){QLineSeries *upperSeries = new QLineSeries(chart);for (int j(0); j < m_dataTable[i].count(); j++){Data data = m_dataTable[i].at(j);if (lowerSeries){const QVector<QPointF>& points = lowerSeries->pointsVector();upperSeries->append(QPointF(j, points[i].y() + data.first.y()));}else{upperSeries->append(QPointF(j, data.first.y()));}}QAreaSeries *area = new QAreaSeries(upperSeries, lowerSeries);area->setName(name + QString::number(nameIndex));nameIndex++;chart->addSeries(area);chart->createDefaultAxes();lowerSeries = upperSeries;}return chart;
}

2.7 条形图

QChart *ThemeWidget::createBarChart(int valueCount) const
{Q_UNUSED(valueCount);QChart *chart = new QChart();chart->setTitle("Bar chart");QStackedBarSeries *series = new QStackedBarSeries(chart);for (int i(0); i < m_dataTable.count(); i++){QBarSet *set = new QBarSet("Bar set " + QString::number(i));for (const Data &data : m_dataTable[i])*set << data.first.y();series->append(set);}chart->addSeries(series);chart->createDefaultAxes();return chart;
}

2.8 扇型图(也叫饼图)

QChart *ThemeWidget::createPieChart() const
{QChart *chart = new QChart();chart->setTitle("Pie chart");qreal pieSize = 1.0 / m_dataTable.count();for (int i = 0; i < m_dataTable.count(); i++) {QPieSeries *series = new QPieSeries(chart);for (const Data &data : m_dataTable[i]) {QPieSlice *slice = series->append(data.second, data.first.y());//扇型区域名、扇型数值(所有数值比值会自动分配)if (data == m_dataTable[i].first()) {slice->setLabelVisible(); //设置扇型信息可见slice->setExploded(); //设置该项显示突出}}qreal hPos = (pieSize / 2) + (i / (qreal) m_dataTable.count());series->setPieSize(pieSize);series->setHorizontalPosition(hPos);series->setVerticalPosition(0.5);chart->addSeries(series);}return chart;
}

此处我对示例代码做了一些修改,对每个扇型区域类添加了一个信号槽,如下代码所示:

        QPieSeries *series = new QPieSeries(chart); //创建扇型for (const Data &data : m_dataTable[i]){QPieSlice *slice = series->append(data.second, data.first.y()); //扇型区域名、扇型数值(所有数值比值会自动分配)//关联其点击信号槽connect(slice,&QPieSlice::clicked,this,[=](){slice->setLabelVisible(!slice->isLabelVisible());   //设置扇型信息可见slice->setExploded(!slice->isExploded());       //设置该项显示突出});}

实现效果如下:

QChart数据可视化应用相关推荐

  1. qt可视化数据展板_Qt 2D数据可视化之QCharts

    欢迎关注公众号,获得更多其他信息.如果对你有帮助,可以点个赞,让它可以帮助到更多的同志~ 公众号: Pou光明 Qt Charts 在Qt4时代就有了,不过一直以来是商业许可的.QCharts可以在社 ...

  2. Qt编写数据可视化大屏界面电子看板12-数据库采集

    一.前言 数据采集是整个数据可视化大屏界面电子看板系统核心功能,没有数据源,这仅仅是个玩具UI,没啥用,当然默认做了定时器模拟数据,产生随机数据,这个可以直接配置文件修改来选择采用何种数据采集方法,总 ...

  3. Qt编写数据可视化大屏界面电子看板系统

    一.前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合, ...

  4. 数据可视化工具(QBarSeries柱状图)

    柱状图是比较常用的数据可视化工具. 下图为柱状图的demo演示效果,可以将某和柱状进行隐藏. 开发环境配置 所有的QChart开发环境配置都差不多. 1. charts开发环境安装 sudo apt ...

  5. Qt编写数据可视化大屏界面电子看板1-布局方案

    一.前言 布局方案在整个数据可视化大屏界面电子看板系统中,是除了基础功能以外的核心功能之一,只有具备了布局方案这个功能,才能让用户随意调整自己想要的布局,保存成自定义名称的布局配置文件,这样就大大增加 ...

  6. Qt制作大数据可视化大屏展示电子看板

    Qt制作大数据可视化大屏展示电子看板 解决当前最火的大数据可视化大屏展示,整个项目通过Qt开发,集成了QML/QChart/ECharts及自定义控件等模块,所有的可视化控件都可以集成到其中.可以随意 ...

  7. pythongui可视化编程_Python Qt GUI与数据可视化编程

    商品参数 Python Qt GUI与数据可视化编程 定价 99.00 出版社 人民邮电出版社 版次 dy 版 出版时间 2019年09月 开本 16 作者 王维波 等 装帧 平装 页数 488 字数 ...

  8. python qt5 gui快速编程_现货正版 Python Qt GUI与数据可视化编程 pyqt5教程书籍 pyqt5快速开发与实战Qt5 GUI快速编程 计算机网络程序设计人民邮电出版社...

    热销单品 查看更多 > RMB:85.00 立即购买 RMB:63.50 立即购买 RMB:73.50 立即购买 RMB:49.50 立即购买 RMB:127.80 立即购买 RMB:66.00 ...

  9. 用QT制作聆心云数据可视化平台

    因为博客园越来越不好用,所以就此转战csdn. 之所以要制作这个可视化平台呢,是因为了完成[数据可视化]课程的大作业,一篇综述和聆心云平台的数据展示. 好吧,现在先来看作业要求: 各位同学好,就本课程 ...

最新文章

  1. iOS处理高并发量的数据请求和数据集合的对应关系
  2. JavaScript验证表单大全
  3. java web编码详解_java web 开发 编码问题详解
  4. 评价一个人,就是要看他把时间都花在哪了
  5. 获取iOS设备的型号
  6. 服务容错设计:流量控制、服务熔断、服务降级
  7. Kettle使用_11 CSV文件输入输出复制数量
  8. HDU Problem - 5935 Car(模拟)
  9. android 生成apk名字自动已,Jenkins打包android应用时自动签名apk详解
  10. .net邮件发送帮助类
  11. maven gradle等三放jar包仓库
  12. SqlMapTamper使用指南
  13. strpos使用不当引发漏洞
  14. PPT超实用的23个快捷键
  15. Java锁深入理解5——共享锁
  16. 哈工大计算机系统Lab4.Tiny Shell
  17. 全国计算机一级考级考纲,全国计算机等级考试一级MSOffice考试大纲
  18. 产品管理——何为用户体验?附《用户体验的要素》PDF版下载
  19. 工频X线机计算机控制,FSK302-1A型500mA程控X线机.doc
  20. 六、SpringSecurity OAuth2 + SpringCloud Gateway实现统一鉴权管理

热门文章

  1. 你们公司的产品[zhuan]
  2. 网站都变成灰色了,怎么实现的?
  3. 日常编程笔记 | 2022.10.1 | 归并排序_一无序列
  4. 嵌入式--RTC实时时钟原理及相关库函数功能
  5. blend2d + MFC
  6. 西南大学计算机学院导师,西南大学计算机与信息科学学院研究生导师简介-陈武...
  7. 2021年中国定制家具行业现状分析:“量身定制”需求逐年增加[图]
  8. MRP计算之计划展望期、需求时界、计划时界及关系
  9. 微信小程序搭建新闻列表(跟进上一篇博客案例)
  10. 医用IT隔离电源在医院特殊场所接地系统的应用