整数刻度标签matplotlib,没有原始刻度标签

时间:2016-03-27 12:35:21

标签: python matplotlib plot label axis-labels

我有代码(代码如下),它使用matplotlibnumpy来创建图表。我的情节有以下要求:

  1. 我希望轴有整数刻度。
  2. 轴标记不应有尾随零,因此例如不应有1.02.0,而是12
  3. x=0y=0的刻度应隐藏(原点滴答)。
  4. 我用这段代码实现了这个目标:

    import numpy
    import matplotlib.pyplot as plt
    import matplotlib as mp
    from matplotlib.ticker import FormatStrFormatter
    
    # approximately a circle
    x1 = [0.3, 1.0, 1.3, 1.3, 1.0, 0.3, -0.3, -1.0, -1.3, -1.3, -1.0, -0.3]
    y1 = [1.7, 1.2, 0.6, -0.2, -1.2, -1.5, -1.5, -1.2, -0.2, 0.6, 1.2, 1.7]
    
    number_of_values = 12
    x2 = numpy.random.uniform(low=-1.0, high=1.0, size=number_of_values)
    y2 = numpy.random.uniform(low=-1.0, high=1.0, size=number_of_values)
    
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    
    ax.scatter(x1, y1, s=100, color='#FF0000', linewidth='1.5', marker='x', label='$y=1$')
    ax.scatter(x2, y2, s=100, facecolors='none', edgecolors='#66AAAA', linewidth='1.5', marker='o', label='$y=0$')
    
    ax.legend(loc='upper right')
    ax.grid(True)
    
    # LIMITS
    x_lower_limit = min(x1) - 0.2 * max(x1)
    x_upper_limit = 1.2 * max(x1)
    ax.set_xlim(-2.0, 2.0)
    
    y_lower_limit = min(y1) - 0.2 * max(y1)
    y_upper_limit = 1.2 * max(y1)
    ax.set_ylim(-2.0, 2.0)
    
    # ORIGIN AXIS
    ax.spines['left'].set_position('center')
    ax.spines['right'].set_color('none')
    ax.spines['bottom'].set_position('center')
    ax.spines['top'].set_color('none')
    
    ax.spines['left'].set_smart_bounds(True)
    ax.spines['bottom'].set_smart_bounds(True)
    
    ax.xaxis.set_ticks_position('bottom')
    ax.yaxis.set_ticks_position('left')
    
    ax.set_xlabel('$x_1$', fontsize=14)#, x=0.9, y=1, labelpad=0.6)
    ax.set_ylabel('$x_2$', fontsize=14, rotation=0)#, x=1, y=0.9, labelpad=0.6)
    
    ax.xaxis.set_label_coords(1.04, 0.5)
    ax.yaxis.set_label_coords(0.5, 1.02)
    
    ax.set_xticks([-2.0, -1.0, 1.0, 2.0])
    ax.set_yticks([-2.0, -1.0, 1.0, 2.0])
    
    plt.title('Non-linear Decision Boundary', y=1.06)
    
    plt.show()
    

    然而,正如你所看到的,我正在硬编码那里的嘀嗒声 - 不好的做法。我想改进这种做法。到目前为止,我已尝试过其他方法,即以下SO帖子的解决方案:

    trimming trailing xtick zeros

    这里的问题是,它实际上甚至都不起作用。当我删除硬编码的ax.set_xticks([-2.0, -1.0, 1.0, 2.0])ax.set_yticks([-2.0, -1.0, 1.0, 2.0])时,这会使得图表在刻度线中显示0.5个步骤,并且它们有尾随零。

    modify tick labels text

    问题在于,如果我将tick标签更改为' '之类的内容,它仍会将其解释为0.0并呈现尾随零和非整数值。

    如何规避硬编码刻度标签的值?我想设置一些频率,如下所示:

    ax.xaxis.set_ticks_frequency(1.0)
    ax.xaxis.set_ticks_formatter(something with integer values only)
    

    这也可以避免迭代所有刻度标签。如果需要,迭代tick标签将是一个必要的恶,但我认为应该有一种没有这种迭代的方法。

1 个答案:

答案 0 :(得分:0)

您可以替换硬编码的刻度:

ax.set_xticks([-2.0, -1.0, 1.0, 2.0])
ax.set_yticks([-2.0, -1.0, 1.0, 2.0])

MultipleLocator,步长为1,自定义FuncFormatter(省略零):

import matplotlib.ticker as ticker
loc = ticker.MultipleLocator(1)
ax.xaxis.set_major_locator(loc)
ax.yaxis.set_major_locator(loc)
def fmt(x, pos):
    return '' if x == 0 else '{:.0f}'.format(x)
ax.xaxis.set_major_formatter(ticker.FuncFormatter(fmt))
ax.yaxis.set_major_formatter(ticker.FuncFormatter(fmt))

enter image description here