2013-03-19 20:04:46 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
2015-03-01 21:52:15 +00:00
|
|
|
"""
|
|
|
|
Demonstration of ScatterPlotWidget for exploring structure in tabular data.
|
|
|
|
|
|
|
|
The widget consists of four components:
|
|
|
|
|
|
|
|
1) A list of column names from which the user may select 1 or 2 columns
|
|
|
|
to plot. If one column is selected, the data for that column will be
|
|
|
|
plotted in a histogram-like manner by using pg.pseudoScatter().
|
|
|
|
If two columns are selected, then the
|
|
|
|
scatter plot will be generated with x determined by the first column
|
|
|
|
that was selected and y by the second.
|
|
|
|
2) A DataFilter that allows the user to select a subset of the data by
|
|
|
|
specifying multiple selection criteria.
|
|
|
|
3) A ColorMap that allows the user to determine how points are colored by
|
|
|
|
specifying multiple criteria.
|
|
|
|
4) A PlotWidget for displaying the data.
|
|
|
|
|
|
|
|
"""
|
2013-03-19 20:04:46 +00:00
|
|
|
import initExample ## Add path to library (just for examples; you do not need this)
|
|
|
|
|
|
|
|
import pyqtgraph as pg
|
|
|
|
from pyqtgraph.Qt import QtCore, QtGui
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
pg.mkQApp()
|
|
|
|
|
2015-03-01 21:52:15 +00:00
|
|
|
# Make up some tabular data with structure
|
|
|
|
data = np.empty(1000, dtype=[('x_pos', float), ('y_pos', float),
|
|
|
|
('count', int), ('amplitude', float),
|
2018-05-09 17:56:01 +00:00
|
|
|
('decay', float), ('type', 'U10')])
|
2015-03-01 21:52:15 +00:00
|
|
|
strings = ['Type-A', 'Type-B', 'Type-C', 'Type-D', 'Type-E']
|
|
|
|
typeInds = np.random.randint(5, size=1000)
|
|
|
|
data['type'] = np.array(strings)[typeInds]
|
|
|
|
data['x_pos'] = np.random.normal(size=1000)
|
|
|
|
data['x_pos'][data['type'] == 'Type-A'] -= 1
|
|
|
|
data['x_pos'][data['type'] == 'Type-B'] -= 1
|
|
|
|
data['x_pos'][data['type'] == 'Type-C'] += 2
|
|
|
|
data['x_pos'][data['type'] == 'Type-D'] += 2
|
|
|
|
data['x_pos'][data['type'] == 'Type-E'] += 2
|
|
|
|
data['y_pos'] = np.random.normal(size=1000) + data['x_pos']*0.1
|
|
|
|
data['y_pos'][data['type'] == 'Type-A'] += 3
|
|
|
|
data['y_pos'][data['type'] == 'Type-B'] += 3
|
|
|
|
data['amplitude'] = data['x_pos'] * 1.4 + data['y_pos'] + np.random.normal(size=1000, scale=0.4)
|
|
|
|
data['count'] = (np.random.exponential(size=1000, scale=100) * data['x_pos']).astype(int)
|
|
|
|
data['decay'] = np.random.normal(size=1000, scale=1e-3) + data['amplitude'] * 1e-4
|
|
|
|
data['decay'][data['type'] == 'Type-A'] /= 2
|
|
|
|
data['decay'][data['type'] == 'Type-E'] *= 3
|
2013-03-19 20:04:46 +00:00
|
|
|
|
|
|
|
|
2015-03-01 21:52:15 +00:00
|
|
|
# Create ScatterPlotWidget and configure its fields
|
|
|
|
spw = pg.ScatterPlotWidget()
|
2013-03-19 20:04:46 +00:00
|
|
|
spw.setFields([
|
2015-03-01 21:52:15 +00:00
|
|
|
('x_pos', {'units': 'm'}),
|
|
|
|
('y_pos', {'units': 'm'}),
|
|
|
|
('count', {}),
|
|
|
|
('amplitude', {'units': 'V'}),
|
|
|
|
('decay', {'units': 's'}),
|
|
|
|
('type', {'mode': 'enum', 'values': strings}),
|
2013-03-19 20:04:46 +00:00
|
|
|
])
|
|
|
|
|
|
|
|
spw.setData(data)
|
2015-03-01 21:52:15 +00:00
|
|
|
spw.show()
|
2013-03-19 20:04:46 +00:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
2021-05-13 21:28:22 +00:00
|
|
|
pg.exec()
|