Source code for fact.plotting.core

from matplotlib.patches import RegularPolygon
from matplotlib.collections import PatchCollection

import numpy as np
import matplotlib.pyplot as plt

from ..instrument import get_pixel_coords
from .utils import calc_linewidth, calc_text_size

lastpixel = -1


[docs]def onpick(event): global lastpixel hitpixel = event.ind[0] if hitpixel != lastpixel: lastpixel = hitpixel plot = event.artist ecols = plot.get_edgecolors() before = np.array(ecols[hitpixel]) ecols[hitpixel] = [1, 0, 0, 1] plot.set_edgecolors(ecols) plt.draw() ecols[hitpixel] = before print('chid:', hitpixel) print('value', plot.get_array()[hitpixel])
[docs]def camera( data, ax=None, cmap='gray', vmin=None, vmax=None, pixelcoords=None, edgecolor='k', linewidth=None, picker=False, ): ''' Parameters ---------- data : array like with shape 1440 the data you want to plot into the pixels ax : a matplotlib.axes.Axes instace or None The matplotlib axes in which to plot. If None, plt.gca() is used cmap : str or matplotlib colormap instance the colormap to use for plotting the 'dataset' [default: gray] vmin : float the minimum for the colorbar, if None min(data) is used [default: None] vmax : float the maximum for the colorbar, if None max(data) is used [default: None] pixelcoords : the coordinates for the pixels in form [x-values, y-values] if None, the package resource is used [default: None] edgecolor : any matplotlib color the color around the pixel picker: bool if True then the the pixel are made clickable to show information ''' if ax is None: ax = plt.gca() ax.set_aspect('equal') if picker is True: fig = ax.get_figure() fig.canvas.mpl_connect('pick_event', onpick) # if the axes limit is still (0,1) assume new axes if ax.get_xlim() == (0, 1) and ax.get_ylim() == (0, 1): ax.set_xlim(-200, 200) ax.set_ylim(-200, 200) if pixelcoords is None: pixel_x, pixel_y = get_pixel_coords() else: pixel_x, pixel_y = pixelcoords if vmin is None: vmin = np.min(data) if vmax is None: vmax = np.max(data) edgecolors = np.array(1440 * [edgecolor]) patches = [] for x, y, ec in zip(pixel_x, pixel_y, edgecolors): patches.append( RegularPolygon( xy=(x, y), numVertices=6, radius=9.51/np.sqrt(3), orientation=0., # in radians ) ) if linewidth is None: linewidth = calc_linewidth(ax=ax) collection = PatchCollection(patches, picker=0) collection.set_linewidth(linewidth) collection.set_edgecolors(edgecolors) collection.set_cmap(cmap) collection.set_array(data) collection.set_clim(vmin, vmax) ax.add_collection(collection) plt.draw_if_interactive() return collection
[docs]def pixelids(ax=None, size=None, pixelcoords=None, *args, **kwargs): ''' plot the chids into the pixels ''' if pixelcoords is None: pixel_x, pixel_y = get_pixel_coords() else: pixel_x, pixel_y = pixelcoords if ax is None: ax = plt.gca() if size is None: size = calc_text_size(ax) x1, x2 = ax.get_xlim() y1, y2 = ax.get_ylim() maskx = np.logical_and(pixel_x + 4.5 < x2, pixel_x - 4.5 > x1) masky = np.logical_and(pixel_y + 4.5 < y2, pixel_y - 4.5 > y1) mask = np.logical_and(maskx, masky) chids = np.arange(1440) for px, py, chid in zip(pixel_x[mask], pixel_y[mask], chids[mask]): ax.text( px, py, str(chid), size=size, va='center', ha='center', **kwargs ) plt.draw_if_interactive()
[docs]def mark_pixel(pixels, color='g', ax=None, linewidth=None): ''' surrounds pixels given by pixels with a border ''' pixel_x, pixel_y = get_pixel_coords() if ax is None: ax = plt.gca() patches = [] for xy in zip(pixel_x[pixels], pixel_y[pixels]): patches.append( RegularPolygon( xy=xy, numVertices=6, radius=9.5 / np.sqrt(3), orientation=0., # in radians fill=False, ) ) if linewidth is None: linewidth = calc_linewidth(ax=ax) collection = PatchCollection(patches, picker=0) collection.set_linewidth(linewidth) collection.set_edgecolors(color) collection.set_facecolor('none') ax.add_collection(collection) plt.draw_if_interactive() return collection