首页 > 其他分享 >Qt数据分析:图表详解

Qt数据分析:图表详解

时间:2024-07-20 22:29:33浏览次数:13  
标签:数据分析 Qt QChart s1 chart 图表 详解 ay new

0.前置知识

在Qt Charts模块中,QChartViewQChart 是两个密切相关的类,它们共同用于创建和显示图表。以下是它们之间的关系和各自的角色:

  1. QChart

    • QChart 是一个核心类,代表图表本身。它负责管理图表的数据系列(QAbstractSeries 对象)、图表的轴(QValueAxisQCategoryAxis 等)以及其他图表元素。
    • 你可以使用 QChart 来添加数据系列、设置轴、定义图表类型(如折线图、柱状图、饼图等)。
    • QChart 还提供了一些方法来自定义图表的外观和行为,例如设置标题、图例、动画等。
  2. QChartView

    • QChartView 是一个视图类,用于显示 QChart 对象。它是一个 QWidget 的子类,可以像其他Qt控件一样嵌入到用户界面中。
    • QChartView 提供了一个交互式的图表视图,允许用户通过缩放、拖动等操作来查看图表的不同部分。
    • 你可以将 QChart 对象设置为 QChartView 的图表源,从而在视图中显示图表。

关系

  • QChartView 持有一个 QChart 对象的引用,并负责显示这个图表。
  • QChart 包含了图表的所有数据和逻辑,而 QChartView 则提供了一个可视化的界面来展示这些数据。

示例

以下是一个简单的示例,展示如何创建一个图表并将其显示在一个视图中:

#include <QtCharts/QtCharts>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 创建一个图表
    QChart *chart = new QChart();
    chart->setTitle("Sample Chart");
    chart->setAnimationOptions(QChart::AllAnimations); // 启用动画

    // 创建一个数据系列
    QLineSeries *series = new QLineSeries();
    series->append(1, 2);
    series->append(2, 3);
    series->append(3, 5);
    series->append(4, 7);

    // 将数据系列添加到图表
    chart->addSeries(series);

    // 创建一个图表视图
    QChartView *chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing); // 启用反锯齿渲染

    // 显示图表视图
    chartView->show();

    return app.exec();
}

在这个示例中:

  • QChart 对象 chart 被创建并设置了标题和动画选项。
  • QLineSeries 对象 series 被创建并添加了一些数据点。
  • series 被添加到 chart 中。
  • QChartView 对象 chartView 被创建并设置了图表源为 chart
  • chartView 被显示在用户界面中。

通过这种方式,QChartQChartView 共同工作,提供了一个功能强大且易于使用的图表解决方案。

1.曲线图

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 1、创建图表视图对象和图表对象
    QChartView *chartview = new QChartView(this);

    QChart *chart = new QChart(); // 创建图表
    chart->setTitle("图表测试--正弦余弦曲线");

    chartview->setChart(chart); // 将图标添加到图标视图

    this->setCentralWidget(chartview); // 将图表视图展示到窗口中间

    // 2、创建坐标轴
    QValueAxis *ax = new QValueAxis;
    ax->setRange(0,10);

    QValueAxis *ay = new QValueAxis;
    ay->setRange(-2, 2);

    chart->addAxis(ax, Qt::AlignBottom);
    chart->addAxis(ay, Qt::AlignLeft);

    // 3、创建曲线
    QLineSeries *s1 = new QLineSeries();
    QLineSeries *s2 = new QLineSeries();

    s1->setName("正弦曲线");
    s2->setName("余弦曲线");

    // 为曲线添加坐标值
    qreal t = 0, y1,y2,iv=0.1;

    int cnt = 100;
    for (int i = 0; i < cnt; i++)
    {
        y1 = qSin(t);
        s1->append(t,y1);
        y2 = qSin(t+20);
        s2->append(t,y2);

        t = t + iv;
    }

    chart->addSeries(s1);
    chart->addSeries(s2);

    // 4、曲线关联坐标轴

    s1->attachAxis(ax);
    s1->attachAxis(ay);

    s2->attachAxis(ax);
    s2->attachAxis(ay);


    // 移除的方法,为图添加坐标轴,并关联
    // chart->setAxisX(ax, s1);
    // chart->setAxisY(ay, s1);

    // chart->setAxisX(ax, s2);
    // chart->setAxisY(ay, s2);

}

