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

Posted

技术标签:

【中文标题】整数刻度标签 matplotlib,没有原点刻度标签【英文标题】:Integer tick labels matplotlib, no origin tick labels 【发布时间】:2016-03-27 12:35:21 【问题描述】:

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

    我希望坐标区具有整数刻度。 坐标轴刻度不应有尾随零,因此不应有任何1.02.0,而是12x=0y=0 的刻度应被隐藏(原始刻度)。

我已经用这段代码实现了这一点:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

使用步长为 1 的 MultipleLocator 和自定义 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))

【讨论】:

以上是关于整数刻度标签 matplotlib,没有原点刻度标签的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 子图——完全摆脱刻度标签

Matplotlib:季度小刻度标签

Matplotlib 使刻度标签字体变小

如何在 matplotlib 条形图上旋转 x 轴刻度标签?尝试了几种方法,都没有奏效

如何在 matplotlib 条形图上旋转 x 轴刻度标签?尝试了几种方法,都没有奏效

matlab - 在原点设置刻度标签