import numpy as np
from qtpy.QtWidgets import QFrame
from qtpy.QtGui import QPen, QBrush, QFont, QPainter
from qtpy.QtCore import QSize, Qt
from qwt import QwtSymbol, QwtPlotCurve, QwtPlotItem, QwtScaleMap
from qwt.tests import utils
class CurveDemo1(QFrame):
def __init__(self, *args):
QFrame.__init__(self, *args)
self.xMap = QwtScaleMap()
self.xMap.setScaleInterval(-0.5, 10.5)
self.yMap = QwtScaleMap()
self.yMap.setScaleInterval(-1.1, 1.1)
# frame style
self.setFrameStyle(QFrame.Box | QFrame.Raised)
self.setLineWidth(2)
self.setMidLineWidth(3)
# calculate values
self.x = np.arange(0, 10.0, 10.0 / 27)
self.y = np.sin(self.x) * np.cos(2 * self.x)
# make curves with different styles
self.curves = []
self.titles = []
# curve 1
self.titles.append("Style: Sticks, Symbol: Ellipse")
curve = QwtPlotCurve()
curve.setPen(QPen(Qt.red))
curve.setStyle(QwtPlotCurve.Sticks)
curve.setSymbol(
QwtSymbol(QwtSymbol.Ellipse, QBrush(Qt.yellow), QPen(Qt.blue), QSize(5, 5))
)
self.curves.append(curve)
# curve 2
self.titles.append("Style: Lines, Symbol: None")
curve = QwtPlotCurve()
curve.setPen(QPen(Qt.darkBlue))
curve.setStyle(QwtPlotCurve.Lines)
self.curves.append(curve)
# curve 3
self.titles.append("Style: Lines, Symbol: None, Antialiased")
curve = QwtPlotCurve()
curve.setPen(QPen(Qt.darkBlue))
curve.setStyle(QwtPlotCurve.Lines)
curve.setRenderHint(QwtPlotItem.RenderAntialiased)
self.curves.append(curve)
# curve 4
self.titles.append("Style: Steps, Symbol: None")
curve = QwtPlotCurve()
curve.setPen(QPen(Qt.darkCyan))
curve.setStyle(QwtPlotCurve.Steps)
self.curves.append(curve)
# curve 5
self.titles.append("Style: NoCurve, Symbol: XCross")
curve = QwtPlotCurve()
curve.setStyle(QwtPlotCurve.NoCurve)
curve.setSymbol(
QwtSymbol(QwtSymbol.XCross, QBrush(), QPen(Qt.darkMagenta), QSize(5, 5))
)
self.curves.append(curve)
# attach data, using Numeric
for curve in self.curves:
curve.setData(self.x, self.y)
def shiftDown(self, rect, offset):
rect.translate(0, offset)
def paintEvent(self, event):
QFrame.paintEvent(self, event)
painter = QPainter(self)
painter.setClipRect(self.contentsRect())
self.drawContents(painter)
def drawContents(self, painter):
# draw curves
r = self.contentsRect()
dy = int(r.height() / len(self.curves))
r.setHeight(dy)
for curve in self.curves:
self.xMap.setPaintInterval(r.left(), r.right())
self.yMap.setPaintInterval(r.top(), r.bottom())
painter.setRenderHint(
QPainter.Antialiasing,
curve.testRenderHint(QwtPlotItem.RenderAntialiased),
)
curve.draw(painter, self.xMap, self.yMap, r)
self.shiftDown(r, dy)
# draw titles
r = self.contentsRect()
r.setHeight(dy)
painter.setFont(QFont("Helvetica", 8))
painter.setPen(Qt.black)
for title in self.titles:
painter.drawText(
0,
r.top(),
r.width(),
painter.fontMetrics().height(),
Qt.AlignTop | Qt.AlignHCenter,
title,
)
self.shiftDown(r, dy)
def test_curvedemo1():
"""Curve demo 1"""
utils.test_widget(CurveDemo1, size=(300, 600), options=False)
if __name__ == "__main__":
test_curvedemo1()