我正在尝试制作一个图形,在该图形中我希望在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()
到目前为止,按需要安排是好的。 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()
在matplotlib
中获得所需输出的正确方法是什么?
答案 0 :(得分:2)
Matplotlib轴通过定位器和格式化程序打勾。定位器告诉轴将刻度线放置在何处。格式化程序将标签贴在这些刻度上。
使用ax.set_xticks
时,您正在创建FixedLocator
,即要打勾的一组固定位置。
使用ax.set_xticklabels
时,您要创建一个FixedFormatter
,即一组固定的字符串,一个一个地放置在刻度线上。
通过ax.set_xticks(ticks2)
设置新的刻度时,您没有更改格式化程序。仍然会使用列表中的字符串格式化前三个刻度。
这就是说:您还需要为更改的大小写设置新的ticklabel。
例如通过
ax.set_xticklabels(list("ABCDEFGHIJ"))
现在,如果您想在标签以外的其他位置打勾,这实际上意味着您需要两对定位器和格式化程序。
一对定位符/格式化符会打勾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()