QChart数据可视化

目录

一、QChart基本介绍

1.1 QChart基本概念与用途

1.2 主要类的介绍

1.2.1 QChartView类

1.2.2 QChart类

1.2.3QAbstractSeries类

1.2.4 QAbstractAxis类

1.2.5 QLegendMarker

二、与图表交互

1. 动态绘制数据

2. 深入数据

3. 缩放和滚动

4. 鼠标悬停

三、主题

四、代码实践

4.1 踩坑

4.2 线性图绘制

4.3 散点图

 4.4 柱状图

4.5 饼状图


一、QChart基本介绍

1.1 QChart基本概念与用途

        QtCharts是一个Qt模块,它提供了许多种常见的图表类型,如折线图、柱状图、饼图、散点图、区域图、极坐标图等等。使用QtCharts可以轻松地把数据可视化,帮助用户更好地理解数据,进行分析和决策。以下是Qt官方的介绍:

       The QChart class manages the graphical representation of the chart's series, legends, and axes.

        QChart is a QGraphicsWidget that you can show in a QGraphicsScene. It manages the graphical representation of different types of series and other chart related objects like legend and axes. To simply show a chart in a layout, the convenience class QChartView can be used instead of QChart. In addition, line, spline, area, and scatter series can be presented as polar charts by using the QPolarChart class.

1.2 主要类的介绍

QChart主要由一下几个大类组成:

1.2.1 QChartView类

        视图对象,实际是一个独立的widget,用以展示图表。

1.2.2 QChart类

        是真正的图表对象,QChart需要添加在QChartView对象下才可在正确展示出来。

1.2.3QAbstractSeries类

        是数据集合,在QChart中添加QAbstractSeries,才可以展示出数据,否则QChart只能展现坐标轴 ,主要数据类及继承关系如下。

1.2.4 QAbstractAxis类

        坐标轴类,用来设置QChart类的坐标轴属性,包括范围、精度等,也用来将QAbstractSeries类与QChart类对应起来。

Qt Charts支持以下坐标轴类型:

  • 值轴 QValueAxis):实际值添加到图表的轴上。它是使用QValueAxis类或ValueAxis QML类型实现的。
  • 类别轴(QCategoryAxis):有命名范围和可调范围宽度
  • 条形类别轴 (QBarCategoryAxis):类似于类别轴,但所有范围的范围宽度都相同。bar类别轴是使用QBarCategoryAxis类或BarCategoryAxis QML类型实现的。
  • 日期-时间轴(QDateTimeAxis):将日期和时间添加到图表轴上。它是使用QDateTimeAxis类或DateTimeAxis QML类型实现的。
  • 对数值轴(QLogValueAxis):向图表的轴添加对数刻度。对数标度是一种基于数量级的非线性标度,因此轴上的每个刻度都是前一个刻度乘以一个值。使用QLogValueAxis类或LogValueAxis QML类型实现对数轴

       可以为一个图表定义多个轴。坐标轴可以放在图表的上下左右。此外,轴可以是不同的类型。但是,不支持混合轴类型,这会导致不同的域,例如在同一方向上指定QValueAxis和QLogValueAxis。

1.2.5 QLegendMarker

        图例是一个显示图表图例的图形对象。图例对象不能被创建或删除,但是它们可以通过QChart类被引用。当序列发生变化时,图例状态由QChart或ChartView更新。
        图例可以位于图表的下方或上方,也可以位于图表的左侧或右侧。默认情况下,图例是附加到图表视图的,但它可以分离到一个可以自由移动的单独图形项。可以隐藏图例中的单个标记,也可以隐藏整个图例。
        图例标记可以通过使用QLegendMarker基类和每个序列类型的子类来修改:

        QAreaLegendMarker、QBarLegendMarker、QBoxPlotLegendMarker、                   QCandlestickLegendMarker和QXYLegendMarker。

二、与图表交互

        用户可以通过以下方式与图表进行交互:动态地向图表添加值、深入聚焦数据、放大和缩小图表、滚动图表、单击图表中的项目或将鼠标悬停在图表上。

