Russian Qt Forum
Апрель 25, 2024, 21:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QCustomPlot отдельный график со своей осью  (Прочитано 6471 раз)
klio
Гость
« : Декабрь 12, 2014, 12:14 »

Работаю с QCustomPlot над кодом который должен выводить данные по нескольким временным рядам. Все мои временные ряды имеют одну общую ось времени - X (ну и не удивительно xD), но разные величины измерения. В моём случае это давление и температура. Но пока я работаю только с простым примером: у меня есть два почти одинаковых графика каждый из которых должен быть привязан к одной к общей оси X и каждый к своей собственной оси Y. Если бы графики не нужно было масштабировать то всё было бы уже готово:

Но с ними нужно работать. И если с осью X всё путём:

То ось Y никак не реагирует на то что я пытаюсь перемещаться вертикально по сетке и график остаётся всегда на одной высоте:

Собственно вопрос. Как с этим бороться имея на руках следующий код:
Код:
    QCustomPlot * plot = new QCustomPlot;

    QVector<double> x1, y1;
    QVector<double> x2, y2;
    for(int i = 0; i < 50; ++i) {
        if(i == 0) {
            x1.push_back(i);
            y1.push_back(i * i + i + 1);
        } else {
            x1.push_back(i);
            y1.push_back(i * i + i + 1);
            x1.push_front(-x1.back());
            y1.push_front(y1.back());
        }
    }

    for(int i = 0; i < 50; ++i) {
        if(i == 0) {
            x2.push_back(i);
            y2.push_back(i * i + i + 1);
        } else {
            x2.push_back(i);
            y2.push_back(i * i + i + 1);
            x2.push_front(-x2.back());
            y2.push_front(-y2.back());
        }
    }

    plot->plotLayout()->clear();

    QCPAxisRect * wideAxisRect = new QCPAxisRect(plot);
    wideAxisRect->setupFullAxesBox(true);
    wideAxisRect->axis(QCPAxis::atRight, 0)->setTickLabels(true);
    wideAxisRect->addAxis(QCPAxis::atLeft)->setTickLabelColor  (QColor (  0,255,  0));

    plot->plotLayout()->addElement(0, 0, wideAxisRect);

    QCPMarginGroup *marginGroup = new QCPMarginGroup(plot);
    wideAxisRect->setMarginGroup(QCP::msLeft | QCP::msRight, marginGroup);

    QCPGraph *mainGraph1 = plot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft));
    mainGraph1->setData(x1, y1);
    mainGraph1->setPen(QPen(QColor(00,  00,  00), 1));
    mainGraph1->rescaleAxes();

    QCPGraph *mainGraph2 = plot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft, 1));
    mainGraph2->setData(x1, y2);
    mainGraph2->setPen(QPen(QColor(00,  255,  00), 1));
    mainGraph2->rescaleAxes();

    plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables | QCP::iMultiSelect );
    plot->replot();
На код сильно не ругайтесь. Это пока ещё только черновик что бы проверить алгоритм.
Немного комментариев по коду:
Код:
    plot->plotLayout()->clear();
выкинул стандартную заготовку для осей. в конце концов для меня было удобнее описать свои оси и работать с ними, но пока ещё не разобрался во всех деталях того как с ними нужно работать, поэтому здесь только подготавливаю почву к дальнейшей работе, а для добавления своих осей использую стандартные заготовки:
Код:
    QCPAxisRect * wideAxisRect = new QCPAxisRect(plot);
    wideAxisRect->setupFullAxesBox(true);
тут помещаю первый график и он работает:
Код:
    QCPGraph *mainGraph1 = plot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft));
    mainGraph1->setData(x1, y1);
здесь помещаю второй график и связываю его с нестандартной осью:
Код:
    QCPGraph *mainGraph2 = plot->addGraph(wideAxisRect->axis(QCPAxis::atBottom), wideAxisRect->axis(QCPAxis::atLeft, 1));
    mainGraph2->setData(x1, y2);
и этот код уже не работает. судя по всему из-за этого: wideAxisRect->axis(QCPAxis::atLeft, 1). как я понимаю QCP не отправляет на axis(QCPAxis::atLeft, 1) сообщение о том, что она должна быть перерисована. я конечно могу ошибаться в этом моменте, но по логике должно быть так. вообщем сейчас я хочу прояснить что же я сделал не так? или, может, я чего-то просто не сделал? нужно как то заставить это работать.

спасибо за внимание. надеюсь на вашу помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.044 секунд. Запросов: 20.