Работаю с QCustomPlot над кодом который должен выводить данные по нескольким временным рядам. Все мои временные ряды имеют одну общую ось времени - X (ну и не удивительно xD), но разные величины измерения. В моём случае это давление и температура. Но пока я работаю только с простым примером: у меня есть два почти одинаковых графика каждый из которых должен быть привязан к одной к общей оси X и каждый к своей собственной оси Y. Если бы графики не нужно было масштабировать то всё было бы уже готово:
(http://s013.radikal.ru/i322/1412/0d/f950592e8005.png)
Но с ними нужно работать. И если с осью X всё путём:
(http://s61.radikal.ru/i171/1412/90/035ad4c6f588.png)
То ось Y никак не реагирует на то что я пытаюсь перемещаться вертикально по сетке и график остаётся всегда на одной высоте:
(http://s019.radikal.ru/i623/1412/90/291feae4d2d2.png)
Собственно вопрос. Как с этим бороться имея на руках следующий код:
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) сообщение о том, что она должна быть перерисована. я конечно могу ошибаться в этом моменте, но по логике должно быть так. вообщем сейчас я хочу прояснить что же я сделал не так? или, может, я чего-то просто не сделал? нужно как то заставить это работать.
спасибо за внимание. надеюсь на вашу помощь.