|
| 1 | +from base64 import b64encode |
| 2 | +from io import BytesIO |
| 3 | + |
1 | 4 | import napari |
2 | 5 | import numpy as np |
3 | 6 | from matplotlib.backends.backend_qt5agg import FigureCanvas |
|
7 | 10 | __all__ = ["HistogramWidget"] |
8 | 11 |
|
9 | 12 |
|
10 | | -class HistogramWidget(QWidget): |
| 13 | +def _figure_to_base64(fig): |
| 14 | + # Converts a matplotlib Figure to a base64 UTF-8 string |
| 15 | + buf = BytesIO() |
| 16 | + fig.savefig( |
| 17 | + buf, format="png", facecolor="none" |
| 18 | + ) # works better than transparent=True |
| 19 | + return b64encode(buf.getvalue()).decode("utf-8") |
| 20 | + |
| 21 | + |
| 22 | +class NapariMPLWidget(QWidget): |
| 23 | + """ |
| 24 | + Attributes |
| 25 | + ---------- |
| 26 | + viewer : napari.viewer.Viewer |
| 27 | + Main napari viewer. |
| 28 | + figure : matplotlib.figure.Figure |
| 29 | + Matplotlib figure. |
| 30 | + canvas : matplotlib.backends.backend_qt5agg.FigureCanvas |
| 31 | + Matplotlib canvas. |
| 32 | + axes : matplotlib.axes.Axes |
| 33 | + Matplotlib axes. |
| 34 | + """ |
| 35 | + |
11 | 36 | def __init__(self, napari_viewer: napari.viewer.Viewer): |
12 | | - """ |
13 | | - Widget to display a histogram of the currently selected layer. |
14 | | -
|
15 | | - Attributes |
16 | | - ---------- |
17 | | - viewer : napari.viewer.Viewer |
18 | | - Main napari viewer. |
19 | | - layer : napari.layers.Layer |
20 | | - Current layer being histogrammed. |
21 | | - canvas : matplotlib.backends.backend_qt5agg.FigureCanvas |
22 | | - Matplotlib canvas. |
23 | | - axes : matplotlib.axes.Axes |
24 | | - Matplotlib axes. |
25 | | - """ |
26 | 37 | super().__init__() |
27 | | - self.viewer = napari_viewer |
28 | | - self.layer = self.viewer.layers[-1] |
29 | 38 |
|
30 | | - self.canvas = FigureCanvas(Figure(figsize=(5, 3))) |
| 39 | + self.viewer = napari_viewer |
| 40 | + self.figure = Figure(figsize=(5, 3)) |
| 41 | + self.canvas = FigureCanvas(self.figure) |
31 | 42 | self.axes = self.canvas.figure.subplots() |
32 | 43 |
|
33 | 44 | self.setLayout(QVBoxLayout()) |
34 | 45 | self.layout().addWidget(self.canvas) |
35 | 46 |
|
| 47 | + def _repr_html_(self): |
| 48 | + buf = BytesIO() |
| 49 | + self.figure.savefig(buf, format="png", facecolor="none") |
| 50 | + src = b64encode(buf.getvalue()).decode("utf-8") |
| 51 | + return f"<img src='data:image/png;base64,{src}'/>" |
| 52 | + |
| 53 | + |
| 54 | +class HistogramWidget(NapariMPLWidget): |
| 55 | + """ |
| 56 | + Widget to display a histogram of the currently selected layer. |
| 57 | +
|
| 58 | + Attributes |
| 59 | + ---------- |
| 60 | + layer : napari.layers.Layer |
| 61 | + Current layer being histogrammed. |
| 62 | + """ |
| 63 | + |
| 64 | + def __init__(self, napari_viewer: napari.viewer.Viewer): |
| 65 | + super().__init__(napari_viewer) |
| 66 | + self.layer = self.viewer.layers[-1] |
| 67 | + |
36 | 68 | self.viewer.dims.events.current_step.connect(self.hist_current_layer) |
37 | 69 | self.viewer.layers.selection.events.active.connect(self.update_layer) |
38 | 70 |
|
|
0 commit comments