代码之家  ›  专栏  ›  技术社区  ›  ForceBru

如何更改matplotlib中记号之间的间距?

  •  32
  • ForceBru  · 技术社区  · 7 年前

    import pylab
    
    N = 100
    data = pylab.np.linspace(0, N, N)
    
    pylab.plot(data)
    
    pylab.xticks(range(N)) # add loads of ticks
    pylab.grid()
    pylab.tight_layout()
    pylab.show()
    
    pylab.close()
    

    结果图如下所示:

    plot

    如您所见,X轴很乱,因为刻度标签之间的间距太小,甚至 .

    我想在每个刻度标签之间自动创建恒定的空间,无论有多少个刻度。因此,我想增加单个刻度之间的间距,从而潜在地增加绘图的“长度”。

    长度可变的字符串 .

    到目前为止,我发现的都是关于 spacing between the axis and labels tick frequency (我已经可以做到)和 tick parameters (似乎没有任何间距选项)。

    matplotlib.pyplot.figure(figsize=(a, b)) ,但这需要知道刻度之间的默认间距(据我所知,没有)和刻度标签的最大宽度(以英寸为单位),我不知道如何测量,所以我认为这不是一个选项。

    4 回复  |  直到 7 年前
        1
  •  29
  •   ImportanceOfBeingErnest    7 年前

    为了确定标签不重叠所需的空间,可以找出最大的标签,并将其长度乘以标签数量。然后可以调整轴周围的边距,并将计算出的尺寸设置为新的图形尺寸。

    import numpy as np
    import matplotlib.pyplot as plt
    
    N = 150
    data = np.linspace(0, N, N)
    
    plt.plot(data)
    
    plt.xticks(range(N)) # add loads of ticks
    plt.grid()
    
    plt.gca().margins(x=0)
    plt.gcf().canvas.draw()
    tl = plt.gca().get_xticklabels()
    maxsize = max([t.get_window_extent().width for t in tl])
    m = 0.2 # inch margin
    s = maxsize/plt.gcf().dpi*N+2*m
    margin = m/plt.gcf().get_size_inches()[0]
    
    plt.gcf().subplots_adjust(left=margin, right=1.-margin)
    plt.gcf().set_size_inches(s, plt.gcf().get_size_inches()[1])
    
    plt.savefig(__file__+".png")
    plt.show()
    

    enter image description here

    Scrollbar on Matplotlib showing page

        2
  •  4
  •   seralouk    7 年前

    您可以使用以下方法旋转标签并缩小字体:

    ax.set_xticklabels(rotation = (45), fontsize = 10, va='bottom', ha='left')
    
        3
  •  3
  •   Levi Lesches    3 年前

    ticker.MaxNLocator (还有其他定位器)。无论缩放大小如何,它最多可以在图形上放置N个刻度。

        4
  •  0
  •   Fred    2 年前

    注意:如果你有大量的数据,这可能会变得非常困难

    import matplotlib.pyplot as plt
    import numpy as np
    
    # **************************************************************************
    # This plot shows inconsistent spacing between ticks
    # **************************************************************************
    f, test = plt.subplots()
    xdata = [0,1,5,6,9,10]
    ydata = [1,2,3,4,5,6]
    test.step(xdata,ydata)
    test.set_xticks([0,1,5,6,9,10],['Zero', 'one', 'five', 'six', 'nine', 'ten'])
    
    plt.show()
    
    # **************************************************************************
    # Adjust data so tick marks have consistent spacing
    # **************************************************************************
    prettyxdata = xdata
    for i in range(len(xdata)):
        if prettyxdata [i] == 5:
            prettyxdata [i]=2
        elif prettyxdata [i] == 6:
            prettyxdata [i]=3
        elif prettyxdata [i] == 9:
            prettyxdata [i]=4
        elif prettyxdata [i] == 10:
            prettyxdata [i]=5
    
    f, test = plt.subplots()
    test.step(prettyxdata,ydata)
    test.set_xticks([0,1,2,3,4,5],['Zero', 'one', 'five', 'six', 'nine', 'ten'])
    
    plt.show()