1. 动态绘制数据

        可以动态地向图表添加数据,并使图表视图自动滚动以显示新数据

2. 深入数据

        例如,可以将下钻效果实现为条形图或饼状图。当用户在图表中选择项目时,将显示该项的更详细视图
        例如,可以对条形图或饼图实现下钻效果。当用户在图表中选择一个项目时,将显示该项目的更详细视图。这是通过删除第一个序列并添加另一个序列来实现的。

3. 缩放和滚动

        用户可以使用键盘进行缩放和滚动。它们可以使用方向键滚动图表,也可以使用正负键放大或缩小图表。此外,QRubberBand可以用来选择要放大的区域。

4. 鼠标悬停

        可以将槽连接到终端用户单击图表中的项或将鼠标悬停在图表上时发出的信号。这使您能够向图表中添加元素,如标注。

三、主题

        主题是应用于图表的所有视觉元素的UI样式相关设置的内置集合,例如颜色、画笔、画刷和字体系列,以及轴、标题和图例。

Qt图表具有以下预定义的主题:

  • Light主题,这是默认主题
  • 天蓝色的主题
  • 黑暗的主题
  • 砂褐色主题
  • 自然颜色系统(NCS)蓝色主题
  • 高反差主题
  • 冰蓝色主题
  • Qt的主题

可以通过更改颜色、画笔、画刷和字体来定制主题。可以通过修改Qt Charts的源代码来添加新的主题

注意:更改主题将覆盖之前应用于该系列的所有自定义。

四、代码实践

4.1 踩坑

必须声明命名空间,库必须与编译器选择模式对应。

using namespace QtCharts;

4.2 线性图绘制

//折线图
	connect(ui.pushButton_zhexian, &QPushButton::clicked, this, [=] {
		//QLineSeries *lineSeries1 = new QLineSeries();  //折线
		//QLineSeries *lineSeries2 = new QLineSeries();
		QSplineSeries *lineSeries1 = new QSplineSeries(); //平滑曲线
		QLineSeries *lineSeries2 = new QLineSeries();
		qsrand(QTime::currentTime().second());
		for (int i = 0; i <= 41; ++i)
		{	
			qreal y = qrand() % 100;
			if (i <= 20)
			{
				qreal x = i;
				lineSeries1->append(x, y);
			}
			else
			{
				qreal x = i - 21;
				lineSeries2->append(x, y);
			}
		}

		lineSeries1->setColor(Qt::blue);
		lineSeries1->setPen(QPen(Qt::blue, 2));
		lineSeries1->setName("line1");//图例的名字
		lineSeries2->setColor(Qt::red);
		lineSeries2->setPen(QPen(Qt::red, 2, Qt::PenStyle::DashDotDotLine));
		lineSeries2->setName("line2");
		lineSeries1->setPointLabelsVisible(true);
		lineSeries2->setPointLabelsVisible(true);

		//创建QChart
		QChart *chart = new QChart();
		chart->setTitle("Line Chart");//设置标题
		chart->addSeries(lineSeries1); //将折线系列添加到图标
		chart->addSeries(lineSeries2);

		//修改图例
		QLegend * legned = chart->legend();
		legned->setAlignment(Qt::AlignBottom);
		legned->setBackgroundVisible(false);
		legned->setMarkerShape(QLegend::MarkerShape::MarkerShapeRectangle);

		//创建X轴
		QValueAxis *axisX = new QValueAxis();
		axisX->setLabelFormat("%.0f");//设置标签格式
		axisX->setTitleText("X轴");
		axisX->setRange(0, 20);//设置范围
		axisX->setTickCount(21); //设置tickCount 即标签数量为21 0-21
		axisX->setGridLineVisible(false);//设置主刻度线不可见
		//axisX->hide();//隐藏刻度线 X周 0-10 不可见
	

		//创建Y轴
		QValueAxis *axisY = new QValueAxis();
		axisY->setTitleText("Y轴");
		axisY->setRange(0, 100);//设置范围
		axisY->setTickCount(11); //设置tickCount 即标签数量为11 100进行10等分 11个标签 

		//关联轴到Chart和QSeries
		chart->addAxis(axisX, Qt::AlignBottom);
		chart->addAxis(axisY, Qt::AlignLeft);
		lineSeries1->attachAxis(axisX);
		lineSeries1->attachAxis(axisY);
		lineSeries2->attachAxis(axisX);
		lineSeries2->attachAxis(axisY);

		//创建QChartView 对象显示图表
		QChartView * chartview = new QChartView(chart, ui.tab_3);
		chartview->setRenderHint(QPainter::Antialiasing);//抗锯齿

		//显示窗口、
		QMainWindow *win = new QMainWindow(ui.tab_3);
		win->setCentralWidget(chartview);
		win->resize(800, 600);
		win->setWindowTitle("Test_折线图");
		win->show();
		
	});

 

