123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- import numpy as np
- import pytest
- import matplotlib.pyplot as plt
- from matplotlib.spines import Spines
- from matplotlib.testing.decorators import check_figures_equal, image_comparison
- def test_spine_class():
- """Test Spines and SpinesProxy in isolation."""
- class SpineMock:
- def __init__(self):
- self.val = None
- def set(self, **kwargs):
- vars(self).update(kwargs)
- def set_val(self, val):
- self.val = val
- spines_dict = {
- 'left': SpineMock(),
- 'right': SpineMock(),
- 'top': SpineMock(),
- 'bottom': SpineMock(),
- }
- spines = Spines(**spines_dict)
- assert spines['left'] is spines_dict['left']
- assert spines.left is spines_dict['left']
- spines[['left', 'right']].set_val('x')
- assert spines.left.val == 'x'
- assert spines.right.val == 'x'
- assert spines.top.val is None
- assert spines.bottom.val is None
- spines[:].set_val('y')
- assert all(spine.val == 'y' for spine in spines.values())
- spines[:].set(foo='bar')
- assert all(spine.foo == 'bar' for spine in spines.values())
- with pytest.raises(AttributeError, match='foo'):
- spines.foo
- with pytest.raises(KeyError, match='foo'):
- spines['foo']
- with pytest.raises(KeyError, match='foo, bar'):
- spines[['left', 'foo', 'right', 'bar']]
- with pytest.raises(ValueError, match='single list'):
- spines['left', 'right']
- with pytest.raises(ValueError, match='Spines does not support slicing'):
- spines['left':'right']
- with pytest.raises(ValueError, match='Spines does not support slicing'):
- spines['top':]
- @image_comparison(['spines_axes_positions'])
- def test_spines_axes_positions():
- # SF bug 2852168
- fig = plt.figure()
- x = np.linspace(0, 2*np.pi, 100)
- y = 2*np.sin(x)
- ax = fig.add_subplot(1, 1, 1)
- ax.set_title('centered spines')
- ax.plot(x, y)
- ax.spines.right.set_position(('axes', 0.1))
- ax.yaxis.set_ticks_position('right')
- ax.spines.top.set_position(('axes', 0.25))
- ax.xaxis.set_ticks_position('top')
- ax.spines.left.set_color('none')
- ax.spines.bottom.set_color('none')
- @image_comparison(['spines_data_positions'])
- def test_spines_data_positions():
- fig, ax = plt.subplots()
- ax.spines.left.set_position(('data', -1.5))
- ax.spines.top.set_position(('data', 0.5))
- ax.spines.right.set_position(('data', -0.5))
- ax.spines.bottom.set_position('zero')
- ax.set_xlim([-2, 2])
- ax.set_ylim([-2, 2])
- @check_figures_equal(extensions=["png"])
- def test_spine_nonlinear_data_positions(fig_test, fig_ref):
- plt.style.use("default")
- ax = fig_test.add_subplot()
- ax.set(xscale="log", xlim=(.1, 1))
- # Use position="data" to visually swap the left and right spines, using
- # linewidth to distinguish them. The calls to tick_params removes labels
- # (for image comparison purposes) and harmonizes tick positions with the
- # reference).
- ax.spines.left.set_position(("data", 1))
- ax.spines.left.set_linewidth(2)
- ax.spines.right.set_position(("data", .1))
- ax.tick_params(axis="y", labelleft=False, direction="in")
- ax = fig_ref.add_subplot()
- ax.set(xscale="log", xlim=(.1, 1))
- ax.spines.right.set_linewidth(2)
- ax.tick_params(axis="y", labelleft=False, left=False, right=True)
- @image_comparison(['spines_capstyle'])
- def test_spines_capstyle():
- # issue 2542
- plt.rc('axes', linewidth=20)
- fig, ax = plt.subplots()
- ax.set_xticks([])
- ax.set_yticks([])
- def test_label_without_ticks():
- fig, ax = plt.subplots()
- plt.subplots_adjust(left=0.3, bottom=0.3)
- ax.plot(np.arange(10))
- ax.yaxis.set_ticks_position('left')
- ax.spines.left.set_position(('outward', 30))
- ax.spines.right.set_visible(False)
- ax.set_ylabel('y label')
- ax.xaxis.set_ticks_position('bottom')
- ax.spines.bottom.set_position(('outward', 30))
- ax.spines.top.set_visible(False)
- ax.set_xlabel('x label')
- ax.xaxis.set_ticks([])
- ax.yaxis.set_ticks([])
- plt.draw()
- spine = ax.spines.left
- spinebbox = spine.get_transform().transform_path(
- spine.get_path()).get_extents()
- assert ax.yaxis.label.get_position()[0] < spinebbox.xmin, \
- "Y-Axis label not left of the spine"
- spine = ax.spines.bottom
- spinebbox = spine.get_transform().transform_path(
- spine.get_path()).get_extents()
- assert ax.xaxis.label.get_position()[1] < spinebbox.ymin, \
- "X-Axis label not below the spine"
- @image_comparison(['black_axes'])
- def test_spines_black_axes():
- # GitHub #18804
- plt.rcParams["savefig.pad_inches"] = 0
- plt.rcParams["savefig.bbox"] = 'tight'
- fig = plt.figure(0, figsize=(4, 4))
- ax = fig.add_axes((0, 0, 1, 1))
- ax.set_xticklabels([])
- ax.set_yticklabels([])
- ax.set_xticks([])
- ax.set_yticks([])
- ax.set_facecolor((0, 0, 0))
|