Qt:QCustomPlot库的QCPAxis

在 QCustomPlot 中,QCPAxis 是图表坐标系的核心组件,负责管理坐标轴的所有视觉和功能特性。它提供了丰富的定制选项,使开发者能够创建高度专业化的数据可视化图表。

核心功能概述

功能类别关键特性相关方法
基本结构坐标轴位置、方向axisType()setVisible()
范围控制数据范围设置setRange()setRangeReversed()
刻度系统主/副刻度、格式setTicker()setNumberFormat()
标签系统轴标签、刻度标签setLabel()setLabelFont()
网格线主/副网格线grid()setGrid()
视觉定制线条样式、颜色setBasePen()setTickPen()
交互功能缩放、平移setRangeZoom()setRangeDrag()

坐标轴类型与方向

 QCustomPlot 支持四种标准坐标轴类型:

// 获取图表中的坐标轴
QCPAxis *xAxis = customPlot->xAxis; // 底部X轴
QCPAxis *yAxis = customPlot->yAxis; // 左侧Y轴
QCPAxis *xAxis2 = customPlot->xAxis2; // 顶部X轴
QCPAxis *yAxis2 = customPlot->yAxis2; // 右侧Y轴// 坐标轴类型枚举
QCPAxis::AxisType {atLeft = 0,    // 左侧Y轴atRight,       // 右侧Y轴atTop,         // 顶部X轴atBottom       // 底部X轴
}

核心功能详解

1. 范围控制(数据缩放)

// 设置固定范围
xAxis->setRange(0, 100); // X轴从0到100// 自适应范围(基于数据)
customPlot->graph(0)->rescaleAxes();// 设置范围反转(倒序坐标)
yAxis->setRangeReversed(true);// 范围限制
xAxis->setRangeLower(0); // 最小值为0
xAxis->setRangeUpper(100); // 最大值为100

2. 刻度系统

刻度生成器(QCPAxisTicker)
// 使用线性刻度
QSharedPointer<QCPAxisTicker> linearTicker(new QCPAxisTicker);
xAxis->setTicker(linearTicker);// 使用对数刻度
QSharedPointer<QCPAxisTickerLog> logTicker(new QCPAxisTickerLog);
yAxis->setTicker(logTicker);
yAxis->setScaleType(QCPAxis::stLogarithmic);// 自定义刻度
QSharedPointer<QCPAxisTickerText> textTicker(new QCPAxisTickerText);
textTicker->addTick(1, "低");
textTicker->addTick(5, "中");
textTicker->addTick(10, "高");
xAxis->setTicker(textTicker);// 设置刻度密度
linearTicker->setTickCount(5); // 主刻度数量
linearTicker->setTickStepStrategy(QCPAxisTicker::tssReadability); // 优化可读性

3. 标签系统

// 设置坐标轴标签
xAxis->setLabel("时间 (秒)");
yAxis->setLabel("温度 (°C)");// 标签字体和颜色
QFont labelFont("Arial", 12, QFont::Bold);
xAxis->setLabelFont(labelFont);
yAxis->setLabelColor(Qt::blue);// 刻度标签格式
yAxis->setNumberFormat("f"); // 浮点格式
yAxis->setNumberPrecision(1); // 1位小数
xAxis->setDateTimeFormat("hh:mm"); // 时间格式// 标签旋转
xAxis->setTickLabelRotation(45); // 45度旋转

 4. 网格线系统

// 获取网格线对象
QCPGrid *xGrid = xAxis->grid();
QCPGrid *yGrid = yAxis->grid();// 主网格线设置
xGrid->setVisible(true);
xGrid->setPen(QPen(QColor(200, 200, 200), 1, Qt::DotLine));// 副网格线设置
xGrid->setSubGridVisible(true);
xGrid->setSubGridPen(QPen(QColor(220, 220, 220), 1, Qt::DotLine));// 网格线在图层中的位置
xGrid->setLayer("grid"); // 创建专门的网格层

5. 视觉样式定制

// 轴线样式
xAxis->setBasePen(QPen(Qt::black, 2)); // 轴线粗细和颜色// 刻度线样式
xAxis->setTickPen(QPen(Qt::black, 1)); // 刻度线
xAxis->setSubTickPen(QPen(Qt::gray, 0.5)); // 副刻度线// 刻度长度
xAxis->setTickLength(8); // 主刻度长度
xAxis->setSubTickLength(4); // 副刻度长度// 轴线偏移
xAxis->setOffset(10); // 轴线离图表边缘的距离

高级功能

1. 多坐标系系统

