VisPy is quite an interesting tool. They say it is for “scientific visualization”. Here is an example of that. I took a demo from their github page and added a little code to generate a sinewave. The cool thing is that the graph, scaling, panning, zooming, and redrawing all come out of the box.
I previously wrote about installing VisPy. Thanks to the great efforts of some unnamed people, Python on Windows is really working nicely now.
Here is a screenshot:

Here is the code:
| # -*- coding: utf-8 -*- | |
| # Copyright (c) Vispy Development Team. All Rights Reserved. | |
| # Distributed under the (new) BSD License. See LICENSE.txt for more info. | |
| """ | |
| Demonstration of InfiniteLine visual. | |
| """ | |
| import sys | |
| import numpy as np | |
| from vispy import app, scene | |
| # vertex positions of data to draw | |
| N = 200 | |
| pos = np.zeros((N, 2), dtype=np.float32) | |
| x_lim = [50., 1750.] | |
| y_lim = [-2., 2.] | |
| pos[:, 0] = np.linspace(x_lim[0], x_lim[1], N) | |
| pos[:, 1] = np.random.normal(size=N) | |
| pos1 = np.zeros((20000,2), dtype=np.float32) | |
| color1 = np.ones((20000,4), dtype=np.float32) | |
| pos1[0,0] = 0.0 | |
| pos1[0,1] = 15.0 | |
| pos1[1,0] = 100.0 | |
| pos1[1,1] = -15.0 | |
| import math | |
| for x in range(20000): | |
| pos1[x,0] = x*10 | |
| pos1[x,1] = math.sin(x/20.) * 40. | |
| # color array | |
| color = np.ones((N, 4), dtype=np.float32) | |
| color[:, 0] = np.linspace(0, 1, N) | |
| color[:, 1] = color[::-1, 0] | |
| canvas = scene.SceneCanvas(keys='interactive', show=True) | |
| grid = canvas.central_widget.add_grid(spacing=0) | |
| viewbox = grid.add_view(row=0, col=1, camera='panzoom') | |
| # add some axes | |
| x_axis = scene.AxisWidget(orientation='bottom') | |
| x_axis.stretch = (1, 0.1) | |
| grid.add_widget(x_axis, row=1, col=1) | |
| x_axis.link_view(viewbox) | |
| y_axis = scene.AxisWidget(orientation='left') | |
| y_axis.stretch = (0.1, 1) | |
| grid.add_widget(y_axis, row=0, col=0) | |
| y_axis.link_view(viewbox) | |
| # add a line plot inside the viewbox | |
| #line = scene.Line(pos, color, parent=viewbox.scene) | |
| line1 = scene.Line(pos1, color1, parent=viewbox.scene) | |
| # add vertical lines | |
| vert_line1 = scene.InfiniteLine(100, [1.0, 0.0, 0.0, 1.0], | |
| parent=viewbox.scene) | |
| vert_line2 = scene.InfiniteLine(549.2, [0.0, 1.0, 0.0, 1.0], vertical=True, | |
| parent=viewbox.scene) | |
| # add horizontal lines | |
| hor_line1 = scene.InfiniteLine(0.3, [1.0, 0.0, 1.0, 1.0], vertical=False, | |
| parent=viewbox.scene) | |
| hor_line2 = scene.InfiniteLine(-5.1, [1.0, 1.0, 0.0, 1.0], vertical=False, | |
| parent=viewbox.scene) | |
| # auto-scale to see the whole line. | |
| viewbox.camera.set_range((0,1000), (-100,100)) | |
| if __name__ == '__main__' and sys.flags.interactive == 0: | |
| app.run() |

