PyQtGraph’s Helper Functions#

Simple Data Display Functions#

pyqtgraph.plot(*args, **kargs)[source]#

Create and return a PlotWidget Accepts a title argument to set the title of the window. All other arguments are used to plot data. (see PlotItem.plot())

pyqtgraph.image(*args, **kargs)[source]#

Create and return an ImageView Will show 2D or 3D image data. Accepts a title argument to set the title of the window. All other arguments are used to show data. (see ImageView.setImage())

pyqtgraph.dbg(*args, **kwds)[source]#

Create a console window and begin watching for exceptions.

All arguments are passed to ConsoleWidget.__init__().

Color, Pen, and Brush Functions#

Qt uses the classes QColor, QPen, and QBrush to determine how to draw lines and fill shapes. These classes are highly capable but somewhat awkward to use. PyQtGraph offers the functions mkColor(), mkPen(), and mkBrush() to simplify the process of creating these classes. In most cases, however, it will be unnecessary to call these functions directly–any function or method that accepts pen or brush arguments will make use of these functions for you. For example, the following three lines all have the same effect:

pg.plot(xdata, ydata, pen='r')
pg.plot(xdata, ydata, pen=pg.mkPen('r'))
pg.plot(xdata, ydata, pen=QPen(QColor(255, 0, 0)))

Convenience function for constructing QColor from a variety of argument types. Accepted arguments are:


one of: r, g, b, c, m, y, k, w or an SVG color keyword

R, G, B, [A]

integers 0-255

(R, G, B, [A])

tuple of integers 0-255


greyscale, 0.0-1.0


see intColor()

(int, hues)

see intColor()






QColor instance; makes a copy.

pyqtgraph.mkPen(*args, **kargs)[source]#

Convenience function for constructing QPen.


mkPen(color, width=2)
mkPen(cosmetic=False, width=4.5, color='r')
mkPen({'color': "#FF0", width: 2})
mkPen(None)   # (no pen)

In these examples, color may be replaced with any arguments accepted by mkColor()

pyqtgraph.mkBrush(*args, **kwds)[source]#
Convenience function for constructing Brush.
This function always constructs a solid brush and accepts the same arguments as mkColor()
Calling mkBrush(None) returns an invisible brush.
pyqtgraph.hsvColor(hue, sat=1.0, val=1.0, alpha=1.0)[source]#

Generate a QColor from HSVa values. (all arguments are float 0.0-1.0)

pyqtgraph.intColor(index, hues=9, values=1, maxValue=255, minValue=150, maxHue=360, minHue=0, sat=255, alpha=255)[source]#

Creates a QColor from a single index. Useful for stepping through a predefined list of colors.

The argument index determines which color from the set will be returned. All other arguments determine what the set of predefined colors will be

Colors are chosen by cycling across hues while varying the value (brightness). By default, this selects from a list of 9 hues.

pyqtgraph.CIELabColor(L, a, b, alpha=1.0)[source]#

Generates as QColor from CIE L*a*b* values.

  • L (float) – Lightness value ranging from 0 to 100

  • a (float) – (green/red) and (blue/yellow) coordinates, typically -127 to +127.

  • b (float) – (green/red) and (blue/yellow) coordinates, typically -127 to +127.

  • alpha (float, optional) – Opacity, ranging from 0 to 1


The CIE L*a*b* color space parametrizes color in terms of a luminance L and the a and b coordinates that locate the hue in terms of a “green to red” and a “blue to yellow” axis.

These coordinates seek to parametrize human color preception in such a way that the Euclidean distance between the coordinates of two colors represents the visual difference between these colors. In particular, the difference

ΔE = sqrt( (L1-L2)² + (a1-a2)² + (b1-b2)² ) = 2.3

is considered the smallest “just noticeable difference” between colors.

This simple equation represents the CIE76 standard. Later standards CIE94 and CIE2000 refine the difference calculation ΔE, while maintaining the L*a*b* coordinates.

