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
英文地址,請注明出處:http://en.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…