QCustomPlot-绘制X轴为日期的折线图

news2025/2/24 6:48:21

主要代码如下:

void Widget::InitQLineXDateAddData()
{
    customPlot = new QCustomPlot(this);

    // 创建日期时间类型的刻度生成器
    QSharedPointer<QCPAxisTickerDateTime> dateTimeTicker(new QCPAxisTickerDateTime);
    dateTimeTicker->setDateTimeFormat("yyyy-MM-dd"); // 设置日期时间格式
    //dateTimeTicker->setTickCount(8);
    // 将刻度生成器应用到 X 轴
    customPlot->xAxis->setTicker(dateTimeTicker);
    customPlot->xAxis->setTickLabelRotation(45); // 设置刻度标签旋转角度,以便更好地显示

    // 设置 X 轴的范围(使用 QDateTime 转换为键)
    QDateTime startDateTime = QDateTime(QDate(2024, 3, 13), QTime(0, 0, 0), Qt::UTC);
    QDateTime endDateTime = QDateTime(QDate(2024, 3, 20), QTime(0, 0, 0), Qt::UTC); 
    // 计算日期范围内的天数,并设置为刻度数量
   int numDays = startDateTime.daysTo(endDateTime) + 1; // 包括开始和结束日期
   dateTimeTicker->setTickCount(numDays);

    // 将 QDateTime 转换为自 Unix 纪元以来的秒数
    double startKey = startDateTime.toMSecsSinceEpoch() / 1000.0;
    double endKey = endDateTime.toMSecsSinceEpoch() / 1000.0;
    customPlot->xAxis->setRange(QCPRange(startKey, endKey));


    // 添加并设置两个图形的pen
    QCPGraph *graph1 = customPlot->addGraph();
    graph1->setPen(QPen(Qt::blue));
    QCPGraph *graph2 = customPlot->addGraph();
    graph2->setPen(QPen(Qt::red));


    // 设置图例
    customPlot->legend->setVisible(true);
    graph1->setName("A产品");
    graph2->setName("B产品");
    customPlot->axisRect()->insetLayout()->setInsetAlignment(0,Qt::AlignBottom|Qt::AlignRight);
    graph1->setLineStyle(QCPGraph::lsLine); // 实线
    graph1->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, QColor(Qt::blue), 6)); // 圆形散点

    graph2->setLineStyle(QCPGraph::lsLine); // 实线
    graph2->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 6)); // 圆形散点

    QVector<double> keys1;
    int numValues = 6; // 要生成的值的数量

    for (int i = 0; i < numValues; ++i ) {
        keys1.push_back(startKey + i * 86400);
    }
    QVector<double> values1 = {100, 300, 500, 800, 900, 800};


    QVector<double> keys2 = {startKey, startKey + 86400, startKey + 2 * 86400, startKey + 3 * 86400, startKey + 4 * 86400, startKey + 5 * 86400};
    QVector<double> values2 = {100, 200, 400, 900, 1100, 600};

    // 设置数据并显示图表
    graph1->setData(keys1, values1);
    graph2->setData(keys2, values2);

    // 设置数据点标签显示
    for (int i = 0; i < keys1.size(); ++i) {
        QCPItemText *textItem = new QCPItemText(customPlot);
        //textItem->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);

        textItem->setPositionAlignment( Qt::AlignBottom | Qt::AlignHCenter);

        textItem->position->setType(QCPItemPosition::ptPlotCoords);
        textItem->position->setCoords(keys1[i], values1[i]);
        textItem->setText(QString::number(values1[i]));
        textItem->setFont(QFont(font().family(), 10)); // Set font size as needed
        //textItem->setPen(QPen(Qt::blue)); // Set text color

        textItem->setPen(Qt::NoPen); // Set no pen (remove border)
        textItem->setBrush(QBrush(Qt::transparent)); // Set transparent brush to hide the background

    }


    // 设置数据点标签显示
    for (int i = 0; i < keys1.size(); ++i) {
        QCPItemText *textItem = new QCPItemText(customPlot);
        //textItem->setPositionAlignment(Qt::AlignTop | Qt::AlignHCenter);

        textItem->setPositionAlignment( Qt::AlignBottom | Qt::AlignHCenter);

        textItem->position->setType(QCPItemPosition::ptPlotCoords);
        textItem->position->setCoords(keys1[i], values2[i]);
        textItem->setText(QString::number(values2[i]));
        textItem->setFont(QFont(font().family(), 10)); // Set font size as needed
        //textItem->setPen(QPen(Qt::blue)); // Set text color

        textItem->setPen(Qt::NoPen); // Set no pen (remove border)
        textItem->setBrush(QBrush(Qt::transparent)); // Set transparent brush to hide the background

    }


    // 整个折线图标题
    QCPTextElement* PlotTitle = new QCPTextElement(customPlot, "折线图统计分析-近5天对比");
    //PlotTitle->setPositionAlignment(Qt::AlignCenter);

    PlotTitle->setFont(QFont("宋体", 12, QFont::Bold)); // 设置标题的字体


    customPlot->plotLayout()->insertRow(0); // 在图表布局中插入一行
    customPlot->plotLayout()->addElement(0, 0, PlotTitle); // 将标题添加到插入的行


    // 设置Y轴范围为0-2000
    customPlot->yAxis->setRange(0, 2000);
    customPlot->yAxis->ticker()->setTickCount(10);

    customPlot->setGeometry(QRect(10,20,700,600));


    // 自动调整坐标轴范围以适应数据,并重新绘制图表
    //customPlot->rescaleAxes();
    customPlot->replot();


    QVBoxLayout* pVBoxLayout = new QVBoxLayout(this);
    pVBoxLayout->addWidget(customPlot);

}

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

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

