LINUX.ORG.RU

Как можно построить 3 графика с одной осью 'X' и разными осями 'Y', Y1, Y2, Y3 все Y в разных маштабах

 


0

1

Как можно построить 3 графика с одной осью X? Чтобы сетка была едина. Накидал пример:


    QApplication a(argc, argv);

    // Создаем сцену
    QGraphicsScene *scene = new QGraphicsScene();

    // Создаем графики (QChart)
    QChart *chart1 = new QChart();
    chart1->setTitle("График 1");

    QChart *chart2 = new QChart();
    chart2->setTitle("График 2");

    QChart *chart3 = new QChart();
    chart3->setTitle("График 3");

    // Создаем линейные серии данных (QLineSeries) для каждого графика
    QLineSeries *series1 = new QLineSeries();
    series1->setName("Линия 1");
    *series1 << QPointF(0, 6) << QPointF(2, 4) << QPointF(3, 8) << QPointF(7, 4) << QPointF(10, 5);
    chart1->addSeries(series1);

    QLineSeries *series2 = new QLineSeries();
    series2->setName("Линия 2");
    *series2 << QPointF(0, 5) << QPointF(2, 7) << QPointF(3, 6) << QPointF(7, 3) << QPointF(10, 8);
    chart2->addSeries(series2);

    QLineSeries *series3 = new QLineSeries();
    series3->setName("Линия 3");
    *series3 << QPointF(0, 3) << QPointF(2, 5) << QPointF(3, 4) << QPointF(7, 2) << QPointF(10, 6);
    chart3->addSeries(series3);

    // Создаем общую ось X
    QValueAxis *axisX = new QValueAxis();
    axisX->setTitleText("Ось X");
    axisX->setLabelFormat("%i");
    axisX->setTickCount(11);

    QValueAxis *axisX1 = new QValueAxis();
    axisX1->setTitleText("Ось X");
    axisX1->setLabelFormat("%i");
    axisX1->setTickCount(11);

    QValueAxis *axisX2 = new QValueAxis();
    axisX2->setTitleText("Ось X");
    axisX2->setLabelFormat("%i");
    axisX2->setTickCount(11);

    // Создаем отдельные оси Y для каждого графика
    QValueAxis *axisY1 = new QValueAxis();
    axisY1->setTitleText("Ось Y1");
    axisY1->setLabelFormat("%i");
    axisY1->setTickCount(6);
    chart1->addAxis(axisY1, Qt::AlignLeft);
    series1->attachAxis(axisY1);

    QValueAxis *axisY2 = new QValueAxis();
    axisY2->setTitleText("Ось Y2");
    axisY2->setLabelFormat("%i");
    axisY2->setTickCount(6);
    chart2->addAxis(axisY2, Qt::AlignLeft);
    series2->attachAxis(axisY2);

    QValueAxis *axisY3 = new QValueAxis();
    axisY3->setTitleText("Ось Y3");
    axisY3->setLabelFormat("%i");
    axisY3->setTickCount(6);
    chart3->addAxis(axisY3, Qt::AlignLeft);
    series3->attachAxis(axisY3);

    // Подключаем общую ось X ко всем графикам
    chart1->addAxis(axisX, Qt::AlignBottom);
    series1->attachAxis(axisX);

    chart2->addAxis(axisX1, Qt::AlignBottom);
    series2->attachAxis(axisX1);

    chart3->addAxis(axisX2, Qt::AlignBottom);
    series3->attachAxis(axisX2);

    // Создаем виджеты для отображения графиков
    QChartView *chartView1 = new QChartView(chart1);
    QChartView *chartView2 = new QChartView(chart2);
    QChartView *chartView3 = new QChartView(chart3);

    chartView1->setRenderHint(QPainter::Antialiasing);
    chartView2->setRenderHint(QPainter::Antialiasing);
    chartView3->setRenderHint(QPainter::Antialiasing);

    // Добавляем графики на сцену
    scene->addWidget(chartView1);
    scene->addWidget(chartView2);
    scene->addWidget(chartView3);

    // Создаем представление для сцены и отображаем его
    QGraphicsView *view = new QGraphicsView(scene);
    view->setWindowTitle("Пример 3 графиков с одной осью X");
    view->resize(800, 600);
    view->show();

Я так понял, у этих всех систем координат будет одна ось X, но также — и одно начало координат. Тогда можно попробовать такие варианты:

  • Ось Y2, Y3 будут наклонены к оси X не под прямым углом, а под каким-то другим углом, то есть это будут непрямоугольные системы координат. К тому же, это будет всё в одной плоскости, надо будет применять векторный метод или что-то в этом роде, чтобы строить графики в таких системах. Потом, при необходимости надо будет раскрашивать эти оси Yn в разные цвета, как и точки на графиках, чтобы не было перемешивания разных системах координат на одной и той же двумерной плоскости.
  • Можно и сделать оси Y2 и Y3 также под прямым углом, но не в плоскости xOy1, а чтобы плоскости xOy2 и xOy3 были под неким, не обязательно прямым, углом к xOy1 в трехмерном пространстве и пересекались с ней по оси X.
Infra_HDC ★★★★★
()