diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fda2756c..8a615182 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,7 +3,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.0.1 + rev: v4.3.0 hooks: - id: check-added-large-files - id: check-case-conflict diff --git a/src/mplhep/plot.py b/src/mplhep/plot.py index 89823008..c2b8f850 100644 --- a/src/mplhep/plot.py +++ b/src/mplhep/plot.py @@ -171,7 +171,6 @@ def histplot( ) # Cast to plottables - plottables = [ Plottable(h.values(), edges=final_bins, variances=h.variances()) for h in hists ] @@ -181,17 +180,21 @@ def histplot( plottables = [] final_bins = np.array( [ - final_bins[0] - (final_bins[1] - final_bins[0]) * 3, - final_bins[0] - (final_bins[1] - final_bins[0]), + final_bins[0] - (final_bins[-1] - final_bins[0]) * 0.08, + final_bins[0] - (final_bins[-1] - final_bins[0]) * 0.03, *final_bins, - final_bins[-1] + (final_bins[1] - final_bins[0]), - final_bins[-1] + (final_bins[1] - final_bins[0]) * 3, + final_bins[-1] + (final_bins[-1] - final_bins[0]) * 0.03, + final_bins[-1] + (final_bins[-1] - final_bins[0]) * 0.08, ] ) for h in hists: value, variance = h.view(flow=True)["value"], h.view(flow=True)["variance"] - value, variance = np.insert(value, -1, 0), np.insert(variance, -1, 0) - value, variance = np.insert(value, 1, 0), np.insert(variance, 1, 0) + value, variance = np.insert(value, -1, np.nan), np.insert( + variance, -1, np.nan + ) + value, variance = np.insert(value, 1, np.nan), np.insert( + variance, 1, np.nan + ) plottables.append(Plottable(value, edges=final_bins, variances=variance)) # "sum": Add under/overflow bin to first/last bin elif flow == "sum": @@ -465,31 +468,18 @@ def iterable_not_string(arg): if flow == "hint": ax.plot( [ - final_bins[0] - (final_bins[1] - final_bins[0]) / 2.0, + final_bins[0] - (final_bins[-3] - final_bins[2]) * 0.03, final_bins[0], ], [0, 0], **kwargs, ) - ax.plot( - [ - final_bins[0] - (final_bins[1] - final_bins[0]) / 2.0, - final_bins[0], - ], - [1, 1], - **kwargs, - ) if flow == "show": ax.plot( [final_bins[1], final_bins[2]], [0, 0], **kwargs, ) - ax.plot( - [final_bins[1], final_bins[2]], - [1, 1], - **kwargs, - ) xticks[0] = "" xticks[1] = f"<{final_bins[2]}" @@ -499,30 +489,17 @@ def iterable_not_string(arg): ax.plot( [ final_bins[-1], - final_bins[-1] + (final_bins[1] - final_bins[0]) / 2.0, + final_bins[-1] + (final_bins[-3] - final_bins[2]) * 0.03, ], [0, 0], **kwargs, ) - ax.plot( - [ - final_bins[-1], - final_bins[-1] + (final_bins[1] - final_bins[0]) / 2.0, - ], - [1, 1], - **kwargs, - ) if flow == "show": ax.plot( [final_bins[-3], final_bins[-2]], [0, 0], **kwargs, ) - ax.plot( - [final_bins[-3], final_bins[-2]], - [1, 1], - **kwargs, - ) xticks[-1] = "" xticks[-2] = f">{final_bins[-3]}" ax.set_xticklabels(xticks) @@ -612,26 +589,27 @@ def hist2dplot( # "show": Add additional bin with 2 times bin width if flow == "show": H = hist.view(flow=True)["value"] + xbins = np.array( [ - xbins[0] - (xbins[1] - xbins[0]) * 3, - xbins[0] - (xbins[1] - xbins[0]), + xbins[0] - (xbins[-1] - xbins[0]) * 0.08, + xbins[0] - (xbins[-1] - xbins[0]) * 0.03, *xbins, - xbins[-1] + (xbins[1] - xbins[0]), - xbins[-1] + (xbins[1] - xbins[0]) * 3, + xbins[-1] + (xbins[-1] - xbins[0]) * 0.03, + xbins[-1] + (xbins[-1] - xbins[0]) * 0.08, ] ) ybins = np.array( [ - ybins[0] - (ybins[1] - ybins[0]) * 3, - ybins[0] - (ybins[1] - ybins[0]), + ybins[0] - (ybins[-1] - ybins[0]) * 0.08, + ybins[0] - (ybins[-1] - ybins[0]) * 0.03, *ybins, - ybins[-1] + (ybins[1] - ybins[0]), - ybins[-1] + (ybins[1] - ybins[0]) * 3, + ybins[-1] + (ybins[-1] - ybins[0]) * 0.03, + ybins[-1] + (ybins[-1] - ybins[0]) * 0.08, ] ) - H = np.insert(H, (1, -1), 0, axis=-1) - H = np.insert(H, (1, -1), np.zeros(np.shape(H)[1]), axis=0) + H = np.insert(H, (1, -1), np.nan, axis=-1) + H = np.insert(H, (1, -1), np.full(np.shape(H)[1], np.nan), axis=0) if flow == "sum": H[0, 0], H[-1, -1], H[0, -1], H[-1, 0] = ( @@ -711,7 +689,7 @@ def hist2dplot( if hist.view(flow=True)["value"][0, 0] > 0.0: if flow == "hint": ax.plot( - [xbins[0] - (xbins[1] - xbins[0]) / 2.0, xbins[0]], + [xbins[0] - (xbins[-3] - xbins[2]) * 0.03, xbins[0]], [0, 0], transform=trans, **kwargs, @@ -725,7 +703,7 @@ def hist2dplot( if hist.view(flow=True)["value"][-1, 0] > 0.0: if flow == "hint": ax.plot( - [xbins[-1] + (xbins[1] - xbins[0]) / 2.0, xbins[-1]], + [xbins[-1] + (xbins[-3] - xbins[2]) * 0.03, xbins[-1]], [0, 0], transform=trans, **kwargs, @@ -739,7 +717,7 @@ def hist2dplot( if hist.view(flow=True)["value"][0, -1] > 0.0: if flow == "hint": ax.plot( - [xbins[0], xbins[0] - (xbins[1] - xbins[0]) / 2.0], + [xbins[0], xbins[0] - (xbins[-3] - xbins[2]) * 0.03], [1, 1], transform=trans, **kwargs, @@ -753,7 +731,7 @@ def hist2dplot( if hist.view(flow=True)["value"][-1, -1] > 0.0: if flow == "hint": ax.plot( - [xbins[-1] + (xbins[1] - xbins[0]) / 2.0, xbins[-1]], + [xbins[-1] + (xbins[-3] - xbins[2]) * 0.03, xbins[-1]], [1, 1], transform=trans, **kwargs, diff --git a/tests/baseline/test_hist2dplot.png b/tests/baseline/test_hist2dplot.png index 4c513b7a..975bce0e 100644 Binary files a/tests/baseline/test_hist2dplot.png and b/tests/baseline/test_hist2dplot.png differ diff --git a/tests/baseline/test_hist2dplot_cbar_False.png b/tests/baseline/test_hist2dplot_cbar_False.png index 4c513b7a..975bce0e 100644 Binary files a/tests/baseline/test_hist2dplot_cbar_False.png and b/tests/baseline/test_hist2dplot_cbar_False.png differ diff --git a/tests/baseline/test_hist2dplot_cbar_True.png b/tests/baseline/test_hist2dplot_cbar_True.png index eda3b263..c9e407b5 100644 Binary files a/tests/baseline/test_hist2dplot_cbar_True.png and b/tests/baseline/test_hist2dplot_cbar_True.png differ diff --git a/tests/baseline/test_hist2dplot_cbar_subplots.png b/tests/baseline/test_hist2dplot_cbar_subplots.png index 34246667..234afefe 100644 Binary files a/tests/baseline/test_hist2dplot_cbar_subplots.png and b/tests/baseline/test_hist2dplot_cbar_subplots.png differ diff --git a/tests/baseline/test_hist2dplot_custom_labels.png b/tests/baseline/test_hist2dplot_custom_labels.png index 7891e558..8baf0ab1 100644 Binary files a/tests/baseline/test_hist2dplot_custom_labels.png and b/tests/baseline/test_hist2dplot_custom_labels.png differ diff --git a/tests/baseline/test_hist2dplot_flow.png b/tests/baseline/test_hist2dplot_flow.png index d6ea0895..e4a13aa2 100644 Binary files a/tests/baseline/test_hist2dplot_flow.png and b/tests/baseline/test_hist2dplot_flow.png differ diff --git a/tests/baseline/test_hist2dplot_inputs_nobin.png b/tests/baseline/test_hist2dplot_inputs_nobin.png index 076d6172..0b9cb46c 100644 Binary files a/tests/baseline/test_hist2dplot_inputs_nobin.png and b/tests/baseline/test_hist2dplot_inputs_nobin.png differ diff --git a/tests/baseline/test_histplot.png b/tests/baseline/test_histplot.png index 53be91bd..31a39bdb 100644 Binary files a/tests/baseline/test_histplot.png and b/tests/baseline/test_histplot.png differ diff --git a/tests/baseline/test_histplot_density.png b/tests/baseline/test_histplot_density.png index e28ea7e3..d5360b79 100644 Binary files a/tests/baseline/test_histplot_density.png and b/tests/baseline/test_histplot_density.png differ diff --git a/tests/baseline/test_histplot_flow.png b/tests/baseline/test_histplot_flow.png index 11971b38..e4d20fc7 100644 Binary files a/tests/baseline/test_histplot_flow.png and b/tests/baseline/test_histplot_flow.png differ diff --git a/tests/baseline/test_histplot_flow_stacked.png b/tests/baseline/test_histplot_flow_stacked.png new file mode 100644 index 00000000..11523d8e Binary files /dev/null and b/tests/baseline/test_histplot_flow_stacked.png differ diff --git a/tests/baseline/test_histplot_flow_unequal.png b/tests/baseline/test_histplot_flow_unequal.png new file mode 100644 index 00000000..875665f9 Binary files /dev/null and b/tests/baseline/test_histplot_flow_unequal.png differ diff --git a/tests/baseline/test_histplot_kwargs.png b/tests/baseline/test_histplot_kwargs.png index a54605db..dcbb5e51 100644 Binary files a/tests/baseline/test_histplot_kwargs.png and b/tests/baseline/test_histplot_kwargs.png differ diff --git a/tests/baseline/test_histplot_multiple.png b/tests/baseline/test_histplot_multiple.png index 0d4c8322..7562b9e0 100644 Binary files a/tests/baseline/test_histplot_multiple.png and b/tests/baseline/test_histplot_multiple.png differ diff --git a/tests/baseline/test_histplot_real.png b/tests/baseline/test_histplot_real.png index 783a35f1..079aaadc 100644 Binary files a/tests/baseline/test_histplot_real.png and b/tests/baseline/test_histplot_real.png differ diff --git a/tests/baseline/test_histplot_stack.png b/tests/baseline/test_histplot_stack.png index 1a902d3e..af1f4b93 100644 Binary files a/tests/baseline/test_histplot_stack.png and b/tests/baseline/test_histplot_stack.png differ diff --git a/tests/baseline/test_histplot_types.png b/tests/baseline/test_histplot_types.png index cd07d5d1..42f41ec0 100644 Binary files a/tests/baseline/test_histplot_types.png and b/tests/baseline/test_histplot_types.png differ diff --git a/tests/baseline/test_histplot_w2.png b/tests/baseline/test_histplot_w2.png index 4bd019c0..58f4f96f 100644 Binary files a/tests/baseline/test_histplot_w2.png and b/tests/baseline/test_histplot_w2.png differ diff --git a/tests/baseline/test_inputs_basic.png b/tests/baseline/test_inputs_basic.png index bdb91559..c9a029b4 100644 Binary files a/tests/baseline/test_inputs_basic.png and b/tests/baseline/test_inputs_basic.png differ diff --git a/tests/baseline/test_inputs_bh.png b/tests/baseline/test_inputs_bh.png index c7700654..f71cb724 100644 Binary files a/tests/baseline/test_inputs_bh.png and b/tests/baseline/test_inputs_bh.png differ diff --git a/tests/baseline/test_inputs_bh_cat.png b/tests/baseline/test_inputs_bh_cat.png index 9c6a72be..000494c9 100644 Binary files a/tests/baseline/test_inputs_bh_cat.png and b/tests/baseline/test_inputs_bh_cat.png differ diff --git a/tests/baseline/test_inputs_uproot.png b/tests/baseline/test_inputs_uproot.png index 4830d7fb..5b544d84 100644 Binary files a/tests/baseline/test_inputs_uproot.png and b/tests/baseline/test_inputs_uproot.png differ diff --git a/tests/baseline/test_label_loc.png b/tests/baseline/test_label_loc.png index 3ec48bd7..bceb6ebd 100644 Binary files a/tests/baseline/test_label_loc.png and b/tests/baseline/test_label_loc.png differ diff --git a/tests/baseline/test_labeltext_loc.png b/tests/baseline/test_labeltext_loc.png index 00dda305..96d77fd0 100644 Binary files a/tests/baseline/test_labeltext_loc.png and b/tests/baseline/test_labeltext_loc.png differ diff --git a/tests/baseline/test_log.png b/tests/baseline/test_log.png index 5654318d..3dc64ad0 100644 Binary files a/tests/baseline/test_log.png and b/tests/baseline/test_log.png differ diff --git a/tests/baseline/test_simple.png b/tests/baseline/test_simple.png index fc7e2692..286a3213 100644 Binary files a/tests/baseline/test_simple.png and b/tests/baseline/test_simple.png differ diff --git a/tests/baseline/test_simple2d.png b/tests/baseline/test_simple2d.png index 268bd16a..57d5fe52 100644 Binary files a/tests/baseline/test_simple2d.png and b/tests/baseline/test_simple2d.png differ diff --git a/tests/baseline/test_simple_xerr.png b/tests/baseline/test_simple_xerr.png index 58e6eeb6..6d913f34 100644 Binary files a/tests/baseline/test_simple_xerr.png and b/tests/baseline/test_simple_xerr.png differ diff --git a/tests/baseline/test_style_alice.png b/tests/baseline/test_style_alice.png index 30662d86..2ae81019 100644 Binary files a/tests/baseline/test_style_alice.png and b/tests/baseline/test_style_alice.png differ diff --git a/tests/baseline/test_style_atlas.png b/tests/baseline/test_style_atlas.png index 91b33e04..167f0971 100644 Binary files a/tests/baseline/test_style_atlas.png and b/tests/baseline/test_style_atlas.png differ diff --git a/tests/baseline/test_style_cms.png b/tests/baseline/test_style_cms.png index 76fa2ed7..47abb815 100644 Binary files a/tests/baseline/test_style_cms.png and b/tests/baseline/test_style_cms.png differ diff --git a/tests/baseline/test_style_lhcb.png b/tests/baseline/test_style_lhcb.png index 6f7c8f67..7485aa57 100644 Binary files a/tests/baseline/test_style_lhcb.png and b/tests/baseline/test_style_lhcb.png differ diff --git a/tests/baseline/test_style_lhcb2.png b/tests/baseline/test_style_lhcb2.png index 6dab473e..9200a542 100644 Binary files a/tests/baseline/test_style_lhcb2.png and b/tests/baseline/test_style_lhcb2.png differ diff --git a/tests/test_basic.py b/tests/test_basic.py index edd98232..fea0d583 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -132,6 +132,54 @@ def test_histplot_flow(): return fig +@pytest.mark.mpl_image_compare(style="default") +def test_histplot_flow_unequal(): + np.random.seed(0) + + h = hist.Hist( + hist.axis.Variable( + [5, 8, 8.1, 8.2, 8.3, 8.4, 8.5, 8.7, 9, 9.3, 10, 13, 14.5, 15], name="x" + ), + hist.storage.Weight(), + ) + h.fill(np.random.normal(10, 3, 400)) + fig, axs = plt.subplots(2, 2, sharex=True, sharey=True, figsize=(10, 10)) + axs = axs.flatten() + + hep.histplot(h, ax=axs[0], flow="hint") + hep.histplot(h, ax=axs[1], flow="None") + hep.histplot(h, ax=axs[2], flow="show") + hep.histplot(h, ax=axs[3], flow="sum") + + axs[0].set_title("Default", fontsize=18) + axs[1].set_title("None", fontsize=18) + axs[2].set_title("Show", fontsize=18) + axs[3].set_title("Sum", fontsize=18) + fig.subplots_adjust(hspace=0.1, wspace=0.1) + return fig + + +@pytest.mark.mpl_image_compare(style="default") +def test_histplot_flow_stacked(): + np.random.seed(0) + h = hist.Hist(hist.axis.Regular(20, 5, 15, name="x"), hist.storage.Weight()) + h.fill(np.random.normal(10, 3, 400)) + fig, axs = plt.subplots(2, 2, sharex=True, sharey=True, figsize=(10, 10)) + axs = axs.flatten() + + hep.histplot([h, h * 2], ax=axs[0], stack=True, flow="hint") + hep.histplot([h, h * 2], ax=axs[1], stack=True, flow="None") + hep.histplot([h, h * 2], ax=axs[2], stack=True, flow="show") + hep.histplot([h, h * 2], ax=axs[3], stack=True, flow="sum") + + axs[0].set_title("Default", fontsize=18) + axs[1].set_title("None", fontsize=18) + axs[2].set_title("Show", fontsize=18) + axs[3].set_title("Sum", fontsize=18) + fig.subplots_adjust(hspace=0.1, wspace=0.1) + return fig + + @pytest.mark.mpl_image_compare(style="default", remove_text=True) def test_histplot_multiple(): np.random.seed(0)