image

2. 折线图

void ZheXian::mySelflinerSeriesFunc()
{
    QChart *ct = new QChart();
    ct->setTitle("折线图");
    ui->graphicsView->setChart(ct);

    // 设置坐标
    QValueAxis *ax = new QValueAxis();
    ax->setTitleText("年份");
    ax->setRange(2017, 2021);
    ax->setTickCount(5);
    ax->setLineVisible(true);
    ax->setGridLineVisible(false);

    QValueAxis *ay = new QValueAxis();
    ay->setTitleText("经费");
    ay->setRange(2000, 10000);
    ay->setTickCount(5);
    ay->setLineVisible(true);
    ay->setGridLineVisible(false);

    ct->addAxis(ax, Qt::AlignBottom);
    ct->addAxis(ay, Qt::AlignLeft);

    // 绘制折线图,设置序列
    QLineSeries *s1 = new QLineSeries();
    s1->setName("中国");
    s1->setColor(QColor(255, 0, 0));
    ct->addSeries(s1);
    s1->attachAxis(ax);
    s1->attachAxis(ay);

    // 添加点
    s1->append(2017, 5000);
    s1->append(2018, 6500);
    s1->append(2019, 4900);
    s1->append(2020, 8000);
    s1->append(2021, 9000);
	
	// 另一种添加数据的方法 
    // *s1 << QPointF(2017, 5000) << QPointF(2018, 6500) << QPointF(2019, 4900) << QPointF(2020, 8000) << QPointF(2021, 9000);
}

image

3. 柱形图

ZhuXingTu::ZhuXingTu(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::ZhuXingTu)
{
    ui->setupUi(this);

    // 1、创建图表
    QChart *ct = new QChart();
    ct->setTitle("柱形图");
    ui->graphicsView->setChart(ct);

    // 2、创建柱形图的值集合
    QBarSet *bar = new QBarSet("bar");
    *bar << 560 << 599 << 688 << 701; // 添加值

    // 3、根据值集合创建柱形
    QStackedBarSeries *s1 = new QStackedBarSeries();
    s1->append(bar);
    ct->addSeries(s1);

    // 4、设置柱形类别 X轴
    QStringList strlist = {"1", "2", "3", "4"};

    QBarCategoryAxis *axValue = new QBarCategoryAxis;
    axValue->append(strlist);
    axValue->setTitleText("姓名");
    axValue->setGridLineVisible(false);

    ct->addAxis(axValue, Qt::AlignBottom);

    QValueAxis *ay = new QValueAxis();
    ay->setRange(0, 750);
    ay->setTitleText("分数");
    ay->setGridLineVisible(false);

    ct->addAxis(ay, Qt::AlignLeft);
}

image

4.饼状图

Bingzhuangtu::Bingzhuangtu(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::Bingzhuangtu)
{
    ui->setupUi(this);

    // 创建图表视图和图表
    QChartView *ctview = new QChartView(this);
    this->setCentralWidget(ctview);

    QChart *ct = new QChart();
    ctview->setChart(ct);

    // 创建饼状图对象 相当于曲线
    QPieSeries *sris = new QPieSeries();

    sris->append("70以下:30%", 30);
    sris->append("70-85:40%", 40);
    sris->append("85-95:25%", 25);
    sris->append("95-100:15%", 15);

    sris->setLabelsVisible();

    // 设置颜色
    QPieSlice *sred = sris->slices().at(0);
    QPieSlice *sgreen = sris->slices().at(1);
    QPieSlice *sblue = sris->slices().at(2);
    QPieSlice *sblack = sris->slices().at(3);

    sred->setColor(QColor(255,0,0,255));
    sgreen->setColor(QColor(0,255,0,255));
    sblue->setColor(QColor(0,0,255,255));
    sblack->setColor(QColor(0,0,0,255));

    ct->addSeries(sris);
    ct->setTitle("饼状图");

}

