from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt from matplotlib.scale import Log10Transform, InvertedLog10Transform import numpy as np import io import platform import pytest @image_comparison(baseline_images=['log_scales'], remove_text=True) def test_log_scales(): ax = plt.figure().add_subplot(122, yscale='log', xscale='symlog') ax.axvline(24.1) ax.axhline(24.1) @image_comparison(baseline_images=['logit_scales'], remove_text=True, extensions=['png']) def test_logit_scales(): fig, ax = plt.subplots() # Typical extinction curve for logit x = np.array([0.001, 0.003, 0.01, 0.03, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.97, 0.99, 0.997, 0.999]) y = 1.0 / x ax.plot(x, y) ax.set_xscale('logit') ax.grid(True) bbox = ax.get_tightbbox(fig.canvas.get_renderer()) assert np.isfinite(bbox.x0) assert np.isfinite(bbox.y0) def test_log_scatter(): """Issue #1799""" fig, ax = plt.subplots(1) x = np.arange(10) y = np.arange(10) - 1 ax.scatter(x, y) buf = io.BytesIO() fig.savefig(buf, format='pdf') buf = io.BytesIO() fig.savefig(buf, format='eps') buf = io.BytesIO() fig.savefig(buf, format='svg') def test_logscale_subs(): fig, ax = plt.subplots() ax.set_yscale('log', subsy=np.array([2, 3, 4])) # force draw fig.canvas.draw() @image_comparison(baseline_images=['logscale_mask'], remove_text=True, extensions=['png']) def test_logscale_mask(): # Check that zero values are masked correctly on log scales. # See github issue 8045 xs = np.linspace(0, 50, 1001) fig, ax = plt.subplots() ax.plot(np.exp(-xs**2)) fig.canvas.draw() ax.set(yscale="log") def test_extra_kwargs_raise(): fig, ax = plt.subplots() with pytest.raises(ValueError): ax.set_yscale('log', nonpos='mask') def test_logscale_invert_transform(): fig, ax = plt.subplots() ax.set_yscale('log') # get transformation from data to axes tform = (ax.transAxes + ax.transData.inverted()).inverted() # direct test of log transform inversion assert isinstance(Log10Transform().inverted(), InvertedLog10Transform) def test_logscale_transform_repr(): # check that repr of log transform succeeds fig, ax = plt.subplots() ax.set_yscale('log') s = repr(ax.transData) # check that repr of log transform succeeds s = repr(Log10Transform(nonpos='clip')) @image_comparison(baseline_images=['logscale_nonpos_values'], remove_text=True, tol={'aarch64': 0.02}.get(platform.machine(), 0.0), extensions=['png'], style='mpl20') def test_logscale_nonpos_values(): np.random.seed(19680801) xs = np.random.normal(size=int(1e3)) fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2) ax1.hist(xs, range=(-5, 5), bins=10) ax1.set_yscale('log') ax2.hist(xs, range=(-5, 5), bins=10) ax2.set_yscale('log', nonposy='mask') xdata = np.arange(0, 10, 0.01) ydata = np.exp(-xdata) edata = 0.2*(10-xdata)*np.cos(5*xdata)*np.exp(-xdata) ax3.fill_between(xdata, ydata - edata, ydata + edata) ax3.set_yscale('log') x = np.logspace(-1, 1) y = x ** 3 yerr = x**2 ax4.errorbar(x, y, yerr=yerr) ax4.set_yscale('log') ax4.set_xscale('log') def test_invalid_log_lims(): # Check that invalid log scale limits are ignored fig, ax = plt.subplots() ax.scatter(range(0, 4), range(0, 4)) ax.set_xscale('log') original_xlim = ax.get_xlim() with pytest.warns(UserWarning): ax.set_xlim(left=0) assert ax.get_xlim() == original_xlim with pytest.warns(UserWarning): ax.set_xlim(right=-1) assert ax.get_xlim() == original_xlim ax.set_yscale('log') original_ylim = ax.get_ylim() with pytest.warns(UserWarning): ax.set_ylim(bottom=0) assert ax.get_ylim() == original_ylim with pytest.warns(UserWarning): ax.set_ylim(top=-1) assert ax.get_ylim() == original_ylim