Alternative (and arguably more accurate) methods exist to quantify color difference, but the CIELab color space remains a convenient approximation.

Under a known illumination, assumed to be white standard illuminant D65 here, a CIELab color induces a response in the human eye that is described by the tristimulus value XYZ. Once this is known, an sRGB color can be calculated to induce the same response.

More information and underlying mathematics can be found in e.g. “CIELab Color Space” by Gernot Hoffmann, available at .

Also see colorDistance().


Describes a QColor by an array of CIE L*a*b* values. Also see CIELabColor() .


qcol (QColor) – QColor to be converted


Color coordinates [L, a, b].

Return type:


pyqtgraph.colorDistance(colors, metric='CIE76')[source]#

Returns the perceptual distances between a sequence of QColors. See CIELabColor() for more information.

  • colors (list of QColor) – Two or more colors to calculate the distances between.

  • metric (str, optional) – Metric used to determined the difference. Only ‘CIE76’ is supported at this time, where a distance of 2.3 is considered a “just noticeable difference”. The default may change as more metrics become available.


The N-1 sequential distances between N colors.

Return type:


Data Slicing#

pyqtgraph.affineSlice(data, shape, origin, vectors, axes, order=1, returnCoords=False, **kargs)[source]#

Take a slice of any orientation through an array. This is useful for extracting sections of multi-dimensional arrays such as MRI images for viewing as 1D or 2D data.

The slicing axes are aribtrary; they do not need to be orthogonal to the original data or even to each other. It is possible to use this function to extract arbitrary linear, rectangular, or parallelepiped shapes from within larger datasets. The original data is interpolated onto a new array of coordinates using either interpolateArray if order<2 or scipy.ndimage.map_coordinates otherwise.

For a graphical interface to this function, see ROI.getArrayRegion



(ndarray) the original dataset


the shape of the slice to take (Note the return value may have more dimensions than len(shape))


the location in the original dataset that will become the origin of the sliced data.


list of unit vectors which point in the direction of the slice axes. Each vector must have the same length as axes. If the vectors are not unit length, the result will be scaled relative to the original data. If the vectors are not orthogonal, the result will be sheared relative to the original data.


The axes in the original dataset which correspond to the slice vectors


The order of spline interpolation. Default is 1 (linear). See scipy.ndimage.map_coordinates for more information.


If True, return a tuple (result, coords) where coords is the array of coordinates used to select values from the original dataset.

All extra keyword arguments are passed to scipy.ndimage.map_coordinates.

Note the following must be true:

len(shape) == len(vectors)
len(origin) == len(axes) == len(vectors[i])

Example: start with a 4D fMRI data set, take a diagonal-planar slice out of the last 3 axes

  • data = array with dims (time, x, y, z) = (100, 40, 40, 40)

  • The plane to pull out is perpendicular to the vector (x,y,z) = (1,1,1)

  • The origin of the slice will be at (x,y,z) = (40, 0, 0)

  • We will slice a 20x20 plane from each timepoint, giving a final shape (100, 20, 20)

The call for this example would look like:

affineSlice(data, shape=(20,20), origin=(40,0,0), vectors=((-1, 1, 0), (-1, 0, 1)), axes=(1,2,3))

Coordinate Transformation#


Given a QTransform, return a 3x3 numpy array. Given a QMatrix4x4, return a 4x4 numpy array.

Example: map an array of x,y coordinates through a transform:

## coordinates to map are (1,5), (2,6), (3,7), and (4,8)
coords = np.array([[1,2,3,4], [5,6,7,8], [1,1,1,1]])  # the extra '1' coordinate is needed for translation to work

## Make an example transform
tr = QtGui.QTransform()
tr.scale(2, 0.1)

## convert to array
m = pg.transformToArray()[:2]  # ignore the perspective portion of the transformation

## map coordinates through transform
mapped =, coords)
pyqtgraph.transformCoordinates(tr, coords, transpose=False)[source]#

