Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
0.0.2
=====

New features
------------
- `HistogramWidget` now shows individual histograms for RGB channels when
present.


Bug fixes
---------
- `HistogramWidget` now works properly with 2D images.
29 changes: 25 additions & 4 deletions src/napari_matplotlib/histogram.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
__all__ = ["HistogramWidget"]


_COLORS = {"r": "tab:red", "g": "tab:green", "b": "tab:blue"}


class HistogramWidget(NapariMPLWidget):
"""
Widget to display a histogram of the currently selected layer.
Expand Down Expand Up @@ -40,9 +43,27 @@ def hist_current_layer(self) -> None:
"""
self.axes.clear()
layer = self.layer
z = self.viewer.dims.current_step[0]
bins = np.linspace(np.min(layer.data), np.max(layer.data), 100)
data = layer.data[z]
self.axes.hist(data.ravel(), bins=bins)
self.axes.set_title(f"{layer.name}, z={z}")

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()
self.canvas.draw()
13 changes: 13 additions & 0 deletions src/napari_matplotlib/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import numpy as np
import pytest


@pytest.fixture(
params=[
((100, 100), {"rgb": False}),
((100, 100, 100), {"rgb": False}),
((100, 100, 3), {"rgb": True}),
]
)
def image_data(request):
return np.ones(request.param[0]), request.param[1]
6 changes: 2 additions & 4 deletions src/napari_matplotlib/tests/test_histogram.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import numpy as np

from napari_matplotlib import HistogramWidget


def test_example_q_widget(make_napari_viewer):
def test_example_q_widget(make_napari_viewer, image_data):
# Smoke test adding a histogram widget
viewer = make_napari_viewer()
viewer.add_image(np.random.random((100, 100)))
viewer.add_image(image_data[0], **image_data[1])
HistogramWidget(viewer)