4.3 散点图

connect(ui.pushButton_sactter, &QPushButton::clicked, this, [=]() {
    QScatterSeries *scatterSeries = new QScatterSeries();

	// 添加散点数据
	qsrand(QTime::currentTime().second());//设置随机数生成器的种子
	for (int i = 0; i <= 20; i++) {
		qreal x = i;
		qreal y = qrand() % 100;
		scatterSeries->append(x, y);
		qDebug() << QPoint(x, y);//测试输出
	}

	// 创建 QChart 对象
	QChart *chart = new QChart();
	chart->setTitle("Scatter Chart"); // 设置标题
	chart->addSeries(scatterSeries); // 将散点系列添加到图表中

									 // 创建 QValueAxis 对象作为 X 轴
	QValueAxis *axisX = new QValueAxis();
	axisX->setLabelFormat("%.0f"); // 设置标签格式
	axisX->setTitleText("X Axis");
	axisX->setRange(0, 20); // 设置范围
	axisX->setTickCount(21); // 设置 tickCount,即标签数量为 21
	chart->addAxis(axisX, Qt::AlignBottom); // 将 X 轴添加到图表中
	scatterSeries->attachAxis(axisX); // 散点系列关联 X 轴

									  // 创建 QValueAxis 对象作为 Y 轴
	QValueAxis *axisY = new QValueAxis();
	axisY->setTitleText("Y Axis");
	axisY->setRange(0, 100); // 设置范围
	axisY->setTickCount(11); // 设置 tickCount,即标签数量为 11
	chart->addAxis(axisY, Qt::AlignLeft); // 将 Y 轴添加到图表中
	scatterSeries->attachAxis(axisY); // 散点系列关联 Y 轴

									  // 创建 QChartView 对象显示图表
	QChartView *chartView = new QChartView(chart);
	chartView->setRenderHint(QPainter::Antialiasing); // 抗锯齿

	QMainWindow *win = new QMainWindow(ui.tab_3);
	win->setCentralWidget(chartView);
	win->resize(800, 600);
	win->setWindowTitle("Test_饼状图");
	win->show();

});

 4.4 柱状图

