diff --git a/src/napari_matplotlib/histogram.py b/src/napari_matplotlib/histogram.py index 2db2f08..073620d 100644 --- a/src/napari_matplotlib/histogram.py +++ b/src/napari_matplotlib/histogram.py @@ -20,6 +20,16 @@ _COLORS = {"r": "tab:red", "g": "tab:green", "b": "tab:blue"} +def _get_bins(data: npt.NDArray[Any]) -> npt.NDArray[Any]: + if data.dtype.kind in {"i", "u"}: + # Make sure integer data types have integer sized bins + step = np.ceil(np.ptp(data) / 100) + return np.arange(np.min(data), np.max(data) + step, step) + else: + # For other data types, just have 128 evenly spaced bins + return np.linspace(np.min(data), np.max(data), 100) + + class HistogramWidget(SingleAxesWidget): """ Display a histogram of the currently selected layer. @@ -70,13 +80,7 @@ def draw(self) -> None: # Important to calculate bins after slicing 3D data, to avoid reading # whole cube into memory. - if data.dtype.kind in {"i", "u"}: - # Make sure integer data types have integer sized bins - step = abs(np.max(data) - np.min(data)) // 100 - step = max(1, step) - bins = np.arange(np.min(data), np.max(data) + step, step) - else: - bins = np.linspace(np.min(data), np.max(data), 100) + bins = _get_bins(data) if layer.rgb: # Histogram RGB channels independently @@ -215,9 +219,9 @@ def draw(self) -> None: if data is None: return - _, bins, patches = self.axes.hist( - data, bins=50, edgecolor="white", linewidth=0.3 - ) + bins = _get_bins(data) + + _, bins, patches = self.axes.hist(data, bins=bins.tolist()) patches = cast(BarContainer, patches) # recolor the histogram plot diff --git a/src/napari_matplotlib/tests/baseline/test_feature_histogram_points.png b/src/napari_matplotlib/tests/baseline/test_feature_histogram_points.png index 74b84b2..be8770e 100644 Binary files a/src/napari_matplotlib/tests/baseline/test_feature_histogram_points.png and b/src/napari_matplotlib/tests/baseline/test_feature_histogram_points.png differ diff --git a/src/napari_matplotlib/tests/baseline/test_feature_histogram_vectors.png b/src/napari_matplotlib/tests/baseline/test_feature_histogram_vectors.png index 4675192..119c28e 100644 Binary files a/src/napari_matplotlib/tests/baseline/test_feature_histogram_vectors.png and b/src/napari_matplotlib/tests/baseline/test_feature_histogram_vectors.png differ diff --git a/src/napari_matplotlib/tests/baseline/test_histogram_2D.png b/src/napari_matplotlib/tests/baseline/test_histogram_2D.png index 00023ae..b9096e4 100644 Binary files a/src/napari_matplotlib/tests/baseline/test_histogram_2D.png and b/src/napari_matplotlib/tests/baseline/test_histogram_2D.png differ diff --git a/src/napari_matplotlib/tests/baseline/test_histogram_3D.png b/src/napari_matplotlib/tests/baseline/test_histogram_3D.png index bd3cafb..ec4ad96 100644 Binary files a/src/napari_matplotlib/tests/baseline/test_histogram_3D.png and b/src/napari_matplotlib/tests/baseline/test_histogram_3D.png differ