Map a set of 2D or 3D coordinates through a QTransform or QMatrix4x4. The shape of coords must be (2,…) or (3,…) The mapping will _ignore_ any perspective transformations.

For coordinate arrays with ndim=2, this is basically equivalent to matrix multiplication. Most arrays, however, prefer to put the coordinate axis at the end (eg. shape=(…,3)). To allow this, use transpose=True.

pyqtgraph.solve3DTransform(points1, points2)[source]#

Find a 3D transformation matrix that maps points1 onto points2. Points must be specified as either lists of 4 Vectors or (4, 3) arrays.

pyqtgraph.solveBilinearTransform(points1, points2)[source]#

Find a bilinear transformation matrix (2x4) that maps points1 onto points2. Points must be specified as a list of 4 Vector, Point, QPointF, etc.

To use this matrix to map a point [x,y]:

mapped =, [x*y, x, y, 1])

SI Unit Conversion Functions#

pyqtgraph.siFormat(x, precision=3, suffix='', space=True, error=None, minVal=1e-25, allowUnicode=True)[source]#

Return the number x formatted in engineering notation with SI prefix.


siFormat(0.0001, suffix=’V’) # returns “100 μV”

pyqtgraph.siScale(x, minVal=1e-25, allowUnicode=True)[source]#

Return the recommended scale factor and SI prefix string for x.


siScale(0.0001)   # returns (1e6, 'μ')
# This indicates that the number 0.0001 is best represented as 0.0001 * 1e6 = 100 μUnits
pyqtgraph.siEval(s, typ=<class 'float'>, regex=re.compile('(?P<number>[+-]?((((\\d+(\\.\\d*)?)|(\\d*\\.\\d+))([eE][+-]?\\d+)?)|((?i:nan)|(inf))))\\s*((?P<siPrefix>[uyzafpnµm kMGTPEZY]?)(?P<suffix>\\w.*))?$'), suffix=None)[source]#

Convert a value written in SI notation to its equivalent prefixless value.


siEval("100 μV")  # returns 0.0001
pyqtgraph.siParse(s, regex=re.compile('(?P<number>[+-]?((((\\d+(\\.\\d*)?)|(\\d*\\.\\d+))([eE][+-]?\\d+)?)|((?i:nan)|(inf))))\\s*((?P<siPrefix>[uyzafpnµm kMGTPEZY]?)(?P<suffix>\\w.*))?$'), suffix=None)[source]#

Convert a value written in SI notation to a tuple (number, si_prefix, suffix).


