forked from matplotlib/napari-matplotlib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhistogram.py
61 lines (47 loc) · 1.61 KB
/
histogram.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import numpy as np
from .base import NapariMPLWidget
__all__ = ["HistogramWidget"]
import napari
from .util import Interval
_COLORS = {"r": "tab:red", "g": "tab:green", "b": "tab:blue"}
class HistogramWidget(NapariMPLWidget):
"""
Display a histogram of the currently selected layer.
"""
n_layers_input = Interval(1, 1)
input_layer_types = (napari.layers.Image,)
def __init__(self, napari_viewer: napari.viewer.Viewer):
super().__init__(napari_viewer)
self.axes = self.canvas.figure.subplots()
self.apply_napari_colorscheme()
self.update_layers(None)
def clear(self) -> None:
"""
Clear the axes.
"""
self.axes.clear()
def draw(self) -> None:
"""
Clear the axes and histogram the currently selected layer/slice.
"""
layer = self.layers[0]
bins = np.linspace(np.min(layer.data), np.max(layer.data), 100)
if layer.data.ndim - layer.rgb == 3:
# 3D data, can be single channel or RGB
data = layer.data[self.current_z]
self.axes.set_title(f"z={self.current_z}")
else:
data = layer.data
if layer.rgb:
# Histogram RGB channels independently
for i, c in enumerate("rgb"):
self.axes.hist(
data[..., i].ravel(),
bins=bins,
label=c,
histtype="step",
color=_COLORS[c],
)
else:
self.axes.hist(data.ravel(), bins=bins, label=layer.name)
self.axes.legend()