You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			169 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Python
		
	
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.png'])
 | 
						|
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.png'])
 | 
						|
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.png'])
 | 
						|
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.png'])
 | 
						|
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))
 | 
						|
 | 
						|
 | 
						|
def test_arc_spine_inner_no_axis():
 | 
						|
    # Backcompat: smoke test that inner arc spine does not need a registered
 | 
						|
    # axis in order to be drawn
 | 
						|
    fig = plt.figure()
 | 
						|
    ax = fig.add_subplot(projection="polar")
 | 
						|
    inner_spine = ax.spines["inner"]
 | 
						|
    inner_spine.register_axis(None)
 | 
						|
    assert ax.spines["inner"].axis is None
 | 
						|
 | 
						|
    fig.draw_without_rendering()
 |