image

标签:数据分析,Qt,QChart,s1,chart,图表,详解,ay,new
From: https://www.cnblogs.com/xuejx/p/18313518

相关文章

  • Qt项目:基于Qt实现的网络聊天室---好友申请
    文章目录完善ClickedLabel好友申请美化界面本文介绍如何实现好友申请界面,其效果如下图所示在此之前需要先定义一个ClickedOnceLabel类,支持点击一次的label功能。接着新增一个ClickedOnceLabel类classClickedOnceLabel:publicQLabel{Q_OBJECTpublic:......
  • TCP协议详解
    TCP协议是一种传输控制协议,一种面向连接的可靠传输协议。TCP协议建立的链接是双向连接。双向连接:在数据传输之前,收发双方需要预先建立一条逻辑通路。无面向连接。序列号SN确认序列号AN6位标志位(URG、ACK、PSH、RST、SYN、FIN)URG---告诉对方有紧急数据......
  • Redis详解
    Redis(RemoteDictionaryServer)是一种开源的内存数据结构存储系统,作为NoSQL数据库的一种,Redis因其高性能和丰富的数据类型被广泛应用于缓存、会话管理、实时分析等场景。一、Redis简介1.1什么是Redis?Redis是一个开源的、基于内存的数据结构存储系统。它支持多种数据结构,如......
  • HttpHeaders类详解,这一篇就够了
    目录一.总述二.案例展示三.set方法和add方法的区别1.set方法:2.add方法:区别总结:总结一.总述在Java中,HttpHeaders是一个用于表示HTTP请求或响应头的类,它属于java.net.http包,从Java11开始引入。这个类提供了一种方便的方式来操作HTTP消息头,包括添加、删除和获......
  • 【qt】VS中如何配置Qt环境
    https://download.qt.io/official_releases/vsaddin/首先需要下载一下vsaddin,上面的是下载的网站.下载的时候可能会出现下图的情况说明你下的vsaddin和您的VS版本不匹配,所以你可以多下几个其他版本的vsAddin,一般都是和你VS版本相匹配的才可以,如Vs2022,那就试试vsadd......
  • Java 代理模式详解
    Java代理模式详解1.代理模式代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替对真实对象(realobject)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。代理模式的主要作用是扩展目标对象的功能,比如说在目......
  • Android开发 - xmlns命名空间中tools详解
    xmlns:tools是什么命名空间tools可以告诉AndroidStudio,哪些属性在运行的时候是被忽略的,只在设计布局的时候有效。比如我们要让android:text属性只在布局预览中有效。tools可以覆盖android的所有标准属性,将android:换成tools:即可。同时在运行的时候就连tools:本身都是被忽略......
  • 中介者模式详解:概念、优点及实例
    目录中介者模式中介者模式结构中介者模式适用场景中介者模式优缺点练手题目题目描述输入描述输出描述题解中介者模式中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。......
  • C语言-“关系”,“条件”,“逻辑”操作符详解
    目录关系操作符 “==”与“=”的区别 多个关系运算符不宜连用多个关系运算符判断值是否在中间的写法条件操作符逻辑操作符逻辑取反操作符:!逻辑与运算符:&& 逻辑或运算符:||练习:闰年的判断短路 关系操作符c语言用于比较的表达式,称为“关系表达式”(relational......
  • Windows下使用QT+OpenCV完成人脸检测(获取摄像头数据进行检测)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)Windows下使用QT+OpenCV完成人脸检测(获取摄像头数据进行检测)1.简介本文......