1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
# This Python file uses the following encoding: utf-8
"""
This example demonstrates how to makes your plotDataItem glow.
This is strongly inspired by this repository:
https://github.com/dhaitz/mplcyberpunk
"""
from pyqtgraph.Qt import QtGui, QtWidgets
import numpy as np
import pyqtgraph as pg
# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)
app = pg.mkQApp("Glow Example")
# Dedicated colors which look "good"
colors = ['#08F7FE', '#FE53BB', '#F5D300', '#00ff41', '#FF0000', '#9467bd', ]
# We create the ParameterTree
children = [
dict(name='make_line_glow', type='bool', value=False),
dict(name='add_underglow', type='list', limits=['None', 'Full', 'Gradient'], value='None'),
dict(name='nb_lines', type='int', limits=[1, 6], value=1),
dict(name='nb glow lines', type='int', limits=[0, 15], value=10),
dict(name='alpha_start', type='int', limits=[0, 255], value=25, step=1),
dict(name='alpha_stop', type='int', limits=[0, 255], value=25, step=1),
dict(name='alpha_underglow', type='int', limits=[0, 255], value=25, step=1),
dict(name='linewidth_start', type='float', limits=[0.1, 50], value=1, step=0.1),
dict(name='linewidth_stop', type='float', limits=[0.2, 50], value=8, step=0.1),
]
params = pg.parametertree.Parameter.create(name='Parameters', type='group', children=children)
pt = pg.parametertree.ParameterTree(showHeader=False)
pt.setParameters(params)
pw2 = pg.PlotWidget()
splitter = QtWidgets.QSplitter()
splitter.addWidget(pt)
splitter.addWidget(pw2)
splitter.show()
# Add some noise on the curves
noise = 0.1
noises: list = np.random.rand(6, 100)*noise
def update_plot():
pw2.clear()
nb_glow_lines = params.child('nb glow lines').value()
alpha_start = params.child('alpha_start').value()
alpha_stop = params.child('alpha_stop').value()
alpha_underglow = params.child('alpha_underglow').value()
linewidth_start = params.child('linewidth_start').value()
linewidth_stop = params.child('linewidth_stop').value()
nb_lines = params.child('nb_lines').value()
xs = []
ys = []
for i in range(nb_lines):
xs.append(np.linspace(0, 2*np.pi, 100)-i)
ys.append(np.sin(xs[-1])*xs[-1]-i/3+noises[i])
# For each line we:
# 1. Add a PlotDataItem with the pen and brush corresponding to the line
# color and the underglow
# 2. Add nb_glow_lines PlotDatamItem with increasing width and low alpha
# to create the glow effect
for color, x, y in zip(colors, xs, ys):
pen = pg.mkPen(color=color)
if params.child('add_underglow').value()=='Full':
kw={'fillLevel' : 0.0,
'fillBrush' : pg.mkBrush(color='{}{:02x}'.format(color, alpha_underglow)),
}
elif params.child('add_underglow').value()=='Gradient':
grad = QtGui.QLinearGradient(x.mean(), y.min(), x.mean(), y.max())
grad.setColorAt(0.001, pg.mkColor(color))
grad.setColorAt(abs(y.min())/(y.max()-y.min()), pg.mkColor('{}{:02x}'.format(color, alpha_underglow)))
grad.setColorAt(0.999, pg.mkColor(color))
brush = QtGui.QBrush(grad)
kw={'fillLevel' : 0.0,
'fillBrush' : brush,
}
else:
kw = {}
pw2.addItem(pg.PlotDataItem(x, y, pen=pen, **kw))
if params.child('make_line_glow').value():
alphas = np.linspace(alpha_start, alpha_stop, nb_glow_lines, dtype=int)
lws = np.linspace(linewidth_start, linewidth_stop, nb_glow_lines)
for alpha, lw in zip(alphas, lws):
pen = pg.mkPen(color='{}{:02x}'.format(color, alpha),
width=lw,
connect="finite")
pw2.addItem(pg.PlotDataItem(x, y,
pen=pen))
params.sigTreeStateChanged.connect(update_plot)
update_plot()
if __name__ == '__main__':
pg.exec()
|