相关文章

基于python+vue智慧社区家政服务系统的设计与实现flask-django-nodejs

论文主要是对智慧社区家政服务系统进行了介绍&#xff0c;包括研究的现状&#xff0c;还有涉及的开发背景&#xff0c;然后还对系统的设计目标进行了论述&#xff0c;还有系统的需求&#xff0c;以及整个的设计方案&#xff0c;对系统的设计以及实现&#xff0c;也都论述的比较…

Kotlin进阶之协程从专家到出家

公众号「稀有猿诉」 原文链接 Kotlin进阶之协程从专家到出家 协程Coroutine是一种轻量级的实现异步的方式&#xff0c;是代码执行的控制框架&#xff0c;是最新式的并发编程范式。它在使用上大大简化了以往多线程并发带来的种种麻烦&#xff08;如状态同步和锁&#xff…

1-postgresql数据库高可用脚本详解

问题&#xff1a; pgrep -f postgres > /dev/null && echo 0 || pkill keepalived 这是什么意思 建议换成 pgrep -f postmaster > /dev/null && echo 0 || pkill keepalived 回答 这条命令是一个复合命令&#xff0c;包含条件执行和重定向的元素。让我们…

Docker部署dart-frog服务

参考&#xff1a; dart-frog官网&#xff1a;https://dartfrog.vgv.dev/docs/overview 使用 Dart Frog 体验 Dart 服务端开发 - 简书 打包项目 按照demo新增项目后&#xff0c;执行&#xff1a; dart_frog build 等待build后生成 build 文件夹&#xff0c;这个文件夹就是需要…

体验函数式组件简单实现Loading 加载(造轮子篇)

一、前言 最近想着优化一下网站&#xff0c;在文章列表页加一个Loading操作&#xff0c;于是就想到了函数式组件&#xff0c;于是本章就来和大家一起简单探讨下实现思路。 二、Loading设计 这里我想实现的效果是&#xff1a;当我们刷新页面的时候&#xff0c;前端请求接口&…

Linux 建立链接(ln)

目录 1、ln命令 创建软链接&#xff1a; 创建硬链接&#xff1a; 2、输出重定向&#xff08;>/>>&#xff09; 3、管道&#xff08;|&#xff09; 1、ln命令 &#xff08;英文全拼&#xff1a;link files&#xff09;为某一个文件在另外一个位置建立一个同步的…

R语言:ggplot2做柱状图,随机生成颜色。

#加载包 > library(ggplot2) > library(tidyverse) > library(openxlsx) > library(reshape2) > library(RColorBrewer) > library(randomcoloR) > library(viridis) > set.seed(1233) #设立种子数。 > palette <- distinctColorPalette(30) …

python爬取微博话题、关键词下方的所有帖子

文章目录 github repository项目介绍输出安装必备库获取cookiegithub repository 网址:https://github.com/dataabc/weibo-search 在GitHub获取到的非常成熟的微博话题、关键词等微博帖子的获取方案,并且可以指定一个或多个关键词,指定获取微博类型,指定获取日期等等。 项…

