|
| 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