connect(ui.pushButton_bar, &QPushButton::clicked, this, [=]() {
	//创建柱状形集对象
	QBarSet* set1 = new QBarSet("语文");
	QBarSet* set2 = new QBarSet("数学");
	QBarSet* set3 = new QBarSet("英语");
	*set1 << 130 << 120 << 110 << 97 << 88;
	set2->append({ 148,128,137,98,88 }); 
	set3->append(123);
	set3->append(86);
	set3->append(98);
	set3->append(68);
	set3->append(99);

	set1->setLabelColor(Qt::red);
	set2->setLabelColor(Qt::green);
	set3->setLabelColor(Qt::blue);

	//QBarSet封装为QStackedBarSeries 
	//QBarSet类型封装成QStackedBarSeries类型,是因为chart->append不能接收QBarSet的类型。
	QStackedBarSeries *bar1 = new QStackedBarSeries();
	bar1->append(set1);
	QStackedBarSeries *bar2 = new QStackedBarSeries();
	bar2->append(set2);
	QStackedBarSeries *bar3 = new QStackedBarSeries();
	bar3->append(set3);

	//QChart
	QChart* chart = new QChart();
	chart->addSeries(bar1);
	chart->addSeries(bar2);
	chart->addSeries(bar3);
	//创建QChartView 对象显示图表
	QChartView * chartview = new QChartView(chart, ui.tab_3);
	//创建X轴
		QBarCategoryAxis *axisX = new QBarCategoryAxis();
		QStringList list = { "小张","王五","晓明" ,"小红" ,"小绿" };
		axisX->append(list);
		axisX->setTitleText("姓名");
		axisX->setGridLineVisible(false);
		
		//创建Y轴
		QValueAxis *axisY = new QValueAxis();
		axisY->setTitleText("成绩");
		axisY->setRange(0, 150);//设置范围
		axisY->setTickCount(6); //设置tickCount 即标签数量为6 150进行5等分 6个标签 
	
		//设定坐标轴与数据对应
		chart->setAxisX(axisX, bar1);
		chart->setAxisX(axisX, bar2);
        chart->setAxisX(axisX, bar3);
	
		chart->setAxisY(axisY, bar1);
		chart->setAxisY(axisY, bar2);
		chart->setAxisY(axisY, bar3);
	
		//显示窗口、
		QMainWindow *win = new QMainWindow(ui.tab_3);
		win->setCentralWidget(chartview);
		win->resize(800, 600);
		win->setWindowTitle("Test_柱状图");
		win->show();
	
	});

4.5 饼状图

        该代码中实践饼状图的基本绘制方法和图形属性的设置,设置opengl加速绘制以及chartview的grap抓取保存图片的方法对比QScreen的截屏效果。

connect(ui.pushButton_bingzhuang, &QPushButton::clicked, this, [=]() {
		QChartView*view = new QChartView(ui.tab_3);
		view->setRenderHint(QPainter::Antialiasing);
		QChart* chart = new QChart();
		chart->setTitle("成绩分布");
		view->setChart(chart);

		//设置饼图
		QPieSeries*pie = new QPieSeries;
		QPieSlice* s1 = pie->append("60分以下",20);
		QPieSlice* s2 = pie->append("60-80分", 30);
		QPieSlice* s3 = pie->append("60-90分", 30);
		QPieSlice* s4 = pie->append("90-100分", 20);
		s4->setExploded(true);//设置此分块突出
		
		pie->setHoleSize(0.4);// 设置饼状图中间洞大小 0.0-1.0之间
		pie->setLabelsPosition(QPieSlice::LabelOutside);//设置slice label的位置
		pie->setLabelsVisible(true);
		pie->setUseOpenGL(true);//使用OpenGl来画 GPU 并行不卡顿 QAbstractSeries方法
		//字体
		QFont font = qApp->font();
		font.setBold(true);
		font.setPointSize(20);
		chart->setTitleFont(font);
		//图例
		chart->legend()->setAlignment(Qt::AlignLeft);

		//设置各个模块颜色
		s1->setColor(Qt::red);
		s2->setColor(Qt::blue);
		s3->setColor(Qt::green);
		s4->setColor(Qt::yellow);

		chart->addSeries(pie);
		//设置主题 默认light
		chart->setTheme(QChart::ChartTheme::ChartThemeBlueCerulean);
		//显示窗口、
		QMainWindow *win = new QMainWindow(ui.tab_3);
		win->setCentralWidget(view);
		win->resize(800, 600);
		win->setWindowTitle("Test_饼状图");
		win->show();

		//保存图片 ChartView 自有方式
		QPixmap p = view->grab();//
		QImage image = p.toImage();
		image.save("chart.png");

		//截屏 通过winID
		QScreen *screen=QGuiApplication::primaryScreen();//保留应用程序的主屏幕(最初显示QWindows的屏幕)
		QPixmap pic = screen->grabWindow(view->winId());
		QImage image2 = pic.toImage();
		image2.save("chartPie.png");

	});

 