GIS学习

匹配查询,先连接两个表,然后在一个表里面查询 合并两个形状 比较好的colormap http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html https://docs.gmt-china.org/latest/cpt/builtin-cpt/ 计算坡度时就要捕捉栅格 重分类时也要捕捉栅格 掩膜提取时也要捕…

详细教---用Django封装写好的模型

本次我们要用自己写好的热销词条爬虫代码来演示如何用Django把我们写好的模型封装。 第一步&#xff1a;代码准备 热搜词条搜集代码&#xff1a; import requests from lxml import etreeurl "https://tophub.today/n/KqndgxeLl9" headers{User-Agent: Mozilla/5.…

Linux--如何在Linux上运行一个helloworld

一.安装vim和gcc sudo --是进入管理员模式 apt --是 Advanced Package Tool&#xff08;高级软件包工具&#xff09;的缩写&#xff0c;这是用于管理软件包的一种工具。 install --是安装的意思 后面跟软件的名称 完整的意思&#xff1a;在管理员的模式下安装 某个软件 …

自动驾驶决策 - 规划 - 控制 (持续更新!!!)

总目录 Frenet与Cartesian坐标系 Apollo基础 - Frenet坐标系 车辆模型 车辆运动学和动力学模型 控制算法 PID控制器轨迹跟随实现 Pure Pursuit控制器路径跟随 路径跟踪算法Stanley 实现 c 无人驾驶LQR控制算法 c 实现 MPC自动驾驶横向控制算法实现 c 双环PID控制详细讲解 …

安防监控视频汇聚平台EasyCVR v3.5播放HTTP-FMP4出现卡顿跳帧是什么原因?

AI视频智能分析/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff08;专网、内网、局域网、广域网、公网等&#xff09;&#xff0c;支持设备通过4G、5G、WIFI、有线等方式接入&#xff0c;并将设备进行统一集中接入与视频汇聚管理&#xff0c;经平台接入的视频流能实现多…

推荐4个c++进度条开源库

在C中&#xff0c;有许多开源库可以帮助你创建进度条。以下是一些常用的C进度条库&#xff1a; 1. **indicators**: - GitHub链接: [https://github.com/p-ranav/indicators](https://github.com/p-ranav/indicators) - 特点: 轻量级&#xff0c;易于使用&#xff0c;支…

【Super数据结构】线性表中的顺序表VS链表,谁才是最强赢家?

&#x1f3e0;关于此专栏&#xff1a;Super数据结构专栏将使用C/C语言介绍顺序表、链表、栈、队列等数据结构&#xff0c;每篇博文会使用尽可能多的代码片段图片的方式。 &#x1f6aa;归属专栏&#xff1a;Super数据结构 &#x1f3af;每日努力一点点&#xff0c;技术累计看得…

3月19日做题

[NPUCTF2020]验证&#x1f40e; if (first && second && first.length second.length && first!second && md5(firstkeys[0]) md5(secondkeys[0]))用数组绕过first1&second[1] 这里正则规律过滤位(Math.) (?:Math(?:\.\w)?) : 匹配 …

14|CAMEL:通过角色扮演脑暴一个鲜花营销方案

能否让 ChatGPT 自己生成这些引导文本呢&#xff1f; CAMEL 交流式代理框架 CAMEL 框架旨在通过角色扮演来促进交流代理之间的自主合作&#xff0c;并为其“认知”过程提供洞察。这种方法涉及使用启示式提示来指导聊天代理完成任务&#xff0c;同时保持与人类意图的一致性。…

哈尔滨工业大学 《材料物理》 笔记-3

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 量…

Linux下安装Android Studio及创建桌面快捷方式

下载 官网地址&#xff1a;https://developer.android.com/studio?hlzh-cn点击下载最新版本即可 安装 将下载完成后文件&#xff0c;进行解压&#xff0c;然后进入android-studio-2023.2.1.23-linux/android-studio/bin目录下&#xff0c;启动studio.sh即可为了更加方便的使…

nfs介绍与配置

NFS 1. nfs简介 nfs特点 NFS&#xff08;Network File System&#xff09;即网络文件系统&#xff0c;是FreeBSD支持的文件系统中的一种&#xff0c;它允许网络中的计算机之间通过TCP/IP网络共享资源在NFS的应用中&#xff0c;本地NFS的客户端应用可以透明地读写位于远端NFS服…