轴中不同位置的刻度和标签

Ped*_*roA 3 matplotlib python-3.x

我正在尝试制作一个图形,其中我希望有标签,并在 x 轴上打勾,但位置不同。然而,似乎在设置第一个刻度之后,当尝试定义新的刻度时,以前的刻度被“遗忘”。例如:

import matplotlib.pyplot as plt

xs = [1, 4, 7, 11, 14, 17, 20, 23, 26, 29]
ys = [2.0, 1.667, 2.0, 0.333, 1.0, 0.667, 1.667, 1.0, 1.0, 1.0]

# where we want our labels
ticks1 = [5.0, 15.0, 25.0]
labs = ['A', 'B', 'C']

fig, ax = plt.subplots()
ax.plot(xs, ys)

# I think I have to define ticks here to position the labels...
ax.set_xticks(ticks1)
ax.set_xticklabels(labs)

ax.tick_params(axis='x', length=0)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

到目前为止一切都很好,符合想要的安排。ABC用于标记不同组的数据点,它们或多或少位于每个组的中间(之后我将添加垂直线以使这种分离更加明显),但刻度线应该反映数据,而不是这些人工标签。

但是,如果我现在尝试向同一轴添加一组不同的刻度,上面绘制的标签将迁移到新的刻度,并且不会保留其旧位置:

# ...but want to have ticks for this range
ticks2 = [x for x in range(0, 33, 3)]
ax.set_xticks(ticks2)
ax.tick_params(axis='x', length=5)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

实现所需输出的正确方法是什么matplotlib

Imp*_*est 6

Matplotlib 轴通过定位器和格式化程序进行标记。定位器告诉轴在哪里放置刻度。格式化程序会在这些刻度处放置标签。

使用时,ax.set_xticks您正在创建一个FixedLocator,即一组要勾选的固定位置。
使用时ax.set_xticklabels,您正在创建一个FixedFormatter,即一组固定字符串,一个一个地放置在刻度上。

当您通过设置新的刻度时,ax.set_xticks(ticks2)您没有更改格式化程序。它仍然会使用列表中的字符串格式化前三个刻度。
这就是说:您还需要为更改后的情况设置新的刻度标签。

例如通过

ax.set_xticklabels(list("ABCDEFGHIJ"))
Run Code Online (Sandbox Code Playgroud)

现在,如果您想在标签以外的其他位置有刻度,这本质上意味着您需要两对定位器和格式化程序。

一对定位器-格式化程序将勾选 3 的倍数,并使用空字符串作为标签。另一对会勾选 5、15、25,并将其标签设置为 A、B、C。

import matplotlib.pyplot as plt

xs = [1, 4, 7, 11, 14, 17, 20, 23, 26, 29]
ys = [2.0, 1.667, 2.0, 0.333, 1.0, 0.667, 1.667, 1.0, 1.0, 1.0]

fig, ax = plt.subplots()
ax.plot(xs, ys)

# Major ticks
ticks2 = [x for x in range(0, 33, 3)]
ax.set_xticks(ticks2)
ax.set_xticklabels([])
ax.tick_params(axis='x', which="major", length=5)

# Minor ticks
ticks1 = [5.0, 15.0, 25.0]
labs = ['A', 'B', 'C']
ax.set_xticks(ticks1, minor=True)
ax.set_xticklabels(labs, minor=True)
ax.tick_params(axis='x', which="minor",length=0)


plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述