五、在实际项目中的应用 

        QCharts在实际的项目中可以很好的可视化数据,以多种形式统计可视化程序每日产生的数据,从而多维度的评估项目的运行状况和运维效果等。

       如在交通的停车场场景中对于不同时间尺度可以使用折线图统计车流量(对于商场等常有活动的车场运维更有意义),通过饼状图统计不同支付方式的占比(对于企事业单位学校等固定卡、储值卡、临时卡、ETC等统计更有意义)、通过统计车厂外围不同设备的异常更好的评估运行的稳定性、通过统计每日相机的识别平均置信度评估相机等架设合理性等等。

        业务的评估对于不同场景下的运营状况有直观的反馈,设备 异常、识别率、不同级别的错误报告、内存使用等等的统计对于无人车厂运行的稳定应也有直观的反馈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924294.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

互联网视频推拉流EasyDSS视频直播点播平台视频转码有哪些技术特点和应用?

视频转码本质上是一个先解码再编码的过程。在转码过程中&#xff0c;原始视频码流首先被解码成原始图像数据&#xff0c;然后再根据目标编码标准、分辨率、帧率、码率等参数重新进行编码。这样&#xff0c;转换前后的码流可能遵循相同的视频编码标准&#xff0c;也可能不遵循。…

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…

使用phpStudy小皮面板模拟后端服务器,搭建H5网站运行生产环境

一.下载安装小皮 小皮面板官网下载网址&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; 安装说明&#xff08;特别注意&#xff09; 1. 安装路径不能包含“中文”或者“空格”&#xff0c;否则会报错&#xff08;例如错误提示&#xff1a;Cant cha…

No.1 杀戮尖塔Godot复刻|项目概述|场景设置

项目概述 含有47个脚本文件&#xff0c;包括1185行代码&#xff0c;最长的脚本有111行 Battle Node——战斗节点 start_battle()——开始战斗turn management——管理回合win/lose conditions——识别输赢条件 EnemyHandler——敌人处理程序 enemy turn management——管理…

化工专业如何转软工

在当今数字化时代&#xff0c;跨考软件工程已经成为许多理工科学子的一个重要选择。化工专业的同学有着扎实的理工科基础&#xff0c;尤其是数学功底&#xff0c;这对于转向计算机领域是一个天然的优势。让我们详细探讨如何规划这段跨考之路。 编程语言的选择是入门的第一步。…

《Opencv》基础操作<1>

目录 一、Opencv简介 主要特点&#xff1a; 应用领域&#xff1a; 二、基础操作 1、模块导入 2、图片的读取和显示 &#xff08;1&#xff09;、读取 &#xff08;2&#xff09;、显示 3、 图片的保存 4、获取图像的基本属性 5、图像转灰度图 6、图像的截取 7、图…

论文阅读:A Software Platform for Manipulating theCamera Imaging Pipeline

论文代码开源链接&#xff1a; A Software Platform for Manipulating the Camera Imaging Pipelinehttps://karaimer.github.io/camera-pipeline/摘要&#xff1a;论文提出了一个Pipline软件平台&#xff0c;可以方便地访问相机成像Pipline的每个阶段。该软件允许修改单个模块…

ChatGPT的应用场景:开启无限可能的大门

ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中展现出了广泛的应用潜力。以下是ChatGPT八个最具代表…

音视频-什么是帧,视频为什么要编码

帧就是动画中的一张图片&#xff0c;这相当于电影胶片上的一个镜头&#xff0c;一帧就是一幅静止的画面&#xff0c;连续的帧就形成了我们看到的动画和视频。 但是直接采集后没经过处理的视频&#xff0c;其实是没有办法真正在互联网上进行传输的。以一张1920乘1080的图片为例&…

