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
8 changes: 6 additions & 2 deletions sarracen/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,15 +313,19 @@ def render(data: 'SarracenDataFrame', # noqa: F821
kwargs.setdefault("origin", 'lower')
kwargs.setdefault("extent", [xlim[0], xlim[1], ylim[0], ylim[1]])
if log_scale:
# By default, a log scale plot will only cover 4 levels of magnitude.
vminref = 10 ** (np.log10(kwargs.get("vmax", img.max())) - 4)
vmin = kwargs.get('vmin', max(vminref, img.min()))

if symlog_scale:
kwargs.setdefault("norm",
SymLogNorm(kwargs.pop("linthresh", 1e-9),
linscale=kwargs.pop("linscale", 1.),
vmin=kwargs.get('vmin'),
vmin=vmin,
vmax=kwargs.get('vmax')))
else:
kwargs.setdefault("norm", LogNorm(clip=True,
vmin=kwargs.get('vmin'),
vmin=vmin,
vmax=kwargs.get('vmax')))
kwargs.pop("vmin", None)
kwargs.pop("vmax", None)
Expand Down
42 changes: 42 additions & 0 deletions sarracen/tests/test_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
from numpy.testing import assert_array_equal
from pytest import mark

import numpy as np

from sarracen import SarracenDataFrame
from sarracen import interpolate_2d, interpolate_2d_line
from sarracen import interpolate_3d_proj, interpolate_3d_cross
Expand Down Expand Up @@ -342,3 +344,43 @@ def test_plot_bounds(backend):
assert ax.get_xlim() == (3, 6)
assert ax.get_ylim() == (1, 5)
plt.close(fig)


@mark.parametrize("backend", backends)
def test_log_vmin(backend):
"""
Verify that the vmin value of log scales are set properly.
"""
data = {'x': [6, 3, 2], 'y': [5, 1, 2], 'z': [3, 4, 2], 'P': [1, 1, 1],
'h': [1, 1, 1], 'rho': [1e10, 1e7, 1e4], 'm': [1, 1, 1]}
sdf = SarracenDataFrame(data)
sdf.backend = backend

# With no bounds defined, the log scale should cover 4 orders of magnitude.
interpolate = interpolate_3d_proj(sdf, 'rho')
fig, ax = plt.subplots()
render(sdf, "rho", ax=ax, log_scale=True, x_pixels=20)

imgs = ax.get_images()
vmin, vmax = imgs[0].get_clim()

assert vmin == 10 ** (np.log10(interpolate.max()) - 4)
assert vmax == interpolate.max()

# With only vmax defined, the vmin value is scaled accordingly.
fig, ax = plt.subplots()
render(sdf, "rho", vmax=10, log_scale=True, x_pixels=20)
imgs = ax.get_images()
vmin, vmax = imgs[0].get_clim()

assert vmin == 1e-3
assert vmax == 10

# With both bounds defined, no adjustment is made.
fig, ax = plt.subplots()
render(sdf, "rho", vmin=5, vmax=10, log_scale=True, x_pixels=20)
imgs = ax.get_images()
vmin, vmax = imgs[0].get_clim()

assert vmin == 5
assert vmax == 10