How to unset `sharex` or `sharey` from two axes in Matplotlib

后端 未结 3 1331
迷失自我
迷失自我 2020-12-17 01:21

I have a series of subplots, and I want them to share x and y axis in all but 2 subplots (on a per-row basis).

I know that it is possible to create all subplots sepa

3条回答
  •  时光取名叫无心
    2020-12-17 01:58

    As @zan points out in the their answer, you can use ax.get_shared_x_axes() to obtain a Grouper object that contains all the linked axes, and then .remove any axes from this Grouper. The problem is (as @WMiller points out) that the ticker is still the same for all axes.

    So one will need to

    1. remove the axes from the grouper
    2. set a new Ticker with the respective new locator and formatter

    Complete example

    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
    
    fig, axes = plt.subplots(3, 4, sharex='row', sharey='row', squeeze=False)
    
    data = np.random.rand(20, 2, 10)
    
    for ax in axes.flatten()[:-1]:
        ax.plot(*np.random.randn(2,10), marker="o", ls="")
    
    
    
    # Now remove axes[1,5] from the grouper for xaxis
    axes[2,3].get_shared_x_axes().remove(axes[2,3])
    
    # Create and assign new ticker
    xticker = matplotlib.axis.Ticker()
    axes[2,3].xaxis.major = xticker
    
    # The new ticker needs new locator and formatters
    xloc = matplotlib.ticker.AutoLocator()
    xfmt = matplotlib.ticker.ScalarFormatter()
    
    axes[2,3].xaxis.set_major_locator(xloc)
    axes[2,3].xaxis.set_major_formatter(xfmt)
    
    # Now plot to the "ungrouped" axes
    axes[2,3].plot(np.random.randn(10)*100+100, np.linspace(-3,3,10), 
                    marker="o", ls="", color="red")
    
    plt.show()
    

    Note that in the above I only changed the ticker for the x axis and also only for the major ticks. You would need to do the same for the y axis and also for minor ticks in case it's needed.

提交回复
热议问题