schrodinger.ui.qt.smatplotlib module

Contains Schrodinger helper widgets for matplotlib display in PyQt

class schrodinger.ui.qt.smatplotlib.SmatplotlibToolbar(canvas, parent, coordinates=True, allow_log=True, allow_linear=True, clipboard=True, toolitems=(('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous view', 'back', 'back'), ('Forward', 'Forward to next view', 'forward', 'forward'), (None, None, None, None), ('Pan', 'Left button pans, Right button zooms\nx/y fixes axis, CTRL fixes aspect', 'move', 'pan'), ('Zoom', 'Zoom to rectangle\nx/y fixes axis', 'zoom_to_rect', 'zoom'), ('Subplots', 'Configure subplots', 'subplots', 'configure_subplots'), ('Customize', 'Edit axis, curve and image parameters', 'qt4_editor_options', 'edit_parameters'), (None, None, None, None), ('Save', 'Save the figure', 'filesave', 'save_figure')))

Bases: schrodinger.ui.qt.navtoolbar.NavToolbar

Kept for backward compatibility - use navtoolbar.NavToolbar instead

Deprecated

use schrodinger.ui.qt.navtoolbar.NavToolbar instead

class schrodinger.ui.qt.smatplotlib.SmatplotlibCanvas(width=5, height=4, dpi=100, toolbar=True, layout=None, expanding=True, toolbar_class=None, **kwargs)

Bases: matplotlib.backends.backend_qtagg.FigureCanvasQTAgg

Custom subclass of FigureCanvasQTAgg that does the following:
  • Allows for simultaneous definition of the Canvas, Figure and toolbar

    objects, and placing them in a layout

  • Fixes known bugs with the mouse events detecting modifier keys

TOOLBAR_CLASS

alias of schrodinger.ui.qt.navtoolbar.NavToolbar

__init__(width=5, height=4, dpi=100, toolbar=True, layout=None, expanding=True, toolbar_class=None, **kwargs)
Parameters
  • width (number) – width of the plot Figure in inches

  • height (number) – height of the plot Figure in inches

  • dpi (int) – resolution of the plot

  • toolbar (boolean) – True if the toolbar should be created, but the parent parameter must be supplied in this case

  • layout (QLayout object) – If layout is supplied, the toolbar and canvas will be placed in it.

  • expanding (bool) – if True, set canvas size policy to QSizePolicy.Expanding

  • toolbar_class (class) – If provided, the class to use for the toolbar

Extra keyword arguments are passed to the toolbar function

eventFilter(obj, event)

The canvas needs to grab keyboard input in order to reliably tell when a modifier key (shift or control) is down when a mouse button is pressed/released.

Some environments have trouble with passing the control key in events - a control-left-click is often mapped to a right-click. Therefore we do our best to capture on our own when the control key is down. Note that even this breaks for multiple control-clicks on Linux running under VMWare Fusion on Macs, because VMWare by default “lifts” the control key after the first click.

Parameters
  • obj (not used) – not used

  • event (QEvent) – the event object

mousePressEvent(event)

Add in the control modifier key to the button_press_event

Parameters

event (QMouseEvent) – the QMouseEvent that triggered this handler

self._key is matplotlib’s way of storing the modifier keys

mouseReleaseEvent(event)

Add in the control modifier key to the button_release_event

Parameters

event (QMouseEvent) – the QMouseEvent that triggered this handler

self._key is matplotlib’s way of storing the modifier keys

drawAndUpdate(tight_layout=True)

Update canvas and toolbar after plotting.

Parameters

tight_layout (bool) – Whether to apply tight layout after plotting

schrodinger.ui.qt.smatplotlib.autoset_axis_range(axes, yaxis=True, minimum_span=0.01)

Set the axis range based on the min and max values of the plotted data.

Parameters
  • axes (matplotlib.axes.Axes) – The plot that its axis range will be set.

  • yaxis (bool) – If True, the y-axis range will be set. If False, the x-axis range will be set.

  • minimum_span (float) – Minimum span between axis min and max

schrodinger.ui.qt.smatplotlib.add_axis_margins(min_val: float, max_val: float, margin_frac: float = 0.05) Tuple[float]

Return a new range with an added margin to both the min and max values. Mainly for aesthetic benefit.

Min_val

The current minimum value.

Max_val

The current maximum value. Assumed to be > min_val

Margin_frac

The fraction of the value range that we want to add as margin to each side.

schrodinger.ui.qt.smatplotlib.get_annotation_position(text_obj: matplotlib.text.Text, ax: matplotlib.axes._axes.Axes, x_cursor: int, y_cursor: int) Tuple[float, float]

Return the new position at which text_obj should be placed relative to the annotation origin, which is the top left corner by default. The main philosophy here is to always keep the annotation within the bounds of the axes. This is because the annotation will get clipped if it extends beyond the edge of the parent view. This may not always happen, but it’s very possible when annotation is large and there is little padding between the plot and the edge of the parent panel.

Rules: 1. The annotation should be placed below the mouse and to the right when possible to mimic normal tooltip behavior. 2. If drawing the annotation below the cursor would cause it to extend below the axes, it should instead be placed above the cursor. 3. If drawing the annotation to the right of the cursor would cause it to extend off the axes to the right, it should instead be placed to the left of the cursor.

Parameters
  • text_obj – The annotation to be moved.

  • ax – The axes in which the annotation is being placed.

  • x_cursor – The x-coordinate of the cursor.

  • y_cursor – The y-coordinate of the cursor.