Qt数据分析:图表详解

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

posted @ 2024-07-20 22:25  xjx111  阅读(5)  评论(0编辑  收藏  举报