Python / Matplotlib-有没有办法制作不连续的轴?

发布于 2021-02-02 23:19:07

我正在尝试使用具有不连续x轴的pyplot创建一个图。通常的绘制方法是轴将具有以下内容:

(值)---- // ----(后值)

// //表示您正在跳过(值)和(后值)之间的所有内容。

我还没有找到任何这样的例子,所以我想知道是否有可能。我知道您可以在不连续的情况下加入数据,例如财务数据,但我想使轴上的跳跃更明确。目前,我只是在使用子图,但我真的很希望最终所有内容都在同一张图上。

关注者
0
被浏览
133
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    这只是此示例的简单修改,具有不连续的x轴而不是y轴。(这就是为什么我要将此帖子设为CW)

    基本上,你只需要执行以下操作:

    import matplotlib.pylab as plt
    import numpy as np
    
    # If you're not familiar with np.r_, don't worry too much about this. It's just 
    # a series with points from 0 to 1 spaced at 0.1, and 9 to 10 with the same spacing.
    x = np.r_[0:1:0.1, 9:10:0.1]
    y = np.sin(x)
    
    fig,(ax,ax2) = plt.subplots(1, 2, sharey=True)
    
    # plot the same data on both axes
    ax.plot(x, y, 'bo')
    ax2.plot(x, y, 'bo')
    
    # zoom-in / limit the view to different portions of the data
    ax.set_xlim(0,1) # most of the data
    ax2.set_xlim(9,10) # outliers only
    
    # 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(labeltop='off') # don't put tick labels at the top
    ax2.yaxis.tick_right()
    
    # Make the spacing between the two axes a bit smaller
    plt.subplots_adjust(wspace=0.15)
    
    plt.show()
    

    要添加折断的轴线//效果,我们可以这样做(同样,从Paul Ivanov的示例进行了修改):

    import matplotlib.pylab as plt
    import numpy as np
    
    # If you're not familiar with np.r_, don't worry too much about this. It's just 
    # a series with points from 0 to 1 spaced at 0.1, and 9 to 10 with the same spacing.
    x = np.r_[0:1:0.1, 9:10:0.1]
    y = np.sin(x)
    
    fig,(ax,ax2) = plt.subplots(1, 2, sharey=True)
    
    # plot the same data on both axes
    ax.plot(x, y, 'bo')
    ax2.plot(x, y, 'bo')
    
    # zoom-in / limit the view to different portions of the data
    ax.set_xlim(0,1) # most of the data
    ax2.set_xlim(9,10) # outliers only
    
    # 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(labeltop='off') # don't put tick labels at the top
    ax2.yaxis.tick_right()
    
    # Make the spacing between the two axes a bit smaller
    plt.subplots_adjust(wspace=0.15)
    
    # 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) # top-left diagonal
    ax.plot((1-d,1+d),(1-d,1+d), **kwargs) # bottom-left diagonal
    
    kwargs.update(transform=ax2.transAxes) # switch to the bottom axes
    ax2.plot((-d,d),(-d,+d), **kwargs) # top-right diagonal
    ax2.plot((-d,d),(1-d,1+d), **kwargs) # bottom-right diagonal
    
    # 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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看