Matplotlib - fixing x axis scale and autoscale y axis

前端 未结 3 1777
时光说笑
时光说笑 2020-12-01 13:59

I would like to plot only part of the array, fixing x part, but letting y part autoscale. I tried as shown below, but it does not work.

Any suggestions?

<         


        
3条回答
  •  天涯浪人
    2020-12-01 14:37

    While Joe Kington certainly proposes the most sensible answer when he recommends that only the necessary data be plotted, there are situations where it would be best to plot all of the data and just zoom to a certain section. Additionally, it would be nice to have an "autoscale_y" function that only requires the axes object (i.e., unlike the answer here, which requires direct use of the data.)

    Here is a function that just rescales the y-axis based on the data that is in the visible x-region:

    def autoscale_y(ax,margin=0.1):
        """This function rescales the y-axis based on the data that is visible given the current xlim of the axis.
        ax -- a matplotlib axes object
        margin -- the fraction of the total height of the y-data to pad the upper and lower ylims"""
    
        import numpy as np
    
        def get_bottom_top(line):
            xd = line.get_xdata()
            yd = line.get_ydata()
            lo,hi = ax.get_xlim()
            y_displayed = yd[((xd>lo) & (xd top: top = new_top
    
        ax.set_ylim(bot,top)
    

    This is something of a hack, and will probably not work in many situations, but for a simple plot, it works well.

    Here is a simple example using this function:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(-100,100,1000)
    y = x**2 + np.cos(x)*100
    
    fig,axs = plt.subplots(1,2,figsize=(8,5))
    
    for ax in axs:
        ax.plot(x,y)
        ax.plot(x,y*2)
        ax.plot(x,y*10)
        ax.set_xlim(-10,10)
    
    autoscale_y(axs[1])
    
    axs[0].set_title('Rescaled x-axis')
    axs[1].set_title('Rescaled x-axis\nand used "autoscale_y"')
    
    plt.show()
    

提交回复
热议问题