“蜀道山”高校联合公益赛 Web (部分)

文章目录 奶龙牌WAF海关警察训练平台恶意代码检测器 奶龙牌WAF <?php if ($_SERVER[REQUEST_METHOD] POST && isset($_FILES[upload_file])) {$file $_FILES[upload_file];if ($file[error] UPLOAD_ERR_OK) {$name isset($_GET[name]) ? $_GET[name] : basen…

【JavaEE初阶 — 网络原理】初识网络原理

目录 1. 网络发展史 1.1 独立模式 1.2 网络互连 1.2.1 网络互联的背景 1.2.2 网络互联的定义 1.3 局域网LAN 1.4 广域网WAN 2. 网络通信基础 2.1 IP地址 2.2 端口号 2.3 认识协议 2.4 五元组 2.5 协议分层 2.5.1 分…

Linux的介绍及虚拟机centOS系统的下载与应用

1、什么是Linux Linux 是一种类 Unix 操作系统&#xff0c;它的内核&#xff08;Kernel&#xff09;由 Linus Torvalds 于 1991 年首次发布。作为一个开源、免费的操作系统&#xff0c;Linux 被广泛用于服务器、桌面计算机、嵌入式设备、移动设备等各种场景。 1、操作系统 操…

Leetcode打卡:交替组II

执行结果&#xff1a;通过 题目&#xff1a;3208 交替组II 给你一个整数数组 colors 和一个整数 k &#xff0c;colors表示一个由红色和蓝色瓷砖组成的环&#xff0c;第 i 块瓷砖的颜色为 colors[i] &#xff1a; colors[i] 0 表示第 i 块瓷砖的颜色是 红色 。colors[i] 1 …

【ONE·基础算法 || 动态规划(二)】

总言 主要内容&#xff1a;编程题举例&#xff0c;熟悉理解动态规划类题型&#xff08;子数组、子序列问题&#xff09;。                文章目录 总言5、子数组问题&#xff08;数组中连续的一段&#xff09;5.1、最大子数组和&#xff08;medium&#xff09;5.1.…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

通过抓包,使用frida定位加密位置

首先我们抓取一下我们要测试的app的某一个目标api&#xff0c;通过抓api的包&#xff0c;得到关键字。 例如&#xff1a;关键字&#xff1a;x-sap-ri 我们得到想要的关键字后&#xff0c;通过拦截 类&#xff0c;寻找我们的关键字&#xff0c;及找到发包收包的位置&#xff0c…

MFC图形函数学习12——位图操作函数

位图即后缀为bmp的图形文件&#xff0c;MFC中有专门的函数处理这种格式的图形文件。这些函数只能处理作为MFC资源的bmp图&#xff0c;没有操作文件的功能&#xff0c;受限较多&#xff0c;一般常作为程序窗口界面图片、显示背景图片等用途。有关位图操作的步骤、相关函数等介绍…

钟睒睒的“傲慢与偏见”

文章内容根据网络内容整理形成 最近&#xff0c;钟睒睒关于绿瓶水不适合长期饮用的言论&#xff0c;在网上引起了一番新的热议&#xff0c;让刚平静不久的包装饮用水竞争&#xff0c;再次掀起一阵波澜&#xff0c;同时&#xff0c;其对于企业家直播带货的等系列看法&#xff0c…

比亚迪降价令背后的反思,创新还是压榨?

科技新知 原创作者丨依蔓 编辑丨蕨影 比亚迪要求供应商明年起降价10%&#xff1f; 近日&#xff0c;网传一封有关比亚迪乘用车要求供应商降价的邮件&#xff0c;署名为比亚迪集团执行副总裁、乘用车首席运营官何志奇。 邮件称&#xff0c;2025年市场竞争将更加激烈&#xff0…

自媒体图文视频自动生成软件|03| 页面和结构介绍

代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; 视频图片生成器 一个基于 Python 和 Web 的工具&#xff0c;用于生成带有文字和语音的视频以及图片。支持多种尺寸、…