// 创建新坐标系
QCPAxisRect *newAxisRect = customPlot->addAxisRect();// 添加新坐标轴
QCPAxis *newXAxis = newAxisRect->axis(QCPAxis::atBottom);
QCPAxis *newYAxis = newAxisRect->axis(QCPAxis::atLeft);// 图表关联到新坐标轴
customPlot->addGraph(newXAxis, newYAxis);// 设置坐标系间距
newAxisRect->setMinimumMargins(QMargins(10, 10, 10, 10));

2. 交互功能

// 启用缩放
customPlot->setInteractions(QCP::iRangeZoom);
xAxis->setRangeZoom(true); // X轴可缩放
yAxis->setRangeZoom(true); // Y轴可缩放// 启用平移
customPlot->setInteractions(QCP::iRangeDrag);
xAxis->setRangeDrag(true); // X轴可拖动
yAxis->setRangeDrag(true); // Y轴可拖动// 缩放方向限制
yAxis->setRangeZoomAxes(nullptr, yAxis2); // 缩放Y轴时同步Y2轴// 缩放比例约束
customPlot->axisRect()->setRangeZoomFactor(1.5); // 每次缩放50%

3. 信号与槽机制

// 范围变化信号
connect(xAxis, SIGNAL(rangeChanged(QCPRange)), this, SLOT(onXRangeChanged(QCPRange)));// 鼠标点击信号
connect(customPlot, &QCustomPlot::axisClick, [=](QCPAxis* axis, QCPAxis::SelectablePart part, QMouseEvent* event) {if (part == QCPAxis::spAxisLabel) {qDebug() << "Clicked on axis label:" << axis->label();}
});

性能优化技巧

批量操作

customPlot->setNotAntialiasedElements(QCP::aeAll); // 禁用抗锯齿
customPlot->setPlottingHint(QCP::phFastPolylines, true); // 快速绘图模式

刻度优化

customPlot->setPlottingHint(QCP::phCacheLabels, true); // 缓存标签

标签缓存

customPlot->setPlottingHint(QCP::phCacheLabels, true); // 缓存标签

部分重绘:

customPlot->replot(QCustomPlot::rpQueuedReplot); // 队列重绘

常见问题解决方案

问题1:坐标轴范围不正确

解决方案:

// 确保正确重置范围
customPlot->graph(0)->rescaleAxes(true); // true表示只缩放该图表的坐标轴// 或者手动设置
double minX, maxX, minY, maxY;
calculateDataRange(minX, maxX, minY, maxY); // 自定义计算函数
xAxis->setRange(minX, maxX);
yAxis->setRange(minY, maxY);

问题2:刻度标签重叠

解决方案:

// 旋转标签
xAxis->setTickLabelRotation(45);// 减少标签数量
QSharedPointer<QCPAxisTicker> ticker(new QCPAxisTicker);
ticker->setTickCount(5);
xAxis->setTicker(ticker);// 使用缩写标签
ticker->setTickLabelFormat("Abbr");

问题3:多坐标轴对齐问题

解决方案:

// 同步坐标轴范围
connect(xAxis, SIGNAL(rangeChanged(QCPRange)), xAxis2, SLOT(setRange(QCPRange)));// 使用相同的刻度
xAxis2->setTicker(xAxis->ticker());

问题4:日期/时间轴显示问题

解决方案:

