Search code examples
pythonmatplotlibaxes

Matplotlib spines/axes cut


Got this in my code with matplotlib library:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')

and it shows me :

I don't want this to happen!

I was expecting axes to cut! How to get cut axes?

Here's the full code:

import matplotlib.pyplot as plt

pgcd = lambda a, b: a if b==0 else pgcd(b, a%b)


def EKG(n):
    ekg = [1, 2]
    i = 2
    while i < n:
        j = 1
        while j in ekg or pgcd(j, ekg[i-1]) == 1:
            j += 1
        ekg.append(j)
        i += 1
    return ekg


supEKG = lambda n: sum(a>n for a in EKG(n))

arr = []
r = range(3, 100)
for n in r:
    arr.append(supEKG(n))


f = plt.figure()
ax = f.add_subplot(1,1,1)
ax.plot(r, arr)

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_position('zero')
ax.spines['left'].set_position('zero')

plt.show()

Solution

  • look at below sample, that will help you to get what you want.

    """
    Broken axis example, where the x-axis will have a portion cut out.
    """
    import matplotlib.pylab as plt
    import numpy as np
    
    x = np.linspace(0, 10, 100)
    x[75:] = np.linspace(40, 42.5, 25)
    
    y = np.sin(x)
    
    f, (ax, ax2) = plt.subplots(1, 2, sharey=True, facecolor='w')
    
    # plot the same data on both axes
    ax.plot(x, y)
    ax2.plot(x, y)
    
    ax.set_xlim(0, 7.5)
    ax2.set_xlim(40, 42.5)
    
    # hide the spines between ax and ax2
    ax.spines['right'].set_visible(False)
    ax2.spines['left'].set_visible(False)
    ax.yaxis.tick_left()
    ax.tick_params(labelright='off')
    ax2.yaxis.tick_right()
    
    # This looks pretty good, and was fairly painless, but you can get that
    # cut-out diagonal lines look with just a bit more work. The important
    # thing to know here is that in axes coordinates, which are always
    # between 0-1, spine endpoints are at these locations (0,0), (0,1),
    # (1,0), and (1,1).  Thus, we just need to put the diagonals in the
    # appropriate corners of each of our axes, and so long as we use the
    # right transform and disable clipping.
    
    d = .015  # how big to make the diagonal lines in axes coordinates
    # arguments to pass plot, just so we don't keep repeating them
    kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
    ax.plot((1 - d, 1 + d), (-d, +d), **kwargs)
    ax.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)
    
    kwargs.update(transform=ax2.transAxes)  # switch to the bottom axes
    ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs)
    ax2.plot((-d, +d), (-d, +d), **kwargs)
    
    # What's cool about this is that now if we vary the distance between
    # ax and ax2 via f.subplots_adjust(hspace=...) or plt.subplot_tool(),
    # the diagonal lines will move accordingly, and stay right at the tips
    # of the spines they are 'breaking'
    
    plt.show()
    

    this approach was in broken axes.