siParse('100 µV")  # returns ('100', 'µ', 'V')

Note that in the above example, the µ symbol is the “micro sign” (UTF-8 0xC2B5), as opposed to the Greek letter mu (UTF-8 0xCEBC).

  • s (str) – The string to parse.

  • regex (re.Pattern, optional) – Compiled regular expression object for parsing. The default is a general-purpose regex for parsing floating point expressions, potentially containing an SI prefix and a suffix.

  • suffix (str, optional) – Suffix to check for in s. The default (None) indicates there may or may not be a suffix contained in the string and it is returned if found. An empty string "" is handled differently: if the string contains a suffix, it is discarded. This enables interpreting characters following the numerical value as an SI prefix.

Image Preparation Functions#

pyqtgraph.makeARGB(data, lut=None, levels=None, scale=None, useRGBA=False, maskNans=True, output=None)[source]#

Convert an array of values into an ARGB array suitable for building QImages, OpenGL textures, etc.

Returns the ARGB array (unsigned byte) and a boolean indicating whether there is alpha channel data. This is a two stage process:

  1. Rescale the data based on the values in the levels argument (min, max).

  2. Determine the final output by passing the rescaled values through a lookup table.

Both stages are optional.



numpy array of int/float types. If


List [min, max]; optionally rescale data before converting through the lookup table. The data is rescaled such that min->0 and max->*scale*:

rescaled = (clip(data, min, max) - min) * (*scale* / (max - min))

It is also possible to use a 2D (N,2) array of values for levels. In this case, it is assumed that each pair of min,max values in the levels array should be applied to a different subset of the input data (for example, the input data may already have RGB values and the levels are used to independently scale each channel). The use of this feature requires that levels.shape[0] == data.shape[-1].


The maximum value to which data will be rescaled before being passed through the lookup table (or returned if there is no lookup table). By default this will be set to the length of the lookup table, or 255 if no lookup table is provided.


Optional lookup table (array with dtype=ubyte). Values in data will be converted to color by indexing directly from lut. The output data shape will be input.shape + lut.shape[1:]. Lookup tables can be built using ColorMap or GradientWidget.


If True, the data is returned in RGBA order (useful for building OpenGL textures). The default is False, which returns in ARGB order for use with QImage (Note that ‘ARGB’ is a term used by the Qt documentation; the actual order is BGRA).


Enable or disable masking NaNs as transparent.

pyqtgraph.makeQImage(imgData, alpha=None, copy=True, transpose=True)[source]#

Turn an ARGB array into QImage. By default, the data is copied; changes to the array will not be reflected in the image. The image will be given a ‘data’ attribute pointing to the array which shares its data to prevent python freeing that memory while the image is in use.



Array of data to convert. Must have shape (height, width), (height, width, 3), or (height, width, 4). If transpose is True, then the first two axes are swapped. The array dtype must be ubyte. For 2D arrays, the value is interpreted as greyscale. For 3D arrays, the order of values in the 3rd axis must be (b, g, r, a).


If the input array is 3D and alpha is True, the QImage returned will have format ARGB32. If False, the format will be RGB32. By default, _alpha_ is True if array.shape[2] == 4.


If True, the data is copied before converting to QImage. If False, the new QImage points directly to the data in the array. Note that the array must be contiguous for this to work (see numpy.ascontiguousarray).


If True (the default), the array x/y axes are transposed before creating the image. Note that Qt expects the axes to be in (height, width) order whereas pyqtgraph usually prefers the opposite.

pyqtgraph.applyLookupTable(data, lut)[source]#

Uses values in data as indexes to select values from lut. The returned data has shape data.shape + lut.shape[1:]

Note: color gradient lookup tables can be generated using GradientWidget.

  • data (numpy.ndarray) –

  • lut (numpy.ndarray) – Either cupy or numpy arrays are accepted, though this function has only consistently behaved correctly on windows with cuda toolkit version >= 11.1.

pyqtgraph.rescaleData(data, scale, offset, dtype=None, clip=None)[source]#

Return data rescaled and optionally cast to a new dtype.

The scaling operation is:

data => (data-offset) * scale
pyqtgraph.imageToArray(img, copy=False, transpose=True)[source]#

Convert a QImage into numpy array. The image must have format RGB32, ARGB32, or ARGB32_Premultiplied. By default, the image is not copied; changes made to the array will appear in the QImage as well (beware: if the QImage is collected before the array, there may be trouble). The array will have shape (width, height, (b,g,r,a)).

Mesh Generation Functions#

pyqtgraph.isocurve(data, level, connected=False, extendToEdge=False, path=False)[source]#

Generate isocurve from 2D data using marching squares algorithm.



2D numpy array of scalar values


The level at which to generate an isosurface


If False, return a single long list of point pairs If True, return multiple long lists of connected point locations. (This is slower but better for drawing continuous lines)


If True, extend the curves to reach the exact edges of the data.


if True, return a QPainterPath rather than a list of vertex coordinates. This forces connected=True.

This function is SLOW; plenty of room for optimization here.

pyqtgraph.isosurface(data, level)[source]#

Generate isosurface from volumetric data using marching cubes algorithm. See Paul Bourke, “Polygonising a Scalar Field” (

data 3D numpy array of scalar values. Must be contiguous. level The level at which to generate an isosurface

Returns an array of vertex coordinates (Nv, 3) and an array of per-face vertex indexes (Nf, 3)

Miscellaneous Functions#

pyqtgraph.eq(a, b)[source]#

The great missing equivalence function: Guaranteed evaluation to a single bool value.

This function has some important differences from the == operator:

  1. Returns True if a IS b, even if a==b still evaluates to False.

  2. While a is b will catch the case with np.nan values, special handling is done for distinct float(‘nan’) instances using math.isnan.

  3. Tests for equivalence using ==, but silently ignores some common exceptions that can occur (AtrtibuteError, ValueError).

  4. When comparing arrays, returns False if the array shapes are not the same.

  5. When comparing arrays of the same shape, returns True only if all elements are equal (whereas the == operator would return a boolean array).

  6. Collections (dict, list, etc.) must have the same type to be considered equal. One consequence is that comparing a dict to an OrderedDict will always return False.

pyqtgraph.arrayToQPath(x, y, connect='all', finiteCheck=True)[source]#

Convert an array of x,y coordinates to QPainterPath as efficiently as possible. The connect argument may be ‘all’, indicating that each point should be connected to the next; ‘pairs’, indicating that each pair of points should be connected, or an array of int32 values (0 or 1) indicating connections.

  • x (numpy.ndarray) – x-values to be plotted of shape (N,)

  • y (numpy.ndarray) – y-values to be plotted, must be same length as x of shape (N,)

  • connect ({'all', 'pairs', 'finite', (N,) ndarray}, optional) – Argument detailing how to connect the points in the path. all will have sequential points being connected. pairs generates lines between every other point. finite only connects points that are finite. If an ndarray is passed, containing int32 values of 0 or 1, only values with 1 will connect to the previous point. Def

  • finiteCheck (bool, default True) – When false, the check for finite values will be skipped, which can improve performance. If nonfinite values are present in x or y, an empty QPainterPath will be generated.


QPainterPath object to be drawn

Return type:



ValueError – Raised when the connect argument has an invalid value placed within.


A QPainterPath is generated through one of two ways. When the connect parameter is ‘all’, a QPolygonF object is created, and QPainterPath.addPolygon() is called. For other connect parameters a QDataStream object is created and the QDataStream >> QPainterPath operator is used to pass the data. The memory format is as follows

numVerts(i4) 0(i4) x(f8) y(f8) <– 0 means this vertex does not connect 1(i4) x(f8) y(f8) <– 1 means this vertex connects to the previous vertex … cStart(i4) fillRule(i4)

see: qt/qtbase

All values are big endian–pack using struct.pack(‘>d’) or struct.pack(‘>i’) This binary format may change in future versions of Qt

pyqtgraph.pseudoScatter(data, spacing=None, shuffle=True, bidir=False, method='exact')[source]#

Return an array of position values needed to make beeswarm or column scatter plots.

Used for examining the distribution of values in an array.

Given an array of x-values, construct an array of y-values such that an x,y scatter-plot will not have overlapping points (it will look similar to a histogram).


Causes python to exit without garbage-collecting any objects, and thus avoids calling object destructor methods. This is a sledgehammer workaround for a variety of bugs in PyQt and Pyside that cause crashes on exit.

This function does the following in an attempt to ‘safely’ terminate the process:

  • Invoke atexit callbacks

  • Close all open file handles

  • os._exit()

Note: there is some potential for causing damage with this function if you are using objects that _require_ their destructors to be called (for example, to properly terminate log files, disconnect from devices, etc). Situations like this are probably quite rare, but use at your own risk.

Legacy Color Helper Functions#

The following helper functions should no longer be used. The functionality that they implement is trivial and it is suggested that the user use the equivalent QColor methods directly.


Return a tuple (R,G,B,A) from a QColor


Generate a hex string code from a QColor

pyqtgraph.glColor(*args, **kargs)[source]#

Convert a color to OpenGL color format (r,g,b,a) floats 0.0-1.0 Accepts same arguments as mkColor.