// 设置时间轴格式
QSharedPointer<QCPAxisTickerDateTime> dateTicker(new QCPAxisTickerDateTime);
dateTicker->setDateTimeFormat("yyyy-MM-dd");
xAxis->setTicker(dateTicker);// 设置时间范围(UNIX时间戳)
xAxis->setRange(QDateTime(QDate(2023, 1, 1).toSecsSinceEpoch(), QDateTime(QDate(2023, 12, 31).toSecsSinceEpoch());

实际应用示例

创建双Y轴图表

// 准备数据
QVector<double> x = {1,2,3,4,5}, y1 = {10,20,30,40,50}, y2 = {0.1,0.5,1.0,1.5,2.0};// 添加图表
customPlot->addGraph();
customPlot->graph(0)->setData(x, y1);
customPlot->addGraph(customPlot->xAxis, customPlot->yAxis2);// 配置第二Y轴
customPlot->yAxis2->setVisible(true);
customPlot->yAxis2->setLabel("副Y轴");
customPlot->yAxis2->setRange(0, 2.5);// 设置不同颜色
customPlot->graph(0)->setPen(QPen(Qt::blue));
customPlot->graph(1)->setPen(QPen(Qt::red));// 自动缩放
customPlot->graph(0)->rescaleAxes();
customPlot->graph(1)->rescaleAxes(true); // 只缩放关联的坐标轴

创建对数坐标轴

// 创建对数刻度
QSharedPointer<QCPAxisTickerLog> logTicker(new QCPAxisTickerLog);
yAxis->setTicker(logTicker);
yAxis->setScaleType(QCPAxis::stLogarithmic);// 设置对数范围
yAxis->setRange(0.1, 1000); // 10^-1 到 10^3// 设置对数标签格式
logTicker->setLogBase(10);
logTicker->setNumberFormat("eb"); // 指数格式

最佳实践

坐标轴命名规范

xAxis->setLabel("Time [s]");
yAxis->setLabel("Temperature [°C]");

刻度优化原则

  • 主刻度数量控制在5-10个

  • 使用可读性优先策略

  • 避免过度密集的刻度

响应式设计

connect(customPlot, &QCustomPlot::afterResize, [=](){if (customPlot->width() < 500) {xAxis->setTickLabelRotation(45);xAxis->setTickLabelFont(QFont("Arial", 8));} else {xAxis->setTickLabelRotation(0);xAxis->setTickLabelFont(QFont("Arial", 10));}
});

性能敏感场景

// 在大量数据更新时
customPlot->setNoAntialiasingOnDrag(true); // 拖动时禁用抗锯齿
customPlot->setReplotTime(20); // 限制重绘频率(ms)

总结

QCPAxis 是 QCustomPlot 中最强大且复杂的组件之一,提供:

  • 精细的视觉控制:全面定制坐标轴外观

  • 灵活的数据表示:支持线性、对数、日期时间等多种刻度

  • 高级交互功能:缩放、平移、点击事件

  • 多坐标系支持:创建复杂的多轴图表

掌握 QCPAxis 的关键功能对于创建专业级的数据可视化应用至关重要。通过合理使用其丰富的API,开发者可以构建从简单的二维图表到复杂的科学可视化等各种类型的数据展示界面。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七天学会SpringCloud分布式微服务——05——OpenFeign

1、OpenFeign实现远程调用 1.1 services.pom引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>1.2 在service-order微服务中新建feign.Product…

大语言模型的通用局限性与全球技术演进

基于行业最新数据修订&#xff08;2025Q2&#xff09; 一、知识截止期&#xff1a;全球模型的进化差异 所有LLM都存在​​知识截止期&#xff08;Knowledge Cut-off&#xff09;​​&#xff0c;即模型训练数据的时间上限。这在技术迭代飞快的软件开发领域尤为致命——2023年后…

常见网络安全威胁和防御措施

网络安全威胁是一种技术风险&#xff0c;会削弱企业网络的防御能力&#xff0c;危及专有数据、关键应用程序和整个 IT 基础设施。由于企业面临广泛的威胁&#xff0c;因此他们应该仔细监控和缓解最关键的威胁和漏洞。网络安全问题有七大类&#xff0c;它们都包括多种威胁&#…

人工智能和云计算对金融未来的影响

你有没有想过&#xff0c;你的钱是否会由人工智能而不是银行来管理&#xff1f;如果你的银行不存在于真实的地方&#xff0c;而是存在于几千公里之外的某台大型超级计算机上&#xff0c;那会怎样&#xff1f;这可能有一天会发生&#xff0c;让我们看看它是如何发生的&#xff0…

Vue3——项目配置eslint+prettier

一、安装依赖 pnpm add -D eslint prettier eslint-plugin-vue vue-eslint-parser typescript-eslint/eslint-plugin typescript-eslint/parser eslint-config-prettier eslint-plugin-prettier typescript-eslint二、创建或修改 eslint.config.cjs // eslint.config.cjs con…

人工智能编程三大核心流程详解--机器学习、神经网络、NLP自然语言处理

对于学习人工智能阶段&#xff0c;代码可以写出来&#xff0c;主要是按照构建流程一步一步&#xff0c;所以本篇博客主要是通过三个大点来介绍&#xff1a;第一个点是机器学习中预测损失值与真实值之间的误差流程&#xff1b;第二点是深度学习中神经网络搭建流程&#xff1b;第…

《AI for Science:深度学习如何重构基础科学的发现范式?》

前言 前些天发现了一个巨牛的人工智能免费学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 AI for Science&#xff1a;深度学习如何重构基础科学的发现范式&#xff1f; 副标题&#xff1a;从费曼图到神经微分方程&…

创客匠人:创始人 IP 打造引领知识变现新路径​

在当下知识经济蓬勃发展的时代&#xff0c;知识变现已成为众多创作者和从业者关注的焦点。创客匠人作为行业内的重要参与者&#xff0c;为创始人 IP 打造与知识变现提供了独特且有效的思路。​ 创始人 IP 打造在知识变现中占据着关键地位。创客匠人认为&#xff0c;一个成功的…

JVM调优实战 Day 7:JVM线程分析与死锁排查

【JVM调优实战 Day 7】JVM线程分析与死锁排查 文章标签 jvm调优, 线程分析, 死锁排查, JVM监控, Java性能优化, JVM参数配置 文章简述 在Java应用的高并发场景中&#xff0c;线程管理与死锁问题往往是性能瓶颈的根源。本文作为“JVM调优实战”系列的第7天&#xff0c;深入解析…

Kotlin中协程挂起函数的本质

一、核心概念&#xff1a;挂起函数的本质 1. 核心定义 挂起函数&#xff08;Suspending Function&#xff09;是 Kotlin 协程的核心机制&#xff0c;它允许函数在执行过程中暂停&#xff08;挂起&#xff09;而不阻塞线程&#xff0c;并在条件满足时恢复执行。 2. 与普通函数…

人工智能中的集成学习:从原理到实战

大家好&#xff01;今天我们来聊聊人工智能领域中一个非常强大的技术——集成学习&#xff08;Ensemble Learning&#xff09;&#x1f60e;。——这个让模型预测能力飙升的“团队合作”神器&#xff01;无论你是刚入门的新手还是想复习的老司机&#xff0c;这篇通俗教程都能帮…

大事件项目记录13-登录优化-redis

一、redis优化登录接口。 原有代码中在修改密码在产生新令牌后并未将旧的令牌主动失效&#xff0c;旧的令牌依然可以使用 &#xff0c;会产生安全隐患&#xff0c;所以需要对其进行优化。 1.令牌主动失效机制。 &#xff08;1&#xff09;登录成功后&#xff0c;给浏览器响应令…

重塑音视频叙事:Premiere文本剪辑与Podcast AI降噪的革命性工作流

一、 开篇的另一些心里话 最近淘到个好东西&#xff0c;是来自奥地利Blueskyy艺术学院的Adobe教育版授权&#xff0c;深度体验下来&#xff0c;感觉就像是给我的创意工具箱做了一次“满配”升级&#xff0c;有些心得不吐不快&#xff0c;必须跟同路的设计师朋友们碰一碰。 在分…

面向隐私保护的机器学习:联邦学习技术解析与应用

在当今数字化时代&#xff0c;数据隐私和安全问题日益受到关注。随着《数据安全法》《个人信息保护法》等法律法规的实施&#xff0c;企业和机构在数据处理和分析过程中面临着越来越严格的合规要求。然而&#xff0c;机器学习模型的训练和优化往往需要大量的数据支持&#xff0…

【软考高项论文】论信息系统项目的质量管理

摘要 在信息系统项目管理里&#xff0c;质量管理是保障项目成果契合预期、满足用户需求与业务目标的关键。本文以 2024 年 6 月启动的一个典型信息系统项目为例&#xff0c;阐述了信息系统项目质量管理的过程&#xff0c;包括质量规划、质量控制和质量保证三个核心活动及其目的…

基于DSP的边缘检测与图像锐化算法研究与实现

摘要&#xff1a;该文围绕基于 DSP 的边缘检测与图像锐化算法展开研究与实现。在边缘检测方面&#xff0c;实现了 Sobel、Roberts 和 Prewitt 三种算子算法。Sobel 算子通过计算水平和垂直方向的梯度并求和来检测边缘&#xff0c;对噪声有一定抑制能力&#xff1b;Roberts 算子…

概率概率密度

我之前一直很纠结为什么离散型随机变量分布律中有随机变量的出现&#xff0c;而连续型随机变量概率密度中没有随机变量的出现。那对于连续型随机变量而言&#xff0c;如何建立随机变量和取值之间的联系。也就是说看到连续型随机变量的概率密度&#xff0c;我怎么知道描述的是哪…

Android 中 使用 ProgressBar 实现进度显示

在 Android 中,ProgressBar 是一个用于显示进度的控件,通常用于表示任务的完成进度或加载状态。ProgressBar 有多种样式,包括水平进度条、圆形进度条等。 1、常见属性 android:id 用于在代码中引用该ProgressBar。android:layout_width 和 android:layout_height 定义Progr…

Prompt:面向目标的提示词

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 1 引言2 理解”目标驱动“提示词2.1 从”引导“到…

04_MySQL 通过 Docker 在同一个服务器上搭建主从集群(一主一从)

04_MySQL 通过 Docker 在同一个服务器上搭建主从集群&#xff08;一主一从&#xff09; &#x1f9f0; 准备工作 1. 拉取 MySQL 镜像 docker pull mysql:8.0.262. 创建主从配置目录 mkdir -p /root/mysql/master/conf mkdir -p /root/mysql/master/data mkdir -p /root/mysq…