#plot #axis #qwt
#график #ось #qwt
Вопрос:
Я хочу создать график с двумя горизонтальными осями. Нижняя ось линейна, верхняя ось нелинейна. У меня есть таблица данных для преобразования «Нижнее значение -> верхнее значение». Я узнал, что QwtScaleEngine предоставляет эту функциональность. Но я не могу заставить это работать, потому что слишком много плохо документированных функций для определения в подклассах QwtScaleEngine и QwtScaleDiv.
Есть предложения?
Ответ №1:
Вы хотите, чтобы две горизонтальные оси эффективно накладывали друг на друга два графика, которые разделяют ось, или просто предоставляли дополнительное представление (например, другую единицу измерения) первой горизонтальной оси? Возможно, это не так уж важно, я просто пытаюсь понять вашу проблему.
Я бы сначала рекомендовал вам взглянуть на QwtPlot::updateAxes()
документацию. Это лучшее описание взаимосвязи между графиком, механизмами масштабирования и делениями масштаба, которое я нашел в официальной документации Qwt. Хотя я не думаю, что Qwt плохо документирован, я думаю, что ему не хватает высокоуровневого описания концепций.
QwtScaleDiv я рассматриваю скорее как тип контейнера, содержащий границы оси и, возможно, значения тиков. Я не вижу, что вам необходимо создать подкласс QwtScaleDiv.
Вы правы, что QwtScaleEngine
участвует в этом преобразовании, но в нем есть немного больше, по крайней мере, в Qwt 6.1.0. QwtScaleEngine
поддерживает концепцию преобразования ( QwtTransform
) с помощью setTransformation(). Если ваше преобразование представляет собой простую математическую функцию, такую как логарифмическая, экспоненциальная, квадратичная, кубическая функция и т.д., Вы должны иметь возможность использовать QwtPowerTransform или QwtLogTransform
. Если они неприменимы, вы можете реализовать свои собственные QwtTransform
и назначить их QwtScaleEngine
. Насколько я знаю, преобразование должно быть двусторонним, что означает реализацию обоих transform
и invTransform
. По моему опыту, он также должен преобразовывать значения для всех элементов графика, связанных с осью, с которой связан механизм масштабирования, включая линии сетки, зоны и т.д. Я не пробовал использовать преобразования в других механизмах масштабирования, отличных от стандартных QwtLinearScaleEngine
, но это отлично сработало. Это мощная концепция. Кроме того, взгляните на пример scaleengine в SVN playground (6.1.0).